
1. 靶场环境与CSRF漏洞概述最近在复现Web安全实验时发现Pikachu靶场的CSRF模块设计得很有意思。这个靶场用几个典型场景展示了CSRF跨站请求伪造攻击的多样性和危害性。作为Web安全领域的经典漏洞CSRF经常出现在缺乏防护的系统中攻击者可以诱导用户执行非预期的操作。Pikachu靶场搭建起来很简单用PHP环境配合MySQL数据库就能跑起来。它的CSRF模块包含了修改个人信息、转账交易等常见业务场景正好可以用来演示不同防护措施的优缺点。下面我会结合具体案例分析CSRF的原理和防御方案。2. CSRF基础攻击原理分析2.1 无防护的修改信息案例靶场中最基础的案例是一个没有任何防护的个人信息修改页面。攻击者只需要构造一个恶意链接img srchttp://target/modify.php?namehackeremailattackevil.com width0 height0当已登录用户访问包含这个标签的页面时个人信息就会被悄无声息地修改。这种攻击之所以能成功是因为浏览器会自动带上目标站点的cookie服务器仅通过session验证身份请求参数直接暴露在URL中2.2 关键漏洞点分析从技术层面看这类漏洞通常存在以下特征使用GET方式执行写操作缺乏二次确认机制没有检查请求来源参数可预测且可枚举在实际业务中修改密码、转账付款等敏感操作如果存在这些问题后果会非常严重。我曾遇到过某电商平台因为类似漏洞导致用户地址被篡改的情况。3. 进阶攻击场景复现3.1 POST型CSRF攻击有些开发者知道不能用GET执行写操作于是改用POST方式。但这样仍然不安全form idattack actionhttp://target/transfer.php methodPOST input typehidden nameamount value10000 input typehidden nameaccount valuehacker /form scriptdocument.getElementById(attack).submit();/script这种攻击需要用户访问恶意页面表单会自动提交。与GET型相比请求参数不会显示在URL中需要构造form表单仍然会携带cookie3.2 文件上传CSRF更危险的是结合文件上传功能的CSRFform actionhttp://target/upload.php methodPOST enctypemultipart/form-data input typefile namefile input typesubmit valueUpload /form script // 通过JS自动填充文件内容并提交 /script这种攻击可以上传webshell等恶意文件危害等级更高。防御时需要特别注意content-type检查。4. 防御方案对比测试4.1 Token验证机制最有效的防护是在表单中添加随机token// 生成token $_SESSION[token] bin2hex(random_bytes(32)); // 验证token if(!hash_equals($_SESSION[token], $_POST[token])){ die(Invalid token); }实测发现这种方案能有效阻断CSRF但要注意Token需要足够随机每个表单需要独立token需要设置合理的有效期4.2 SameSite Cookie属性现代浏览器支持SameSite属性ini_set(session.cookie_samesite, Strict);测试效果Strict模式完全阻止第三方cookieLax模式对GET请求较宽松需要浏览器支持4.3 双重验证机制对于敏感操作建议增加二次确认首次提交生成验证码需要用户二次输入确认验证通过才执行操作虽然影响用户体验但对资金交易等场景很有必要。5. 实际渗透测试经验5.1 绕过Referer检查有些系统会检查HTTP Referer头但存在绕过方法利用HTTPS-HTTP降级通过meta refresh跳转使用data URL作为中转meta http-equivrefresh content0;urldata:text/html,scriptdocument.locationhttp://target/modify.php?paramevil/script5.2 结合XSS扩大攻击面如果目标站点存在XSS漏洞CSRF的利用会更加容易fetch(/modify.php, { method: POST, body: namehacker, credentials: include });这种组合攻击可以完全绕过同源策略限制。6. 企业级防护建议根据OWASP推荐完整的CSRF防护应该包括敏感操作使用POST随机token验证关键操作二次确认SameSite Cookie设置定期安全审计在Spring Security等框架中可以很方便地集成CSRF防护http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());但要注意不要过度依赖框架理解底层原理很重要。