Wker_XpathTool注入工具

Wker_XpathTool注入工具

Xpath注入是一种类似于SQL注入的一种注入,这里我用两种方式来说一下(万能密码和数据获取)。

万能密码

首先我们搭建PHP的一个环境,PHPstudy就可以,我们自己写一下,这里我就把我写的一个简单的注入发上来仅供参考。

<?php $username = $_GET['user']; $password = $_GET['pass']; $xml = simplexml_load_file("test.xml"); $yf = "/data/user[@login = '".$username."' and @password = '".$password."']/realname/text()"; echo '
'; $result = $xml->xpath($yf); if($result == null){ echo "login error"; }else{ echo "login success welcome:".$result[0]; } ?>

这里我用的是加载xml文档的方式引进一个对象,当然也可以用别的方法,那样牵扯到的就是xml注入(simplexml_load_string($data);),这里可以看到xpath语句"/data/user[@login = '".$username."' and @password = '".$password."']/realname/text()"

接受了我们的user和pass这两个GET类型的参数,我们来构造一下万能密码,我先附加上test.xml里面的内容
1
可以看到在data节点下面的user中两个属性login和password,只要校验对就可以返回一个登录成功,xpath中的@是属性的意思,可以看到有一个admin和wker,我们来绕过校验登陆,首先先闭合前面的单引号,很简单加上一个单引号就好,闭合后面的单引号我们这里需要注意一下,由于后面也有一个单引号,我们不能简单的使用or 1=1,而要使用or ‘1’=’1。这样才可以实现想要的想法,这样我们将user参数给越过了,接下来我们来越过pass,相同的payload,看下结果。


登陆成功,但为什么只返回第一个realname呢,我这里只返回数组的第一个元素所以会出现这样的效果,并没有遍历。

Xpath 盲注

Xpath注入其实就相当于读取xml文件中的数据,这里我发现网上相关于xpath注入的工具很少,,只有一款而且我也不会用,没找到相关的文档如何使用,所以我就自己写了一款xpath盲注的工具。

在这之前我们先要来简单了解一下xpath盲注的一个基本过程。

很简单,我们需要的数据无非只有三种(节点,属性值,数据)。所以我们需要先获取节点,在判断有无属性值,在一层一层的往下剥,知道剥到最后一个末节点,然后读取数据,达到最后一个遍历整个xml文档的效果,用上面的xml文件为实例,我们来手工简单的操作一下xpath盲注获取数据。

首先我们判断根节点的名称,这里我简单说一下,我为了payload的简单,我就将原本返回正确页面的admin和test在参数中直接提交了,这样是为了让读者更加简单的理解。

count(/)这个的意思就是度取根节点的个数,count函数的参数是节点,这里我们写入根节点,我们想要的效果是通过页面的返回结果代表count函数的结果,所以构造如下payload:http://127.0.0.1/xml_php.php?pass=test&user=admin' and count(/)=1 or '1'='2

看下我们最后生成的xpath语句:/data/user[@login = 'admin' and count(/*)=1 or '1'='2' and @password = 'test']/realname/text()

在我的记忆中,xpath的逻辑判断结构好像是从后往前读的。首先password正确and上1=2返回错误再or上我们的注入语句,最后再and上正确的用户名,相当于下面的逻辑:真and假or(注入语句)and真,简化一下就是:假or(注入语句),最后达到的效果我们注入的语句可以控制整个页面的返回也就达到了我们的盲注想要做到的事情。

我们来注入:发现count=1是正确的所以只有一个根节点,我们继续判断长度:string-length(name(/[position()=1]))=1,这里太详细的xpath我不讲解了,大家百度一下就好很简单的,在文章下方我会带上一篇别人写的文章。


一直到length=4的时候返回正常,所以根节点的长度是四,到此我们猜出了长度,接下来我们来猜解字符,通过这个函数substring(name(/
[position()=1]),1,1)='d'。这个函数是截取函数,和其他语言一样的参数。我们一直猜直到返回正常,附上一张截图:

最后得到的结果是:data,也就和我们上面的xml文档中的根节点的值一样,好了手工盲注xpath我就讲到这里,其他的大同小异。

看到我们注入的手法很是费人力,这个时候我们就用工具来跑,打开Wker_XpathTool,昨天晚上写的一款小工具,这次没有造轮子了吧,哈哈。

和我之前写的SQL注入一样我们这里也是需要检测前后缀的,含义一样也就是无非是闭合,但是,有一点需要十分注意,我写的时候用的是and注入,而忘记给大家写or注入了,SQL也是,我懒得改了,大家无非在构造payload的时候注意一下就好了。

前缀:’后缀:or '1'='2

工具是会自己检测的,当然也是需要字典的,我带了一些默认的,在txt中可以自己添加的。

我们来用工具检测一下:


注意一下,我这里由于排版造成的原因,后缀没有完全显示出来,导致后面的看不见了,我在之后回改一下的。之后我们点击获取根节点。

看到他在一个一个的猜解,最后会猜解出来:

也就是我们想要看到的data根节点,下面我们来选中根节点,data来检测子节点。

可以看到,也是一个字符一个字符的猜解,但是大家看到结果的时候会有一些疑惑,看下面的截图:

为什么会有user两个子节点,为什么作者不写在一块呢,是不是程序设计的时候的一个bug呢,其实并不是,而且这个也是写这款程序中唯一的一个难点,我们往下获取数据,我会给大家解释的。

我们继续获取子节点,记得要把那个data前面的钩子去掉,否则还是会在获取的,因为树形结构并不能判断你当前要查询的级别!

会看到如下结果:


这个时候可以看到,我们节点前面的小图标变了,这个是为什么呢?其实很简答,树形结构在我们学数据结构的时候知道,树总会有一个叶子,也就是我们说的末节点,这个时候程序会帮你自动检测,并且会已不同图标的形式检测,说明下面没有子节点了,该获取数据啦。

那么我们来获取数据,同时来解答一下为什么节点重复的事情(这里同样要注意,我们需要勾选的项目,吧user的构子去掉),会看到如下结果:


这次明白了吧,虽然节点名称相同,但是相同名称的节点会有不同的数据!

和我们的xml文档里的数据相同,达到了我们预期的效果,最后我们还是需要获取属性的值,在这里很遗憾的告诉大家,有可能是我对这块只是的不了解所造成的,我只能通过字典形式的爆破来猜解属性的名称,而不是盲注,如果有可以猜解属性名称的方法可以告诉我,我会将程序重写,我们来猜解一下,猜解的属性名称我用txt的形式放在同目录下,大家可以自己改,这个时候我们获取user下面的属性名称:


看到我们获取到了属性名称,login和password,猜出来的,和ACCESS猜表段字段差不多的意思,我们接下来就是获取属性值了,这个是可以盲注的,我们勾选上我们需要检测的属性,点击获取属性值。

看到,正在进行猜解,最终我们会得到如下的结果:

这样就可以将xml文档全部读出来了

如果我们没有勾选末节点而直接检测非末节点会出现以下的情况:


同样可以看到结果,但是是在加号里面包含着的,其实效果一样。

这个就是Xpath盲注,就说到这里。

这篇文章比较好,可以去看一下他讲解的xpath注入在来用工具会更加顺手一些:https://www.cnblogs.com/backlion/p/8554749.html

之后我会推出LDAP注入,Xss注入之类的注入工具,但是需要等我把手头的事情解决了才可以。

程序下载地址:链接:https://pan.baidu.com/s/15RzrlL48HLFOV6NfruJVPg 提取码:pnh9

3 个赞