ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CSRF与SSRF漏洞解析:原理、检测与防御实战

CSRF与SSRF漏洞解析:原理、检测与防御实战

1. 从一次真实攻击事件说起

去年某金融平台发生了一起用户资金被盗事件:攻击者诱导受害者点击了一个"抽奖活动"链接,受害者登录后,攻击者利用受害者已认证的会话,在后台完成了转账操作。整个过程受害者毫无察觉,直到收到银行短信才意识到出了问题。这就是典型的CSRF(跨站请求伪造)攻击。

而在另一起事件中,某企业内网服务器被入侵,调查发现攻击者通过一个存在SSRF(服务端请求伪造)漏洞的Web应用,以服务器为跳板访问了内网敏感系统。这两个安全漏洞看似不同,实则都利用了"请求伪造"这一核心攻击手法。

2. CSRF漏洞深度解析

2.1 漏洞原理与攻击流程

CSRF攻击的本质是:攻击者诱骗已认证的用户在不知情的情况下提交恶意请求。其核心利用三个条件:

  1. 用户已登录目标网站(存在有效会话)
  2. 网站未对敏感操作实施二次验证
  3. 攻击者能预测或获取请求参数

典型攻击步骤:

  1. 用户登录bank.com,会话cookie有效
  2. 用户访问攻击者构造的恶意页面,内含:
<img src="http://bank.com/transfer?to=hacker&amount=10000" width="0" height="0">
  1. 浏览器自动携带cookie发送请求,完成转账

2.2 实战检测方法

使用Burp Suite测试的完整流程:

  1. 拦截正常修改密码请求(假设为POST /change-pwd)
  2. 右键请求 → Engagement tools → Generate CSRF PoC
  3. 调整HTML表单,移除随机token等防护参数
  4. 保存为HTML文件,用已登录账户的浏览器打开
  5. 观察密码是否被修改而不需要重新认证

关键验证点:

  • 请求是否仅依赖会话cookie
  • 敏感操作是否有不可预测参数(如CSRF token)
  • 请求头是否检查Referer/Origin

2.3 防御方案对比

防御方案实现方式优点缺点
CSRF Token表单添加随机token,服务端校验安全性高需前后端配合
SameSite Cookie设置Cookie的SameSite属性浏览器原生支持旧浏览器兼容性问题
二次验证敏感操作需重新输入密码/验证码用户体验差安全性最高
Referer检查验证请求来源域名实现简单可能被绕过

最佳实践:关键操作应采用CSRF Token + SameSite Strict双重防护,金融级操作增加二次验证。

3. SSRF漏洞攻防全解

3.1 漏洞成因与危害

SSRF允许攻击者通过服务器发起任意网络请求,典型利用场景:

  • 访问内网服务(如Redis、Jenkins)
  • 云服务器元数据泄露(如AWS的169.254.169.254)
  • 端口扫描内网资产
  • 作为跳板实施进一步攻击

某真实案例攻击链:

存在SSRF的Web应用 → 访问云元数据 → 获取临时密钥 → 接管云服务器 → 横向移动内网 → 数据泄露

3.2 常见触发点检测

容易存在SSRF的功能点:

  • URL预览/转码服务
  • 文件导入(如Excel读取外部链接)
  • Webhook回调配置
  • 社交媒体链接解析
  • 文档转换服务(PDF生成等)

测试payload示例:

http://127.0.0.1:8080/admin file:///etc/passwd http://169.254.169.254/latest/meta-data/

3.3 高级绕过技巧

当存在基础防护时,可尝试:

  • 使用不同IP表示法:127.0.0.1 → 2130706433
  • 利用重定向:http://evil.com/redirect.php
  • 协议混淆:xip.io、DNS重绑定
  • 特殊字符:http://localhost@evil.com

4. 联合防御体系构建

4.1 代码层防护

CSRF防护示例(Spring Security):

@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } }

SSRF防护示例(Java URL过滤):

public static boolean isSafeURL(String url) { try { URI uri = new URI(url); if (!"https".equals(uri.getScheme())) return false; if (uri.getHost().endsWith(".internal.com")) return false; return !isPrivateIP(uri.getHost()); } catch (Exception e) { return false; } }

4.2 架构层防护

推荐的安全增强措施:

  1. 网络隔离:关键内网服务禁止外网访问
  2. 出口过滤:限制服务器出站连接白名单
  3. 云安全:禁用实例元数据公开访问
  4. WAF规则:拦截恶意SSRF特征请求

5. 实战案例分析

5.1 DVWA CSRF漏洞利用

DVWA(Damn Vulnerable Web App)的低安全级别下:

  1. 修改密码页面无CSRF防护
  2. 构造恶意链接:
http://dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change
  1. 诱使管理员点击后,密码被修改

修复方案:添加随机token校验

$token = bin2hex(random_bytes(32)); $_SESSION['token'] = $token; if ($_POST['token'] !== $_SESSION['token']) { die("CSRF token validation failed"); }

5.2 CTF SSRF题目突破

某CTF题目要求通过SSRF获取flag:

  1. 发现图片加载接口存在SSRF:
/api/load?url=http://example.com/image.jpg
  1. 尝试访问内网服务:
/api/load?url=http://127.0.0.1:8080/flag.txt
  1. 被过滤后使用进制绕过:
/api/load?url=http://0177.0.0.1:8080/flag.txt

6. 企业级防护建议

根据OWASP Top 10 2021要求:

  1. CSRF防护清单:
  • 所有状态修改请求使用POST
  • 关键操作添加re-authentication
  • 实施SameSite Cookie策略
  • 定期进行渗透测试
  1. SSRF防护清单:
  • 实施严格的URL白名单校验
  • 禁用不需要的URL协议(如file://)
  • 监控异常出站流量
  • 定期更新依赖库(如libcurl)

我在金融系统安全审计中发现:超过60%的CSRF漏洞源于历史遗留系统未更新防护措施,而SSRF漏洞多发生在新兴的云原生应用中。建议企业建立漏洞生命周期管理机制,新系统上线前必须通过自动化扫描+人工验证双保险。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进