cache\config目录下Cron.php内add()函数对于用户的输入没有进行专门的过滤,致使攻击者在具备管理员权限或具有”应用”->”任务队列”的管理权限时可以对WRITEPATH.’config/cron.php’文件写入任意内容,同时该文件有多处被包含且可以被利用的点,正常情况下具有上述的触发条件即可稳定触发该漏洞
1.迅睿CMS 版本为v4.3.3到v4.5.1
2.登录后台,且为管理员或具有”应用”->”任务队列”的管理权限
用Seay定位cron下的add()函数
// 任务类型
public function add() {
$json = '';
if (is_file(WRITEPATH.'config/cron.php')) {
require WRITEPATH.'config/cron.php';
}
$data = json_decode($json, true);
if (IS_AJAX_POST) {
$post = \Phpcmf\Service::L('input')->post('data', true);
file_put_contents(WRITEPATH.'config/cron.php',
'system_log('设置自定义任务类型');
$this->_json(1, dr_lang('操作成功'));
}
\Phpcmf\Service::V()->assign([
'data' => $data,
]);
\Phpcmf\Service::V()->display('cron_add.html');
}
(1)add()函数会在WRITEPATH.’config/cron.php’文件存在时包含该文件,然后通过json_decode($json, true)函数给$data赋值Null
(2)然后进入一个if分支语句,当IS_AJAX_POST时,则执行相关的写入文件的代码,否则则跳过写入文件,显示Cron的添加页面,随即结束add()函数,IS_AJAX_POST定义为当收到post请求且post的内容不为空时即返回TRUE,否则返回FALSE
(3)if语句中,首先\Phpcmf\Service::L(‘input’)->post(‘data’, true)该代码通过调用Input.php文件里定义的Input类的post()函数,在接收到post请求且存在key为data时进行xss过滤然后返回,否则直接返回false,然后赋值给$post
(4)if语句中,接收完post请求,即将接收到的内容通过json编码后写入WRITEPATH.’config/cron.php’文件,可控的写入点位于字符串$json的赋值中,且在两个’的包裹中,此处是漏洞产生的主要原因,未对用户的输入做足够的判断或清洗即写入相应的文件
在/Admin.php?c=Cron&m=add页面不添加内容直接点击保存时生成的cron.php
(1)把会被检测到的字符或字符组合,通过各种编码进行绕过
比如’));return;’%5D)
放包后会在cache\config处生成一个cron.php
(4)绕过json编码和xss过滤后,写入WRITEPATH.’config/cron.php’文件中的内容为:
'));return;']"}}';
(5)访问http://host:port/Admin.php?c=Cron&m=add后,在网站根目录下会生成一个名为webshell.php的文件,文件内容为```php
```
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.