【juice-shop】★★★★ HTTP-Header XSS:通过 HTTP 头部进行存储型 XSS 攻击
0x01 任务简报
🎯 挑战目标使用<iframe src="javascript:alert(`xss`)">代码通过 HTTP 头部进行存储型 XSS 攻击。
💡 官方提示 (Hints)1. 寻找可能显示在 HTTP 头部中的信息是这一挑战的一部分。
2. 你可能需要研究一些不常见甚至专有的 HTTP 头部字段,才能找到突破点。
3. 雪上加霜的是,你需要的 HTTP 头信息永远不会由应用程序自行发送。
HTTP 头部注入
某些应用会将 HTTP 请求头部的值存储到数据库,如果没有进行适当的验证和转义,就可能导致 XSS 攻击。
常见容易被滥用的头部:
| 头部 | 说明 |
|---|---|
X-Forwarded-For |
代理转发的原始客户端 IP |
True-Client-IP |
真实客户端 IP(某些 CDN 使用) |
X-Client-IP |
客户端 IP |
User-Agent |
用户代理信息 |
Referer |
来源页面 |
步骤1:注册账户并登录
- 访问应用首页
- 注册一个新账户
- 使用该账户登录

步骤2:使用 Burp Suite 抓包分析
- 打开 Burp Suite 的 Proxy 模块
- 登录账户
- 在 HTTP 历史记录中查找与登录相关的请求
关键发现: 存在一个 /rest/saveLoginIp 端点,用于记录用户登录时的 IP 地址。

步骤3:测试 X-Forwarded-For 头部
在 Burp Suite 的 Repeater 模块中:
- 选择
/rest/saveLoginIp请求 - 添加
X-Forwarded-For头部:1X-Forwarded-For: 1.2.3.4 - 发送请求
结果: 登录后查看用户资料,IP 地址没有更新。


分析: 应用可能不识别 X-Forwarded-For 头部。
步骤4:测试 True-Client-IP 头部
尝试使用 True-Client-IP 头部:
|
|
结果: 登录后查看用户资料,IP 地址成功更新为 1.2.3.4!


关键发现: 应用正在读取 True-Client-IP 头部并将其存储到数据库。
步骤5:构造 XSS Payload
既然应用会存储 True-Client-IP 头部的值,我们可以注入恶意代码。
Payload:
|
|
步骤6:执行存储型 XSS 攻击
- 先退出账户
- 找到
/rest/saveLoginIp请求 - 修改
True-Client-IP头部为恶意 Payload:1True-Client-IP: <iframe src="javascript:alert(`xss`)"> - 发送请求

步骤7:触发 XSS 攻击
- 重新登录账户
- 进入用户个人资料页面
- 查看"最后登录 IP"字段
结果: 浏览器执行了 iframe 中的 JavaScript 代码,弹窗显示 xss,挑战完成!
