php xml 直接 id 不循环_某CMS不顺畅的XXE漏洞

本文详细介绍了在PHP语言环境下,针对PHPSHE CMS的XML外部实体(XXE)漏洞分析过程。作者通过查看源码,发现存在对XML数据处理不当的情况,特别是在低版本PHP的libxml库中,`simplexml_load_string`函数容易引发XXE。在复现漏洞时,由于`file_get_contents`对Content-Type的限制,初始尝试未能成功。降低PHP版本后,成功触发漏洞。最后,作者指出漏洞利用条件及修复建议,即升级libxml2库或禁用实体加载。
摘要由CSDN通过智能技术生成

CMS 介绍

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

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

03bdab17e5c19cee5787eb196cfd629d.png

开始分析:

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

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

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

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

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

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

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

1c7ac26b198ce577b05bc2c9405608b6.png

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

07a74a8f95ffcf5e3d413dc62c0f6e65.png

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

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

c49b9e059408b83a2c4ed446e722bebc.png

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

开始踩坑

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

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

a433109c782a49a21253dab1dc3d19e6.png

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

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

c4cce831e51d3465d46da292073af8c7.png

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

3.2 成功复现

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

bde2afa1937f3eda170ff8cd54e4df01.png

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

f5b0cfa80beb6fca48a32c1868e5cd1a.png

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

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

推荐阅读

594433df5ebc1a004a6f6605267fef6f.png

6674d3e2b4af6936c7b98a4922f48c1e.png

23321b0cd287fdb3f31ba7d5da98847a.gif

f294b8f74e65b37035cea56f4bdbd783.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值