Wecenter 反序列化执行任意 SQL
2020-01-17 23:48:21 Author: mp.weixin.qq.com(查看原文) 阅读量:89 收藏

本文作者:Z1NG(信安之路核心成员)

在先知社区里看到一篇漏洞分析文章,个人觉得很赞,于是就动手跟进调试一遍。漏洞分析的时候会踩很多的坑,也试图寻找新的利用点,繁多的代码看的脑壳都疼了,而文章梳理下来看似很简单,很多东西上手了才知道。放上原作者的链接表示尊敬。

https://xz.aliyun.com/t/7077#toc-3

漏洞挖掘

挖掘反序列化的惯用手段为全局搜索 \__destruct 等魔术方法作为利用链的起点,此处全局搜索 __destruct 不难发现如下代码。

根据反序列化的特性,在 AWS_models 类中,析构函数由于 $this->_shutdown_query 是可控的,再未经处理就调用了 query 函数进行 SQL 语句的查询操作,显然是存在 SQL 注入的。

首先思考的问题,如果需要反序列出 AWS_Model 类的对象,那么在整个程序运行的上下文中需要已经加载了这个类文件。

观察这个套系统初始化程序,得益于自动类加载的机制,我们需要反序列化的类文件会在程序初始化的过程就加载进运行环境的上下文之中,也就满足了了利用条件。现代框架大多都有此类自动加载类库的机制,为后续调用类中的方法提供了便利,同时也对构造 POP 链提供了便利。

那么,只需要寻找一个触发点,能够触发这个利用即可。由于能力有限,全局搜索 unseriallize 关键字,并未发现可利用的触发点。但是事情到此并未结束,PHP 反序列化中还可以使用 Phar 文件来扩充攻击面。

如果想要 Phar 文件来触发反序列化,那么就需要找到这套程序对文件操作的代码,全局搜索 file_get_contentsis_file 等函数。(原作者很聪明的使用正则,以及发现下面的利用方式真心佩服。)

如下代码,可看到 file_get_contents 中传入了 $headimgurl,像是一个头像地址的变量,此处这个变量可控的话,就可以触发反序列。

通过回溯,可看到 synch_img_action 方法在 1895 行处调用了 associate_remote_avatar 方法。

下述代码的功能为先从数据库查询出 avatar_file 为空,也就是没有头像的用户的数据,这一点很重要。简而言之,此处的功能大概就是使用微信头像作为本系统账号的头像。

由于 $wxuser['headimgurl'] 是从数据库取出的数据,那么想要控制它,则要找到插入的地方。全局搜索,可以找到 bin_account 方法,在最后部分进行了插入操作,回溯看看 $access_user 和 $access_token 是否可控。

回溯调用 bin_account 方法的地方,逐个排查后,比较容易利用的是此处,如下图所示:259 行处通过 COOKIE 传入一个 json 字符串,然后解析完成之后进行绑定操作。

从此来看,我们已经可以向数据库的 headimgurl 字段插入任意值了。

漏洞利用

先理清一下攻击思路,生成一个 Phar 文件包含反序列化的 Payload,然后找到一个可上传文件的地方上传该文件,成功上传后会得到文件保存的地址,接着构造数据包将图片地址插入到数据库的 headimgurl 字段,最后再构造一个数据包,去触发 file_get_contents 来获取该文件引发反序列化!

第一步生成 Phar 文件并上传

第二步,构造数据包,进行微信绑定操作,cookie 中携带了 payload

第三步,触发反序列化

最后

不得不佩服漏洞原作者能够在众多逻辑功能中找到这么一条利用链。从单个功能看,上传文件没问题,绑定微信头像的操作也应该算是没问题。但组合起来却能够达到任意执行 SQL 语句的效果。能够执行任意 SQL 语句,如果权限足够,是可以直接写 shell 了。

管理员后台对网站管理界面有可以设置允许上传文件后缀的操作,漏洞原作者利用 SQL 语句直接进行设置,然后就可以上传 PHP 文件了,思路还是很棒的。正如原作者提到,这里面还存在一个 SSRF 漏洞是无回显的,那么又是另一个故事了。


文章来源: http://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247492099&idx=1&sn=e6d870988b1def09b091954c2880db0d&chksm=ec1dd22bdb6a5b3d668db8287f40428db61b636d672a93f0df7e12117162035c8bb6d05041c6#rd
如有侵权请联系:admin#unsafe.sh