CMS 介绍
PHPSHE 商城系统是将商品管理、品牌管理、规格管理、促销管理、优惠券管理、在线购物、订单管理、支付管理、文章管理、会员管理、权限管理、通知管理、咨询评价、数据统计等功能相结合,并提供了简易的操作、实用的功能,快速让用户建立独立个性化的网上商店,为用户提供了一个低成本、高效率的网上商城建设方案。
偶然间在看 seebug 平台时,发现了一个叫做 phpshe 的cms 的一个 XXE 漏洞。开发语言为 PHP 因为好久没有在 PHP 上看到 XXE 漏洞了,所以 down 了一份源码下来看了看。结果过程相当曲折。
开始分析:
因为漏洞详情并没有开放。也没有其他的描述。并且这里的评级是高危。我一开始以为这里应该是无条件的 XXE 漏洞。结果发现并不是这样的。
我在本地安装完成之后,大概看了一下代码。代码并不是很多,既然是 XXE 漏洞,那就好说了。直接找和 xml 有关的代码段分析就好了。
大概翻了几个文件,找到这么一个文件 ihook/wechat.hook.php。这个文件的主要作用先看一下。
看了一下这个文件的内容,就是封装了一堆用于处理 xml 数据的函数。很好,这里肯定会用得到,先记录一下。
在 PHP 语言中如果存在 XXE 漏洞,我们首先要关注的就是触发漏洞的函数。我们先定位到一个函数上,比如下面的这个函数。
这个函数的作用是很明显的,就是对 xml 数据进行处理。如果你不是针对一个特定的漏洞分析,想发现更多漏洞的话就每个文件都翻阅一下,说不定就会有意外的收获。
我打算看一下这个 CMS 的逻辑就接着往下翻,又找到一个文件 include/plugin/payment/wechat/notify_url.php。
打开看一下,这里调用到了之前我们找到的处理 xml 数据的函数,大概率漏洞就是在这里了。
以这里为入口开始跟进程序。首先跟进这个函数。
这里又调用了另外一个函数,接着往下。好了,这里我们看到一个经常出现漏洞的函数 simplexml,既然用到这个函数,这里就顺带说一下这个函数的作用。simplexml_load_string() 函数就是转换形式良好的 XML 字符串为 SimpleXMLElement 对象。
再看这段代码,这里从前端接收数据,并且没有做任何处理。那么问题应该就是这里了。然后开始复现漏洞。
开始踩坑
3.1,这里我直接去访问这个路径。
空白什么都没有,正常,我们直接去看数据包。看起来没什么毛病。
既然问题出在这里,直接扔一个 payload 过来试一试毕竟是高危应该利用起来不会太复杂。
这里构造一个向指定服务器发送 HTTP 请求的 payload。结果很意外,漏洞没有被触发。
此时心情相当的复杂,返回又看了一眼代码。发现了一个问题,这里对前端传入的数据并不是使用的常见的 GET 或者是 POST 请求。而是使用的 file_get_contents,当使用 file_get_contents(“php://input”) 来获取前端传入的数据时,会对 Content-Type 有一些要求,不能是 multipart/form-data。这些情况下都是不能获取的。我猜想应该是这里的问题,然后更改 Content-Type: text/xml。依然没有成功。
3.2 成功复现
此时我处在要抓头发的临界点,我又去咨询了一下大佬们,以为是我的 payload 的原因,扔给我了几个在别的地方实测有效的 payload。然后试了一下,依然如此,无法成功的触发漏洞。
就在我要放弃的时候,突然想起来会不会和 PHP 的版本有关系。果然,在我降低了几个 PHP 的版本之后神奇的事情发生了,漏洞触发了。
然后去找了一下原因,这个漏洞主要是因为 simplexml_load_string 这个函数导致的。这个是 PHP 的内置函数。相关的依赖包是 libxml。
在高版本的 PHP 中这个函数的底层对 XXE 进行了修复,但是在低版本的 PHP 中,这个问题依然存在。大概在 libxml2.8 之下的版本。会成功的触发这个漏洞。
总结
漏洞利用条件:
PHPSHE 1.7 版本
无需登录
XXE 漏洞(libxml <2.9.0)
漏洞修复:对于 XXE 漏洞,可以升级 libxml2 库至 2.9.0 或以上版本,或者在 pe_getxml() 函数中加上 libxml_disable_entity_loader(true)。
*本文原创作者:sjy93812,本文属FreeBuf原创奖励计划,未经许可禁止转载
推荐阅读
![23321b0cd287fdb3f31ba7d5da98847a.gif](https://i-blog.csdnimg.cn/blog_migrate/54757c4e532176c373c9e76c01a83f02.gif)