zhicms从前台SQL注入到RCE
字数 1245 2025-08-23 18:31:09
ZhiCMS 从前台SQL注入到RCE漏洞分析与利用
0x00 漏洞概述
ZhiCMS是一款专业的值得买系统,支持国内值得买海淘值得买,内置淘点金、亿起发淘金链、多麦多金链等功能。该系统存在严重的安全漏洞,从前台SQL注入可获取管理员凭证,进而通过后台功能实现远程代码执行(RCE)。
0x01 环境与目录结构
环境要求:
- PHP 7.1.9
- MySQL
目录结构:
/app 控制器及模型目录
/data/cache 缓存
/data/config 数据库及其他配置
/public 前端静态文件目录
/upload 上传文件的存放目录
/ZhiCms 存放zhicms框架核心文件
0x02 SQL注入漏洞分析
漏洞位置
漏洞存在于ZhiCms/base/Controller.php的arg()方法中,该方法用于获取传入的数据。
安全机制分析
arg()方法对输入数据进行了以下处理:
- 进行了一些替换操作
- 使用
htmlspecialchars转义$_POST/$_GET数据 ENT_QUOTES参数会对单引号和双引号进行转义
这意味着常规的SQL注入会被过滤,需要寻找:
- 整型注入
- 可绕过的注入点
实际注入点
在app/index/controller/cheapscontroller.php的index()方法中,发现使用urldecode包裹arg(),这允许通过URL编码绕过安全处理。
注入验证
测试请求:
GET /index.php?r=index/cheaps/index&key=test&XDEBUG_SESSION_START=16722 HTTP/1.1
Host: localhost
[...其他头部...]
注入点分析:
在ZhiCms/base/db/MysqlPdoDriver.php的query()方法中,输入被直接拼接进SQL语句。
注入Payload
- 布尔盲注Payload(需要两次URL编码):
test%' and (select * from (select if(ascii(substr(database(),1,1))>0,sleep(1),1))A)#
- 堆叠注入Payload:
test%';select sleep(1)#
堆叠注入原理:
在ZhiCms/base/db/MysqlPdoDriver.php的_bindParams()方法中,拼接好的SQL语句直接传递给prepare,这使得堆叠注入成为可能。
0x03 文件写入RCE漏洞分析
获取后台权限
通过SQL注入可以获取后台管理员账户密码,从而获得后台管理权限。
RCE漏洞位置
在app/manage/controller/setcontroller.php的index()方法中,存在可写入文件的RCE漏洞。
漏洞代码分析
public function index(){
if(!IS_POST){
// 显示设置页面
$this->pagetext=array("基础设置","网站设置");
include CONFIG_PATH . 'siteconfig.php';
$this->ret=$Siteinfo;
$this->display();
}else{
// 处理POST请求
$sitename=$_POST['sitename'];
$hosturl=$_POST['hosturl'];
$logo=$_POST['logo'];
$ewm=$_POST['ewm'];
$pid=$_POST['pid'];
$appkey=$_POST['appkey'];
$secretKey=$_POST['secretKey'];
$apiurl=$_POST['apiurl'];
$code=$_POST['code'];
$zhuan=$_POST['zhuan'];
$download=$_POST['download'];
$content=" <?php \r\n\ $Siteinfo = array ( 'sitename' => '{$sitename}' , 'hosturl' => '{$hosturl}' , 'logo' => '{$logo}' , 'ewm' => '{$ewm}' , 'pid' => '{$pid}' , 'appkey' => '{$appkey}' , 'secretKey' => '{$secretKey}' , 'apiurl' => '{$apiurl}' , 'code' => '{$code}' , 'zhuan' => '{$zhuan}' , 'download' => '{$download}' , ); ";
$of = fopen(CONFIG_PATH . 'siteconfig.php', 'w');
if ( $of ) {
fwrite( $of , $content );
}
fclose( $of );
echo json_encode(array(" info " => " 设置成功 ", " status " => " y "));
}
}
漏洞利用
通过构造恶意POST请求,可以向data/config/siteconfig.php写入PHP代码,实现RCE。
利用步骤:
- 通过SQL注入获取管理员凭证
- 登录后台
- 构造恶意POST请求,在任意参数中插入PHP代码
- 访问写入的shell文件(
data/config/siteconfig.php)执行任意代码
0x04 防御建议
-
SQL注入防御:
- 使用参数化查询(prepared statements)
- 对用户输入进行严格过滤和转义
- 避免直接拼接SQL语句
-
文件写入防御:
- 对写入内容进行严格过滤
- 限制可写入的文件路径
- 对PHP代码进行检测和过滤
- 使用文件权限控制
-
其他建议:
- 最小权限原则运行应用
- 定期安全审计
- 及时更新补丁