起源:
安装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行,分别对应写入 system
和 database
两个文件

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

由于第17行中有 extract
函数的存在,我们可以控制写入文件的参数。
写入 system.php
的配置较难控制,源码中有进行字符串拼接。所以我们选择控制写入 database.php
的配置
POC
1 | POST /install/install.php?step=installmodule |
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(); |
