前言
本篇总结归纳CSRF漏洞
1、什么是CSRF
跨站请求伪造(Cross Site Request Forgery,CSRF)
- 目标用户使用其用户名和密码登录受信任站点,从而创建了一个新的会话,受信任站点则会为目标用户Web浏览器Cookie中的会话信息存储了会话标示符
- 测试者往Web应用页面中插入恶意的HTML链接或脚本代码,而目标页面又没有过滤或者过滤不严,那么当用户浏览该页面时,用户的Web浏览器将被操纵向受信任站点发送一个恶意请求,比如删除帖子、添加管理员、添加邮件转发规则、改变路由器的DNS设置等。
- Web浏览器将会为这个恶意请求自动附加会话Cookie信息,因为是访问的受信任站点,因此该恶意请求将会成功完成。
与XSS相比
- XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等
- CSRF:利用站点对已经身份认证的用户的信任,攻击者伪造一个链接误导用户点击链接来使用用户的身份认证来访问服务器
2、攻击原理
成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态
而在这个期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,可能会执行一些用户不想做的功能
过程如下
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
3、几种攻击类型
(1)GET类型的CSRF
GET类型的CSRF利用非常简单,只需要一个HTTP请求
这种类型的CSRF一般是由于程序员安全意识不强造成的
一般会这样利用:
<img src=http://wooyun.org/csrf?xx=11 />
在访问含有这个img的页面后,成功向http://wooyun.org/csrf?xx=11
发出了一次HTTP请求
所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了
(2)POST类型的CSRF
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:
<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作
(3)过基础认证的CSRF(常用于路由器)
POC:
<img src=http://admin:[email protected] />
加载该图片后,路由器会给用户一个合法的SESSION,就可以进行下一步操作了
(4)未进行token校验
没有csrf-token的校验是最经典的CSRF漏洞高发处
但是这种漏洞只有在一些高风险的位置才有价值,比如csdn上关注/取关,发表博文等等一些操作
而在淘宝中如查看某一商品、执行某一模糊查询,这样的都属于无价值的被默认许可的csrf
(5)FLASH CSRF
(6)Json劫持
如果服务端没有校验Content-Type,或者没有严格校验Content-Type是否为application/json
我们可以