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

我们看到这是一个修改密码的页面:

1-1.png

我们尝试输入密码test,并提交:

1-2.png

我们去测试一下,输入账号admin,密码test,能校验通过。我们抬头看一看 URL,修改密码的参数是通过 GET 请求 URL 传参的,我们尝试在 URL 修改密码为test123

  1. http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?password_new=test123&password_conf=test123&Change=Change#

1-3.png

这时候再验证用户名admin,密码test就会报错:

1-4.png

这种情况相当于黑客给你发了某个钓鱼链接,比如上面那个 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 应用程序,这样它才能被信任。

2-1.png

在源代码中,如果HTTP_REFERER中包含SERVER_NAME,则继续下面的流程,否则报错退出。

如果我们直接去修改密码是无法成功的,因为 HTTP 请求不在服务端发起,所以HTTP_REFERER中不会包含SERVER_NAME

2-2.png

我们用 Brupsuite 抓包,把请求发送到 Repeater。我们已知当前服务器名字为localhost

2-3.png

于是我们修改Referer: locahost,再发送能修改密码成功:

2-4.png

更通用的,如果后端代码验证了 Referer 字段的值是否包含网站域名,那么可以使用域名创建子域名尝试绕过。比如申请一个域名:MrBanana.com,我们创建一个子域名:subdomain1.MrBanana.com


本题绕过验证的另一个方法是用存储型 XSS 漏洞,我们先修改难度为 Low,然后进入 XSS(Stored) 页面:

2-5.png

在 Message 框中按右键,点击 Inspect,修改 textarea 最大长度,然后添加消息:

<img src="/dvwa/vulnerabilities/csrf/?password_new=test123&password_conf=test123&Change=Change">

提交完后,观察 Brupsuite:

2-6.png

第 311 号 POST 请求是我们传递了恶意代码的评论,第 312 号 GET 请求是你浏览到该评论后,自动执行的。

现在我们把难度切换到 Medium,再回到 CSRF 页面,可以发现我们刚才通过 XSS 漏洞修改的密码已经成功。

003 High

在该等级中,开发者新增了一个 Anti Cross-Site Request Forgery(CSRF) Token。每次修改密码服务器会通过generateSessionToken()随机生成一个 token,只有客户端提交的 token 参数与服务器端一致时,服务器端才会处理客户端的响应。

我们第一步先把密码修改为password

3-1.png

然后把 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]

3-2.png

然后把上面 URL 中user_token的值给替换掉,密码也改成test

http://hyperv-win10.me/dvwa/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change&user_token=39b84b865215cee3411af077b242c71c#

然后让受害者点击这个神奇的链接:

3-3.png

Bingo!成功在用户不知情下修改密码!

References