web基础漏洞-csrf
1、介绍
csrf,cross script request forgery跨站请求伪造。利用目标域对用户的信任,只检查登录凭证而不进一步检查referer字段,被攻击者伪造请求提交,造成危害。
具体来说:
- 受害者用户登录目标域,获得登录凭证cookie,缓存到浏览器中
- 受害者用户在同一浏览器下,由于攻击者的社工,访问攻击者控制的第三方域的某网页
- 该网页中存在脚本或某些特殊元素,控制受害者的浏览器向目标域发送请求,携带有目标域的登录凭证cookie
- 目标域接收后,只检查登录凭证cookie,而未检查referer字段,进行业务操作
危害:
- 可以模拟用户操作,从而进行账号操作,但是一般是增删改业务,而不涉及查询
- jsonp劫持属于csrf,可以实现数据获取
- jquery load与ajax
2、登录凭证
- csrf发生在受害者用户登录后,攻击过程需要借助登录凭证cookie,才有意义
- 相比于xss,csrf是借用而不要求攻击者能够直接获取登录凭证,即允许cookie为httponly标志
- 登录凭证不能是token
- url或请求体部中的直接token
- 间接作为token的私人信息,比如手机号、邮箱、业务id等
- ajax,请求头部中手动添加额外字段
3、ajax
非ajax的跨域请求,会自动携带目标域的cookie。而ajax的跨域请求,默认是不携带目标域的cookie
如果ajax请求时,显式设置withCredentials: true,即可使ajax跨域请求也携带目标域cookie
ajax跨域时,响应的处理,涉及到cors机制。但无论如何,请求都会被提交到目标域,服务端具体如何处理由其代码决定,是有可能进行数据操作的
另一方面,ajax和非ajax的请求,服务端接收后,都可以考虑使用代码进行检查refere字段,从而进行禁止/放行策略。当然,非ajax的通行可能性更高
4、相关业务
- Get请求中,只是对静态资源的请求或者查询,是不参与csrf分析的
- 表单提交,无论是get还是post,都是csrf的重点测试
- 接口提交,包含操作对象id,以及可能的操作类型参数与其它参数。比如添加或取消关注、点赞、收藏,删除某资源,更新资源、插入资源等
- ajax业务相对非ajax业务,存在csrf的可能性要低得多
5、分类
按照攻击方式,可以分为html csrf攻击,json hijacking和flash攻击。
5.1 html csrf
<link href="">
<img src="">
<img lowsrc="">
<img dynsrc="">
<meta http-equiv="refresh" content="0;url=">
<iframe src="">
<frame src="">
<script src="">
<bgsound src="">
<embed src="">
<video src="">
<audio src="">
<a href="">
<table background="">
...
<!-- css样式中-->
@import ""
background:url("")
...
还可以通过js动态生成的标签对象或css对象发起的get请,而发出post请求只能通过form提交方式。
5.2 json hijacking
web基础漏洞-json劫持 - 挖洞404 - 博客园 (cnblogs.com)
5.3 flash csrf
flash同样遵循同源策略,发起的csrf是基于actionscript脚本,可以
- 跨域获取隐私数据
- 跨域提交数据操作
6、利用过程
攻击者发现目标网站某处存在csrf漏洞,直接创建或者控制网站B,创建页面使访问者执行csrf的脚本
在受害者登录目标网站A后,通过邮件、短信等方式使其访问网站B的创建页面
7、测试步骤
(1)登录
(2)检查请求是否存在token,以及非常规的请求字段
(3)ajax一般不作为csrf测试,ajax的跨域并不携带cookie
(4)检查referer和origin是否在服务端被检查
假设样本referer:http://www.abc.com
测试origin:http://www.abc.com.testabc.com,referer:http://www.abc.com.testabc.com/xx?referer=http://www.abc.com/xxx
8、防护
(1)设置token机制
(2)严格检查referer,一般习惯拆分各部分