About
CSRF(Cross Site Request Forgery),中文是跨站点请求伪造。CSRF 攻击者在用户已经
登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在
攻击页面对目标网站发起伪造用户操作的请求,比如以你的名义发送邮件、发消息,盗取你的
账号,添加系统管理员,甚至于购买商品、虚拟货币转账等,达到攻击目的。
CSRF 与 XSS 最大的区别就在于,CSRF 并没有盗取 cookie 而是直接利用。
高级利用:
1、CSRF 绑定手机号、邮箱、第三方平台。这样就可以登录受害者账号
2、CSRF 修改密码(没有验证旧密码)
3、构造好 CSRF 后,不一定非要把 CSRF 链接发送给受害者,如果把 CSRF 链接放在XSS、
图片地址(头像,文章图片:只要加载了该链接),那么就造成蠕虫攻击,可以大
范围攻击。
防御方式:
1、验证请求头中的HTTP Referer 字段
2、在请求地址中添加 token 并验证
3、在 HTTP Header 中自定义属性并验证
4、验证码
Object
您的任务是使用 CSRF 攻击,让当前用户在不知道其行为的情况下更改自己的密码。
001 Low
我们看到这是一个修改密码的页面:
我们尝试输入密码test
,并提交:
我们去测试一下,输入账号admin
,密码test
,能校验通过。我们抬头看一看 URL,修改密码的参数是通过 GET 请求 URL 传参的,我们尝试在 URL 修改密码为test123
:
http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?password_new=test123&password_conf=test123&Change=Change#
这时候再验证用户名admin
,密码test
就会报错:
这种情况相当于黑客给你发了某个钓鱼链接,比如上面那个 URL 被编码:
http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?%70%61%73%73%77%6f%72%64%5f%6e%65%77=%74%65%73%74%31%32%33&%70%61%73%73%77%6f%72%64%5f%63%6f%6e%66=%74%65%73%74%31%32%33&%43%68%61%6e%67%65=%43%68%61%6e%67%65#
你很好奇,想知道点进去会怎样,结果一进去密码就会在不知道的情况下被修改。
002 Medium
在该等级中,有一个检查来查看最后请求的页面来自哪里。开发人员认为,如果它与当前域匹配,那么它必须来自 web 应用程序,这样它才能被信任。
在源代码中,如果HTTP_REFERER
中包含SERVER_NAME
,则继续下面的流程,否则报错退出。
如果我们直接去修改密码是无法成功的,因为 HTTP 请求不在服务端发起,所以HTTP_REFERER
中不会包含SERVER_NAME
:
我们用 Brupsuite 抓包,把请求发送到 Repeater。我们已知当前服务器名字为localhost
:
于是我们修改Referer: locahost
,再发送能修改密码成功:
更通用的,如果后端代码验证了 Referer 字段的值是否包含网站域名,那么可以使用域名创建子域名尝试绕过。比如申请一个域名:MrBanana.com
,我们创建一个子域名:subdomain1.MrBanana.com
。
本题绕过验证的另一个方法是用存储型 XSS 漏洞,我们先修改难度为 Low,然后进入 XSS(Stored) 页面:
在 Message 框中按右键,点击 Inspect,修改 textarea 最大长度,然后添加消息:
<img src="/dvwa/vulnerabilities/csrf/?password_new=test123&password_conf=test123&Change=Change">
提交完后,观察 Brupsuite:
第 311 号 POST 请求是我们传递了恶意代码的评论,第 312 号 GET 请求是你浏览到该评论后,自动执行的。
现在我们把难度切换到 Medium,再回到 CSRF 页面,可以发现我们刚才通过 XSS 漏洞修改的密码已经成功。
003 High
在该等级中,开发者新增了一个 Anti Cross-Site Request Forgery(CSRF) Token。每次修改密码服务器会通过generateSessionToken()
随机生成一个 token,只有客户端提交的 token 参数与服务器端一致时,服务器端才会处理客户端的响应。
我们第一步先把密码修改为password
:
然后把 URL 复制下来:
http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change&user_token=3b8b43fe0726d074663f96a92c1262a6#
可以发现这里的 URL 是包含user_token
变量的。我们刷新页面,然后按 F12 在 Console 中输入:document.getElementByName("user_token")[0]
。
然后把上面 URL 中user_token
的值给替换掉,密码也改成test
:
http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change&user_token=39b84b865215cee3411af077b242c71c#
然后让受害者点击这个神奇的链接:
Bingo!成功在用户不知情下修改密码!