【渗透测试】CSRF漏洞的原理、利用方式和防范措施

CSRF漏洞的原理、利用方式和防范措施


一、原理

1. 定义与触发条件

CSRF(跨站请求伪造) 是一种利用用户已登录的会话状态,伪造合法请求执行恶意操作的漏洞。其核心触发条件包括:

  • 会话保持:用户未退出目标网站(如银行、社交平台)的登录状态。
  • 无二次验证:关键操作(如转账、修改密码)未校验请求来源或用户身份(如Token、验证码)。
  • 请求可预测:攻击者能构造包含敏感参数的请求(如user=attacker&money=10000)。

2. 攻击链流程图

用户登录网站A
会话Cookie生效
用户访问恶意网站B
恶意网站B诱导用户发送伪造请求
网站A误认请求合法并执行操作

二、利用方式

1. 攻击手法与分类

(1) 站外CSRF

  • 形式:攻击者通过钓鱼邮件、论坛链接诱导用户点击恶意URL。

  • 示例

    <img src="http://bank.com/transfer?to=attacker&amount=10000" width="0" height="0">
    

    (用户访问含此代码的页面时,自动发起转账请求)

(2) 站内CSRF

  • 形式:利用站内功能(如评论区)嵌入恶意请求。

  • 示例:Discuz论坛管理员点击含恶意图片的帖子,触发数据库备份操作:

    <img src="http://forum.com/admin/backup?dir=hack&filename=data.sql">
    

(3) 组合攻击(CSRF+XSS)

  • 形式:通过存储型XSS注入CSRF攻击代码,实现自动化攻击。

  • 示例

    <script>
      fetch("http://bank.com/transfer?to=attacker&amount=10000", {credentials: "include"});
    </script>
    

2. 靶场案例

使用 Discuz、DVWA 做实验。

  1. Discuz拖库攻击
    • 漏洞:管理员点击含恶意备份请求的帖子,触发数据库导出操作。
    • 影响:攻击者获取论坛全部用户数据,包括密码哈希和敏感信息。
    • 修复:Discuz后续版本强制校验管理员操作来源(Referer+Token)。
  2. DVWA密码篡改
    • 漏洞:低安全级别下,直接通过URL修改密码(如/csrf?password_new=123&password_conf=123)。
    • 影响:攻击者无需原密码即可重置管理员密码。
    • 修复:高安全级别引入Token验证(每次请求生成随机值)。

3. 检测工具与流程

  • 工具

    • Burp Suite:拦截请求并移除Referer头,验证请求是否仍有效。
    • CSRFTester:生成恶意请求模板,测试服务器响应。
    • OWASP ZAP:自动化扫描CSRF漏洞,支持自定义规则。
  • 手动检测

    1. 抓取正常请求(如修改密码)。  
    2. 移除`Referer`和`Token`参数,重放请求。  
    3. 若操作成功,则存在CSRF漏洞。  
    
  • 挖掘CSRF漏洞

    1. 扫描器
    2. 修改密码的地方
    3. 添加用户的地方
    4. 数据库备份的地方
    5. 数据交易、支付等
    6. 其他一些对话框钓鱼页面
    7. CSRF一般与XSS结合使用

三、防范措施

1. 服务端防御策略

(1) Token验证

  • 原理:为每个会话生成随机Token,校验请求合法性。

  • 代码示例(PHP):

    // 生成Token
    $_SESSION['token'] = bin2hex(random_bytes(32));
    // 校验Token
    if ($_POST['token'] !== $_SESSION['token']) {
        die("Invalid Token!");
    }
    

    优化点:使用SameSite Cookie属性限制跨站请求。

(2) 校验Referer头

  • 原理:限制请求来源为可信域名。

  • 代码示例(Nginx配置):

    if ($http_referer !~* "^https://yourdomain.com") {
        return 403;
    }
    

    注意:需处理反向代理场景(如配置proxy_set_header Referer $http_referer)。

(3) 验证码/二次确认

  • 场景:敏感操作(如支付、密码修改)需用户输入验证码或确认密码。

  • 示例

    <form action="/transfer" method="POST">
      <input type="text" name="captcha" placeholder="输入验证码">
      <input type="submit" value="确认转账">
    </form>
    

(4) 严格区分请求方法

  • 规范:使用POST处理写操作(如数据修改),禁用GET执行敏感动作。

  • 代码示例(Java Spring):

    @PostMapping("/transfer")
    public ResponseEntity<?> transferFunds(@RequestBody TransferRequest request) {
        // 业务逻辑
    }
    

2. 客户端防御建议

  • 用户习惯
    • 及时退出长时间未使用的会话。
    • 避免点击不明链接或图片。
  • 安全工具:安装浏览器插件(如uBlock Origin)拦截可疑请求。

3. 安全开发

  • 框架支持

    • Spring Security:自动集成CSRF Token。
    • Django:内置{% csrf_token %}模板标签。
    • React/Vue:通过Axios拦截器自动添加Token。
  • 代码规范

    // React中自动携带CSRF Token
    axios.defaults.headers.common['X-CSRF-Token'] = document.querySelector('meta[name="csrf-token"]').content;
    

4. 安全设备防御

  • WAF(Web应用防火墙)
    • 规则示例:检测异常Referer或缺失Token的请求。
    • 厂商方案:Cloudflare、ModSecurity。
  • 硬件层防护
    • H3C IP5:基于硬件检测HTTP头部异常,阻断CSRF攻击。

四、结语与拓展

漏洞本质

CSRF的本质是**“信任用户浏览器发起的任何请求”**。防御核心在于打破这种信任链,通过Token、Referer校验等方式确保请求合法性。

漏洞自查清单

  1. 关键操作是否要求Token验证?
  2. 是否校验请求的Referer来源?
  3. GET请求是否用于数据修改?
  4. 是否存在未过滤的用户输入点(如图片URL)?

思考题

  • 为什么CSRF攻击依赖用户会话?
    (提示:服务器通过Cookie/Session识别用户身份,攻击者利用此机制伪造请求。)

延伸阅读

  • OAuth 2.0中的CSRF防护:使用state参数防止授权流程劫持。
  • 现代前端框架的防护机制:如Angular的HttpClient默认校验CSRF Token。

参考资源

  1. OWASP CSRF指南https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
  2. CVE案例库https://cve.mitre.org/(查询CVE-2021-44228等最新漏洞)
  3. RFC 7231 HTTP方法定义https://tools.ietf.org/html/rfc7231
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值