游客发表
抓包工具开着,手工渗透浏览器里登录着目标站点的操作管理员账号,另一个浏览器窗口里藏着攻击页面——这就是手工渗透CSRF手工测试的起手式。别急着找扫描器,操作先弄明白一个核心逻辑:CSRF的手工渗透本质是“借刀杀人”,服务器只认Cookie不认人,操作你只要能让目标浏览器带着认证信息去请求一个构造好的手工渗透URL,事情就成了。操作
拿个真实场景说事。手工渗透假设目标站有个修改邮箱的操作功能,请求长这样:POST /user/email,手工渗透参数是操作new_email=attacker@evil.com。你用自己的手工渗透普通账号登录,把这个请求原封不动地抄下来。操作然后构造一个恶意页面,手工渗透里面放个自动提交的表单,或者干脆就是个标签指向那个URL——但
只能发GET请求,所以多数情况你得用表单加JavaScript自动提交。
关键点来了,手工测试和自动化工具最大的区别在于“上下文理解”。你得先摸清目标站点的Token机制。很多程序员喜欢把Token放在Cookie里而不是请求参数里,或者放在自定义Header里。如果你发现修改密码的请求里有个csrf_token=abc123,而这个Token是每次刷新页面都变的,那基本可以判定这站有防护。但别急着放弃——试试看Token是否绑定Session,有些站点的Token是全局固定的,或者只校验Token存在不校验是否匹配当前用户。这种时候,你完全可以从自己账号里拿个有效Token塞进攻击URL里。
再讲个野路子。有些站点把Token放在URL的query参数里,但校验逻辑写得稀烂——比如只比对Token的前几位,或者压根没校验,只是前端弹个提示。你手工测试时,直接把Token参数删了发请求,看服务器返回什么。如果返回200且操作成功,恭喜,这站就是裸奔状态。我遇到过最离谱的案例是某后台管理系统的“删除用户”接口,整个请求就一个user_id参数,连Referer都不查——你只需要诱导管理员访问一个恶意页面,页面里自动发个POST请求删除任意用户,完事。
实操步骤其实就三板斧。第一板斧:用Burp Suite拦截正常操作,把请求完整记录下来,特别注意Cookie、Referer、Token这几个字段。第二板斧:构造攻击页面,优先用表单自动提交的方法,因为POST请求覆盖范围更广。页面代码就几行:<form action="http://target.com/user/email" method="POST"><input name="new_email" value="hacker@test.com"></form><script>document.forms[0].submit()</script>。第三板斧:把攻击页面放到你自己的服务器上,或者直接用file://协议打开,然后诱导目标浏览器访问——这里有个技巧,如果目标站有CORS限制或者SameSite=Lax的Cookie策略,你得换个思路,比如找同域下的上传点放个HTML文件,这叫“同域CSRF”,很多扫描器根本测不出来。
手工测试最容易被忽略的是“登录状态保持”这个细节。你得确认目标浏览器的Cookie是Session Cookie还是持久Cookie,如果是前者,攻击页面必须在目标用户登录有效期内触发。还有,如果目标站开启了HTTP Only标志,你没法用JavaScript读取Cookie,但这恰恰是好事——因为攻击者同样读不到,CSRF攻击本来也不需要读取Cookie,只要浏览器自动带上就行。
最后说个判断技巧。手工测试时别光看响应码,重点看操作是否真的生效。比如你试着把邮箱改成自己的测试地址,然后去登录页点“找回密码”,如果收到了重置邮件,那漏洞就是实锤。有些站点响应返回200但实际没执行,那是后端做了二次校验。这种时候换一种攻击方式——比如把Content-Type从application/x-www-form-urlencoded改成application/json,有些框架会走不同的处理逻辑,绕过校验。CSRF这玩意儿,说穿了就是跟开发者的懒癌作斗争,他们少写一行校验代码,你就多一个突破口。
友情链接