免责申明
本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
xxxxCMS是基于ThinkPHP开发的一套网站,用户使用量比较大。

开始分析。
首先看入口文件index.php文件之后发现框架入口文件夹为app,我们查看app文件夹。
查看目录结果也可以知道,我们的Action即为Controller层面。

在Public文件当中发现存在一个方法为WXapi,其中进行实例化了YdWx类,并且调用了方法valid以及方法responseMsg方法。
我们分别跟入这两个方法。

这个方法进行调用了方法checkSignature方法,继续跟入。

这里接受三个参数,并没有什么太大的用处,我们查看两外一个方法。

这个方法首先进行接受用户传递进来的数据流file_get_contents方 法,然后给到了方法postStr方法。
并且在下面就是进行调用等方式,我们暂且不进行跟入,这里查看相关方法在227行。

在这里调用了一个方法为simplexml_load_string方法,这个方法是进行解析XML文档的,将我们传递的参数放入了这里面进行解析,其实如果第三个参数LIBXML_NOCDATA这是一个常量,如果允许加载外部资源的话也会造成一个XXE漏洞。
我们继续往下分析,这边给到了参数postObj变量。

从我们传入的数据当中赋值给相关的参数FromUserName等标签。
并且在237–241行代码当中进行了过滤,防止了SQL注入的产生。

只允许字符和数字不允许别的符号。
并且当参数msgText等于test的时候进入下面的方法。

继续往下走。

在这里又去接受了一个参数为Context参数,这个参数给到了变量p1然后调用了方法findReply方法。

这里虽然也给我们的参数进行了过滤但是最终返回给的变量是data,也就是我们的data是进行过滤之后的语句,然而p1还是我们传入的原始数据。

然后判断data是否存在数据,如果存在则调用方法runKeyword方法,并且将原始数据p1传入到了该方法。

然后发现方法直接传递到了TP当中的链式查询中的where方法,造成了SQL注入漏洞。
三、漏洞poc
漏洞POC
POST /xxxxxxx?=testaaaa HTTP/1.1
Host: 192.168.100.106:666
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 289
<![CDATA[aaa]]>
<![CDATA[aaas]]>
shell
<![CDATA[text]]>
<![CDATA[aa'union select sleep(10),2,3# ]]>
6364149417119100008


暂无评论内容