web基础漏洞-csrf

发布时间 2023-05-29 13:58:06作者: 挖洞404

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字段,一般习惯拆分各部分