PHPCMS V9.6.3 install.php RCE

起源:

安装phpcms时发现其会修改配置文件,即

/phpcms/caches/configs/system.php

/phpcms/caches/configs/database.php

猜测进行了文件写入的操作

翻看代码发现写入文件时是根据传入参数进行写入的,而且没有做保护。


漏洞位置:

/phpcms/install/install.php 177 行的 case 'installmodule': 这一段开始

178行中将 $_POST 里的变量导入了符号表,即 $_POST 中传递的参数可以变成变量,类似这样:

写入文件的操作是在 if($module == 'admin') 里面的

要进入这个判断只需要 POST 传参 的时候带一个 module=admin 过来即可

写入文件的操作在 209行和210行,分别对应写入 systemdatabase 两个文件

查看 set_config 函数,发现其对 config文件 进行了写入操作。通过正则匹配来进行指定的替换。

由于第17行中有 extract 函数的存在,我们可以控制写入文件的参数。

写入 system.php 的配置较难控制,源码中有进行字符串拼接。所以我们选择控制写入 database.php 的配置


POC

1
2
POST /install/install.php?step=installmodule
module=admin&dbport=3306&pconnect=eval($_GET["a"])

ps:

这里控制的是 pconnect 参数,因为默认它没有单引号比较好调试。

注意这里如果不传 dbport参数 的话 database.php 里的 port参数 会置空,将会报错。就无法执行到后面的 eval

被修改后的 database.php


RCE

1
http://192.168.1.105/phpcms/tmp/a/phpcms/caches/configs/database.php?a=phpinfo();