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.phparg()方法中,该方法用于获取传入的数据。

安全机制分析

arg()方法对输入数据进行了以下处理:

  1. 进行了一些替换操作
  2. 使用htmlspecialchars转义$_POST/$_GET数据
  3. ENT_QUOTES参数会对单引号和双引号进行转义

这意味着常规的SQL注入会被过滤,需要寻找:

  • 整型注入
  • 可绕过的注入点

实际注入点

app/index/controller/cheapscontroller.phpindex()方法中,发现使用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.phpquery()方法中,输入被直接拼接进SQL语句。

注入Payload

  1. 布尔盲注Payload(需要两次URL编码):
test%' and (select * from (select if(ascii(substr(database(),1,1))>0,sleep(1),1))A)#
  1. 堆叠注入Payload
test%';select sleep(1)#

堆叠注入原理
ZhiCms/base/db/MysqlPdoDriver.php_bindParams()方法中,拼接好的SQL语句直接传递给prepare,这使得堆叠注入成为可能。

0x03 文件写入RCE漏洞分析

获取后台权限

通过SQL注入可以获取后台管理员账户密码,从而获得后台管理权限。

RCE漏洞位置

app/manage/controller/setcontroller.phpindex()方法中,存在可写入文件的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。

利用步骤

  1. 通过SQL注入获取管理员凭证
  2. 登录后台
  3. 构造恶意POST请求,在任意参数中插入PHP代码
  4. 访问写入的shell文件(data/config/siteconfig.php)执行任意代码

0x04 防御建议

  1. SQL注入防御

    • 使用参数化查询(prepared statements)
    • 对用户输入进行严格过滤和转义
    • 避免直接拼接SQL语句
  2. 文件写入防御

    • 对写入内容进行严格过滤
    • 限制可写入的文件路径
    • 对PHP代码进行检测和过滤
    • 使用文件权限控制
  3. 其他建议

    • 最小权限原则运行应用
    • 定期安全审计
    • 及时更新补丁

0x05 参考链接

ZhiCMS 从前台SQL注入到RCE漏洞分析与利用 0x00 漏洞概述 ZhiCMS是一款专业的值得买系统,支持国内值得买海淘值得买,内置淘点金、亿起发淘金链、多麦多金链等功能。该系统存在严重的安全漏洞,从前台SQL注入可获取管理员凭证,进而通过后台功能实现远程代码执行(RCE)。 0x01 环境与目录结构 环境要求 : PHP 7.1.9 MySQL 目录结构 : 0x02 SQL注入漏洞分析 漏洞位置 漏洞存在于 ZhiCms/base/Controller.php 的 arg() 方法中,该方法用于获取传入的数据。 安全机制分析 arg() 方法对输入数据进行了以下处理: 进行了一些替换操作 使用 htmlspecialchars 转义 $_POST/$_GET 数据 ENT_QUOTES 参数会对单引号和双引号进行转义 这意味着常规的SQL注入会被过滤,需要寻找: 整型注入 可绕过的注入点 实际注入点 在 app/index/controller/cheapscontroller.php 的 index() 方法中,发现使用 urldecode 包裹 arg() ,这允许通过URL编码绕过安全处理。 注入验证 测试请求 : 注入点分析 : 在 ZhiCms/base/db/MysqlPdoDriver.php 的 query() 方法中,输入被直接拼接进SQL语句。 注入Payload 布尔盲注Payload (需要两次URL编码): 堆叠注入Payload : 堆叠注入原理 : 在 ZhiCms/base/db/MysqlPdoDriver.php 的 _bindParams() 方法中,拼接好的SQL语句直接传递给 prepare ,这使得堆叠注入成为可能。 0x03 文件写入RCE漏洞分析 获取后台权限 通过SQL注入可以获取后台管理员账户密码,从而获得后台管理权限。 RCE漏洞位置 在 app/manage/controller/setcontroller.php 的 index() 方法中,存在可写入文件的RCE漏洞。 漏洞代码分析 漏洞利用 通过构造恶意POST请求,可以向 data/config/siteconfig.php 写入PHP代码,实现RCE。 利用步骤 : 通过SQL注入获取管理员凭证 登录后台 构造恶意POST请求,在任意参数中插入PHP代码 访问写入的shell文件( data/config/siteconfig.php )执行任意代码 0x04 防御建议 SQL注入防御 : 使用参数化查询(prepared statements) 对用户输入进行严格过滤和转义 避免直接拼接SQL语句 文件写入防御 : 对写入内容进行严格过滤 限制可写入的文件路径 对PHP代码进行检测和过滤 使用文件权限控制 其他建议 : 最小权限原则运行应用 定期安全审计 及时更新补丁 0x05 参考链接 PDO场景下的SQL注入探究