声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课
环境:本地服务器,BurpSuite
一、概述
- 使用Referer进行CSRF 漏洞防御。
- BurpSuite生成CSRF POC。
二、漏洞防御
2.1 Referer防御CSRF原理
HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
当用户点击被构造好的CSRF利用页面,那么在执行用户对应操作时,提交的HTTP请求中就有对应的Referer值,此时服务端判断Referer值是否与服务器的域名信息有关。如果不相关则不执行操作。
用户正常使用,发送的是用户当前的域名为Referer。

用户点击POC的模型,发送的是POC所在的域名为Referer。
可以看出,是否是用户的自定义操作,是可以通过Referer来分辨出来。
2.2 Referer防御代码编写
在PHP中使用$_SERVER['HTTP_REFERER'] 获取页面提交请求中的Referer值。
<?php
if(strpos($_SERVER['HTTP_ REFERER'],'xx.com') !== false)
{
echo "判断成功";
}
else
{
echo "判断失败";
}
?>
2.3 绕过Referer技巧
如果服务端只判断当前的Referer中是否具有域名,那么直接可以新建文件夹进行绕过。
2.4 BurpSuite生成POC触发CSRF
管理员的域名为:192.168.227.204
攻击者POC的域名为:192.168.227.84
管理员正常访问:
我们使用BurpSuite抓包,生成POC,放在KaliLinux的服务器中。
POC2.html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://192.168.227.204:8009/login2.php">
<input type="submit" value="Submit request" />
</form>
</body>
</html>
开启Apach服务。
管理员访问poc2.html页面。
检测出来域名不一致,判断为CSRF攻击,拒绝操作。
我们尝试绕过,在poc2.html上建立一个名为192.168.227.204的文件夹,poc2.html放入其中再访问。
管理员访问如下地址:
http://192.168.227.84/192.168.227.204/poc2.html
同时修改代码为a标签触发。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<a href="http://192.168.227.204:8009/login2.php" target="_blank" rel="external nofollow" >click me</a>
</body>
</html>
管理员点击,成功绕过Referer验证,触发CSRF漏洞。