54

某CMS不顺畅的XXE漏洞

 5 years ago
source link: https://www.freebuf.com/vuls/199716.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

*本文原创作者:sjy93812,本文属FreeBuf原创奖励计划,未经许可禁止转载

CMS 介绍

PHPSHE 商城系统是将商品管理、品牌管理、规格管理、促销管理、优惠券管理、在线购物、订单管理、支付管理、文章管理、会员管理、权限管理、通知管理、咨询评价、数据统计等功能相结合,并提供了简易的操作、实用的功能,快速让用户建立独立个性化的网上商店,为用户提供了一个低成本、高效率的网上商城建设方案。

偶然间在看 seebug 平台时,发现了一个叫做 phpshe 的cms 的一个 XXE 漏洞。开发语言为 PHP 因为好久没有在 PHP 上看到 XXE 漏洞了,所以 down 了一份源码下来看了看。结果过程相当曲折。

AfuuE3M.jpg!web

开始分析:

因为漏洞详情并没有开放。也没有其他的描述。并且这里的评级是高危。我一开始以为这里应该是无条件的 XXE 漏洞。结果发现并不是这样的。

我在本地安装完成之后,大概看了一下代码。代码并不是很多,既然是 XXE 漏洞,那就好说了。直接找和 xml 有关的代码段分析就好了。

大概翻了几个文件,找到这么一个文件 ihook/wechat.hook.php。这个文件的主要作用先看一下。

EZRrem7.jpg!web 看了一下这个文件的内容,就是封装了一堆用于处理 xml 数据的函数。很好,这里肯定会用得到,先记录一下。   

在 PHP 语言中如果存在 XXE 漏洞,我们首先要关注的就是触发漏洞的函数。我们先定位到一个函数上,比如下面的这个函数。

F7R3IbE.jpg!web 这个函数的作用是很明显的,就是对 xml 数据进行处理。如果你不是针对一个特定的漏洞分析,想发现更多漏洞的话就每个文件都翻阅一下,说不定就会有意外的收获。

我打算看一下这个 CMS 的逻辑就接着往下翻,又找到一个文件 include/plugin/payment/wechat/notify_url.php。

JFJzIbY.jpg!web

打开看一下,这里调用到了之前我们找到的处理 xml 数据的函数,大概率漏洞就是在这里了。

BvamAfe.jpg!web

以这里为入口开始跟进程序。首先跟进这个函数。

2QnIF3F.jpg!web 这里又调用了另外一个函数,接着往下。好了,这里我们看到一个经常出现漏洞的函数 simplexml,既然用到这个函数,这里就顺带说一下这个函数的作用。simplexml_load_string() 函数就是转换形式良好的 XML 字符串为 SimpleXMLElement 对象。   

7RFNVzR.jpg!web

再看这段代码,这里从前端接收数据,并且没有做任何处理。那么问题应该就是这里了。然后开始复现漏洞。

开始踩坑

3.1,这里我直接去访问这个路径。

mumMbiB.jpg!web 空白什么都没有,正常,我们直接去看数据包。看起来没什么毛病。   

z2EbIbM.jpg!web

既然问题出在这里,直接扔一个 payload 过来试一试毕竟是高危应该利用起来不会太复杂。

ZbQBrey.jpg!web 这里构造一个向指定服务器发送 HTTP 请求的 payload。结果很意外,漏洞没有被触发。   

IJJRJny.jpg!web

此时心情相当的复杂,返回又看了一眼代码。发现了一个问题,这里对前端传入的数据并不是使用的常见的 GET 或者是 POST 请求。而是使用的 file_get_contents,当使用 file_get_contents(“php://input”) 来获取前端传入的数据时,会对 Content-Type 有一些要求,不能是 multipart/form-data。这些情况下都是不能获取的。我猜想应该是这里的问题,然后更改 Content-Type:    text/xml。依然没有成功。

3.2 成功复现

此时我处在要抓头发的临界点,我又去咨询了一下大佬们,以为是我的 payload 的原因,扔给我了几个在别的地方实测有效的 payload。然后试了一下,依然如此,无法成功的触发漏洞。

i6b6nq2.jpg!web

就在我要放弃的时候,突然想起来会不会和 PHP 的版本有关系。果然,在我降低了几个 PHP 的版本之后神奇的事情发生了,漏洞触发了。

bYnEnav.jpg!web

然后去找了一下原因,这个漏洞主要是因为 simplexml_load_string 这个函数导致的。这个是 PHP 的内置函数。相关的依赖包是 libxml。

ENn2mur.jpg!web 在高版本的 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原创奖励计划,未经许可禁止转载


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK