记一次项目中迅睿CMS反序列化漏洞挖掘
影响版本
version<=2023-06-24(目前最新版)
环境搭建
官网自行下载安装迅睿CMS
代码分析
漏洞触发点在后台并且新版安装后的后台地址为admin+md5(随机数),没啥用。


反序列化触发点
dayrui/Fcms/Core/Helper.php
注意: 这里使用了stripslashes()函数进行过滤,为了正确地进行反序列化操作,需要对传入的字符串 “xxx\aaa” 进行修改,将其变为 “xxx\\aaa”。

漏洞入口点
后台很多调用dr_string2array()方法,并且没有进行参数过滤。 这里随便找了一个。
dayrui/Fcms/Control/Admin/Field.php
分析下这段代码,首先\Phpcmf\Service::L(‘input’)->post(‘code’)该代码通过调用Input.php文件里定义的Input类的post()函数,在接收到post请求且存在key为code时进行xss过滤并返回。


分析利用链,这里只有5个__destruct()不多一个个看。

__destruct利用地址1:
dayrui/CodeIgniter/System/Email/Email.php
由于这里is_resource()是判断是否为资源类型,无法绕过Pass掉。

__destruct利用地址2:
dayrui/Fcms/Library/Tree.php无法触发魔术函数Pass掉。

__destruct利用地址3:
dayrui/CodeIgniter/System/Cache/Handlers/MemcachedHandler.php 后续跟了下无法深度利用,暂时不看。

__destruct利用地址4:
dayrui/CodeIgniter/System/Cache/Handlers/RedisHandler.php
这里就有很多路线可走,这里就直接分析挖好的利用链,所有方法看完了都没找到命令执行和文件写入就是太菜了,只找到了一个文件删除垃圾链。

这里相当于redis可控,只要找到一个类有close()方法就可以继续往下走,或者找一个类不存在close()方法从而触发__call由于分析走__call没找到特别好用的就不分析了。
这里找到dayrui/CodeIgniter/System/Session/Handlers/MemcachedHandler.php相当于memcached和lockKey可控。继续往下在找


这里找到了dayrui/CodeIgniter/System/Cache/Handlers/FileHandler.php,首先将传入的key、prefix参数传入到validateKey静态方法中,这里key、prefix都可控。

这里判断传入的key是否为字符串类型和不为空,最后将key和prefix拼接判断长度是否超过了最大键长度,如果没有返回拼接后的值。 之前说了key、prefix都可控而key是由lockKey进行赋值,例如lockKey = ".php",prefix = "api";–>api.php


最后将path和key进行拼接判断对应的文件是否存在,如果存在则删除该文件。一个完整的文件删除利用链构造成功。

利用链 任意文件删除
php7.1+反序列化对类属性不敏感,正好环境需要php7.4以上才能安装所以都写成public也不太影响。
1 |
|

