CSRF攻击是由用户端发起请求,攻击者利用用户的Cookie信息伪造用户请求发送至服务器。这种攻击不是出自用户之手,而是通过第三方恶意攻击者的处理,伪装成受信任用户的行为。CSRF攻击的目的是获取用户cookie等信息,以达到身份伪装的目的。
csrf漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录那以后只要是访问这个网站,都会默认你已经登录的状态。而在这个期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,可能会执行一些用户不想做的功能(比如是添加账号等)。这个操作不是用户真正想要执行的。
防御CSRF的方法包括:
-
验证HTTP请求的Referer头部,以确保请求是从可信的源发起;
-
使用SameSite Cookie属性,限制Cookie在跨站请求中的发送;
-
在Ajax请求中使用自定义HTTP头,增加安全性;
-
避免GET请求进行状态改变,对于任何改变状态的操作,应使用POST请求而不是GET请求。
根据请求分为了:get类型csrf,post类型csrf
1. GET型csrf
GET类型的CSRF利用非常简单,只需要一个
HTTP请求,一般会这样利用:
<img
src="http://bank.example/withdraw?amount=10000&for=hacker">
2.POST型csrf
这种类型的CSRF利用起来通常使用的是一个自
动提交的表单,如:
<form action="http://bank.example/withdraw" method=POST>
<input type="hidden" name="account" value="xiaoming" />//name为参数 value为参数的值
<input type="hidden" name="amount" value="10000" />
<input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>//自动提交表单
如何测试csrf漏洞
手工测试
若本次操作中存在csrf token参数,或存在验证码等防御行为,则不存在csrf漏洞。若将数据包中的referer字段去掉,或仅仅删除referer字段的值,重新发送得到服务器的正确受理,那么可认为存在csrf漏洞。简单来说就是在抓包时删掉字段还能运行就有CSRF漏洞
漏洞复现
先用BP抓包,右键点击生成CSRFpoc
建新文件将poc复制然后打开网页
点击之后发生改变了