0x00 XPath基础知识
这个部分只是单纯铺垫XPath基础知识,不涉及注入,了解XPath可以跳过
这里直接引用 w3school的XPath教程 中间的案例,因为里面给了好多示例,基本一看就懂的那种。
XPath是什么?
XPath是用来从XML文档中进行查找信息的语言。
XPath节点(Node)
XPath中有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点
这个没有太大了解的必要,知道节点这个名词就够了,不需要分得特别细致。
选取节点
后面都以这个xml文档为例
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
选取节点的表达式:
示例:
为选取节点添加限制条件——谓语
谓语的语法是写在方括号里,是用来为选取节点添加特定条件的。
示例:
选取未知节点
在不知道节点名称时,可以使用通配符来范范的匹配节点
示例:
多路径的选取
可以使用 | 来选取多个路径,有点相当于sql中的 union
示例:
XPath运算符
0x01 从MySQL盲注开始
在一文搞定MySQL盲注一文中,我介绍了做盲注的两个基本问题:
- 字符串的截取
- 比较
然后是做盲注的流程,首先我们需要构造SQL语句,找到一个condition,这个condition是一个布尔表达式,他能够影响着这个语句的结果,例如:
?id = 1' and 1=1 %23
?id = 1' and 1=2 %23
在上面这个例子中, 1=1 和 1=2 就是一个布尔表达式,并且他们的真假直接影响着SQL语句的查询结果、进而直接影响着页面的回显或者延时与否等(具体取决于什么类型的盲注)。这个时候我们只需要把这个布尔表达式换成由字符串截取和比较所组成的新的布尔表达式,即可开始注入,例如:
?id = 1' and ascii(substr((select database()),1,1)) = 97 %23
?id = 1' and ascii(substr((select database()),1,1)) = 98 %23
以此类推...
这样就ok了!
0x02 MySQL转向XPath
在MySQL中我们一般遇到的SQL注入都是对 select 查询语句的 where 子句做注入,也就是说注入进去的是 where 的一部分,而 where 刚好是对 select 的查询增加限制条件的,所以我们才能给到布尔表达式然后通过这个布尔表达式影响 where 子句进而影响整个 select 的查询结果。
由此可见,想要做盲注,我们需要控制的是查询语句的“限制”部分。
而XPath中,对查询做限制的正是谓语,那么注入位点就也是需要在谓语处进行注入。当然这个不用自己考虑和构造,因为CTF题中如果是出XPath盲注这个知识点,用户的输入基本就是在谓语中的