web基础漏洞-csrf

1、介绍

csrf,cross site request forgery跨站请求伪造。

  • 用户登录目标域,获取cookie的登录凭证,保存到本地浏览器。不存在直接或间接token
  • 攻击者基于社工,使得用户在同一浏览器下访问其所控制的网站
  • 该网站伪造请求,提交到目标域,这个过程自动或强制携带本地浏览器存储的cookie
  • 目标域接收请求后,只验证了cookie而未验证referer或origin,导致执行成功
  • 如果伪造的请求是获取信息,返回后,攻击者控制的网页可能将其发送到攻击者的服务器

2、场景

csrf针对的是非静态的接口,比如获取信息,或者提交增删改操作。

2.1 一般请求

  • 由html元素或css直接请求时,无论是否跨域,浏览器会自动携带目标域cookie
  • 主要区别是form表单可以实现post方法,以及请求体部携带数据。而其它只能是get方法,url携带数据
  • 用于执行增删改操作,而不能进行获取数据
<link href=''>
<img src=''>
<img lowsrc=''>
<img dynsrc=''>
<meta http-equiv='refresh' content='0; url='>
<iframe src=''></iframe>
<frame src=''>
<script src=''></script>
<bgsound src=''>
<embed src=''>
<video src=''>
<audio src=''>
<a href=''>
<table background=''>
 ...
<form action='' method=''></form>
    

css
@import ''
background:url('')

2.2 jsonp

2.3 ajax跨域

  • 设置withCredentials为true,强制携带cookie
  • 可以是任意请求方法
  • 服务端接收之后,即有可能处理
  • 响应如果动态设置access-control-allow-origin,可以将响应的数据转发给攻击者
  • 需要考虑浏览器策略

2.4 ajax转为非ajax

如果ajax请求的体部为空,或者体部是url参数形式,则可以尝试转为非ajax的请求,从而直接携带目标域cookie。

2.5 flash

了解即可。

3、漏洞防护

  • 设置token,注意不要设置在cookie字段中
  • cookie设置samesite属性不为None
  • 严格检查referer或origin字段
  • ajax,如果需要设置access-control-allow-origin字段时,严格检查

4、测试&绕过

(1)注意测试的请求必须是cookie作为登录凭证,无直接或间接token。需要检查cookie的samesite属性不为none。且必须是动态接口,需要进行登录凭证验证

 (2)如果测试的请求中存在token,可以先测试该token是否有效。其次考虑对token的爆破或猜解。有时候,可以基于其它csrf先获取token。

(3)由于防护可以选择referer或origin,因此测试csrf时,必须同步测试referer和origin

  • 未检查,则直接主域名测试
  • 检查referer整体是否包含,篡改将当前合法的referer值作为参数拼接到referer的末尾
  • 检查域名部分是否包含特定子字符串,篡改将合法的域名子字符串作为子域名
  • 检查主域名以及前后.关键字符,篡改顶级域名
  • 检查是否以主域名以及顶级域名结尾,篡改主域名拼接任意前缀

(4)分析

  • 快速检查时,基于响应体部字符长度判断
  • ajax,可以检查access-control-allow-origin字段是否改变
  • 但根本上来说,还是检查请求操作的资源是否成功

5、实战经验

在过去的csrf实战中,有两个漏洞值得单独提列:

(1)测试目标基于一个域名进行登录,获取登录凭证cookie。然后获取口令,跳转到其它域名,该口令作为登录凭证然后获取到跳转域名下的登录凭证cookie。

这个过程中,可以基于csrf获取口令,从而实现账号权限控制。

(2)测试目标是购物车csrf获取相关信息,但是请求中携带间接的token,即订单编号。

这个过程中,先csrf获取到一个新的订单编号,基于该订单编号去获取购物车下的地址信息。

posted @ 2023-07-06 18:40  挖洞404  阅读(7)  评论(0编辑  收藏  举报