web基础漏洞-csrf
1、介绍
csrf,cross script request forgery跨站请求伪造。
是受害者用户在登录目标网站A后,攻击者基于社工手段使其在同主机同浏览器环境下,访问攻击者控制的网站B。网站B的页面中伪造请求通过该浏览器提交到网站A,同时携带对网站A保存在浏览器中的cookie登录凭证。使得网站A的服务端接收后认为是用户自身发送,且是登录后经过身份验证,从而造成危害。
- csrf发生在受害者用户登录后
- 登录凭证为cookie,或者session。相比于xss,csrf不要求攻击者能够直接获取登录凭证,即允许cookie为httponly标志
- 登录凭证不能是token。
- url或请求体部中的直接token
- 间接作为token的私人信息,比如手机号、邮箱、业务id等
- ajax,请求头部中手动添加额外字段
- 危害
- 可以模拟用户操作,从而进行账号操作,但是一般是增改删业务,而不涉及查询
- get请求,多用于获取资源,或者查询操作。但偶尔,也被用于增删改操作,比如点赞、收藏
- post请求,是csrf的重点关注,尤其是表单提交
- ajax请求,如果跨域,能够进行请求提交,且携带目标域的cookie,但是需要考虑目标域是否接收。
2、按请求方法分类
csrf,理论上支持所有请求方法,但一般讨论Get、Post、Put和Delete方法。这四种请求方法又可以分为ajax和非ajax。
- get和post方法,一定意义上可以等价
(1)Get方法
- 由一般html元素发出,form表单默认或者显式设置为Get发出,ajax默认或显示设置为Get发出
- 其中,非ajax发出请求时,自动携带目标域的cookie。ajax,则需要显式设置withCredentials: true,才能携带。两者都可能被目标服务端的代码检查referer,进而阻止跨域请求,但相对来说,前者可行性更高
- 业务分析
- get请求,一般是进行静态资源请求,或者查询操作。不属于csrf测试目标
- 属于csrf测试的get请求:
- 表单提交
- 向某接口请求,接口本身带有操作属性,传递资源id。进行
- 可能伴随操作类型参数。
- 如果非ajax的get请求,是进行表单提交,或者向某执行增删改操作的接口
3、按操作对象分类
按照请求类型,可以分为get型和post型。
按照攻击方式,可以分为html csrf攻击,json hijacking和flash攻击。
2.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提交方式。
2.2 json hijacking
json劫持 - 挖洞404 - 云海天 (cnblogs.com)
2.3 flash csrf
flash同样遵循同源策略,发起的csrf是基于actionscript脚本,可以
- 跨域获取隐私数据
- 跨域提交数据操作
3、利用过程
攻击者发现目标网站某处存在csrf漏洞,直接创建或者控制网站B,创建页面使访问者执行csrf的脚本
在受害者登录目标网站A后,通过邮件、短信等方式使其访问网站B的创建页面
4、测试步骤
(1)登录
(2)检查请求是否存在token,以及非常规的请求字段
(3)ajax一般不作为csrf测试,ajax的跨域并不携带cookie
(4)检查referer和origin是否在服务端被检查
5、防护
(1)设置token机制,或者非常规的请求字段
(2)ajax交互
(3)严格检查referer和origin字段,一般习惯拆分各部分
原文地址:https://www.cnblogs.com/wd404/p/17440224.html