转载自:https://mp.weixin.qq.com/s/IR-GPGVcaKKm5XXslr0NgA

CSRF漏洞是什么:

目标用户使用其用户名和密码登录受信任站点,从而创建了一个新的会话,受信任站点则会为目标用户Web浏览器Cookie中的会话信息存储了会话标示符。测试者往Web应用页面中插入恶意的HTML链接或脚本代码,而目标页面又没有过滤或者过滤不严,那么当用户浏览该页面时,用户的Web浏览器将被操纵向受信任站点发送一个恶意请求,比如删除帖子、添加管理员、添加邮件转发规则、改变路由器的DNS设置等。Web浏览器将会为这个恶意请求自动附加会话Cookie信息,因为是访问的受信任站点,因此该恶意请求将会成功完成。

CSRF漏洞原理:

网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态,假如某网站对用户的一些操作(比如删除帖子,添加管理员等)没有做除了cookie之外的其它验证,那么在此期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,诱使用户去点击可能会执行一些用户不想做的功能.

CSRF漏洞原理图:

图片

与XSS相比

1
2
XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等
CSRF:利用站点对已经身份认证的用户的信任,攻击者伪造一个链接误导用户点击链接来使用用户的身份认证来访问服务器

利用CSRF漏洞的前提条件

1
2
3
(1) 受害者登录受信任网站A,并在本地生成Cookie
(2) 受害者在不登出网站A的情况下访问恶意网站B
(3) 猜到所有表单或者URL参数中的值

CSRF漏洞的分类

  • GET型的CSRF:

假如有这样一个场景,用户登陆后添加管理员账户,正常请求为

1
http://www.***.com/useradd.php?user=test&pwd=123.com

但是因为服务端没有做除了cookie之外的校验,那么攻击者可以构造

1
<img src="http://www.***.com/useradd.php?user=hacker&pwd=123.com">

包含该代码代码的一个页面,诱使受害者去点击,当受害者点击之后就会在受害者不知情的情况下添加一个账号为hacker,密码为123.com的管理员账户

小技巧:如果请求url太长,可以制作成短链接

  • POST型的CSRF:

假设有这样一个场景,用户A给用户B去转账,正常请求为

1
2
3
4
POST /give_money.php HTTP/1.1
Host: 192.168.1.123

user=zhangsan&money=100

所做的操作为用户A给张三转账100元,攻击者可以构造一个自动提交的form表单

1
2
3
4
5
<form action="http://192.168.1.123/give_money.php"method=POST>
<input type="hidden" name="user" value="hacker" />
<input type="hidden" name="money" value="100">
</form>
<script> document.forms[0].submit(); </script>

受害者访问该页面后,表单会自动提交,相当于模拟用户完成了post操作,当受害者点击了该页面后,就会受害者不知情的情况下给hacker转账100元.

生成CSRF漏洞POC

我们自己不想写的时候,可以利用burp直接生成CSRF漏洞POC

图片

即可以帮我们生成CSRF的html

图片

造成CSRF漏洞的原因

1
2
1.请求所有的参数均可确定
2.请求的审核不严格,比如只验证了cookie

CSRF漏洞的检测

最简单的办法就是使用burp抓取一个正常的请求包,然后发送到repeti模块,去掉数据包中的Referer字段,看请求能否正常执行,如果可以正常执行,则有可能存在CSRF漏洞

CSRF漏洞存在的位置:

1
2
3
4
5
6
1.评论处
2.订阅处
3.资料修改处
4.密码更改处
5.管理员添加处
6.删除用户或者信息处

针对CSRF漏洞探测的工具:

1
2
1.CSRFTester       
2.burp中的插件

CSRF漏洞造成的危害

1
2
3
4
1.篡改目标网站上的用户数据信息;
2.盗取用户隐私数据;
3.配合XSS漏洞造成更大危害;
4.传播CSRF蠕虫。

CSRF漏洞的防御:

1.尽可能的使用POST请求

GET接口太容易被拿来做CSRF攻击,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,降低攻击风险。当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性

2.添加验证码(对用户体验不太好)

虽然增加验证码能够很好遏制CSRF攻击,但是增加验证码降低了用户的体验,所以网站不可能给所有的操作都加上验证码,所以只能将验证码作为一种辅助的手段,在关键业务点设置验证码;

3.验证Referer(效果不太高)

但是这种办法的有效性不高,第一,可以抓包修改该字段;第二,在https跳转到http的情况下,浏览器出于安全考虑,不会发送referer,服务器就无法进行检查了,而且如果该网站同域的其他网站有XSS漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。所以说有效性不高。(不靠谱的原因是服务器并不是随时都能获得Referer,只能监控是否发生,并且不能防范统一域上的CSRF攻击)

4.添加token,对token进行验证

也就是发送请求时在HTTP请求中以参数的形式加入一个随机产生的token(一次性随机值),并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域Cookie中这个token值,会进行校验该请求当中的token和Cookie当中的token值是否都存在且相等,当判断出存在且相等才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。

5.请求做二次确认

比如黑客用CSRF让你转账,但是这个时候提示你——是否转账?,或者让你输入验证码什么的,提醒你的误操作,就可以有效防止CSRF

XSS与CSRF的组合拳

如果一个网站同时存在xss与csrf漏洞,那么攻击者就可以把csrf利用链接填入到存在xss漏洞的地方,从而增大攻击成功的可能性,一定程度上也可以绕过服务端对Referer的验证.