logo头像

黑客的本质就是白嫖

zzcms CVE复现(上)

前言

前几天和大哥说想学代码审计,大哥让我这周有时间就复现一下zzcms里面的所有cve,既然要学的话,那大哥的话肯定得听的!

复现tmd

zzcms介绍

摘自官网:

站长招商网内容管理系统简称 ZZCMS,由ZZCMS团队开发,融入数据库优化,内容缓存,AJAX等技术,使网站的安全性 、稳定性 、负载能力得到可靠保障。源码开放,功能模块独立,便于二次开发。

我在cve官网上一共找到34个zzcms的cve,接下来就一个一个的复现一下,希望至少可以让自己在代码审计上入门

复现

CVE-2018-1000653

CVE URLhttp://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000653
poc URLhttps://gist.github.com/Lz1y/3388fa886a3e10edd2a7e93d3c3e5b6c
这个CVE出现在zzcms8.3版本的/zt/top.php处,漏洞代码如下

1
2
3
4
//echo $_SERVER['REQUEST_URI'];
$editor=isset($_REQUEST['editor'])?$_REQUEST['editor']:'';
$editor=substr($_SERVER['HTTP_HOST'],0,strpos($_SERVER['HTTP_HOST'],'.'));//从二级域名中获取用户名
$rs=query("select * from zzcms_userdomain where domain='".$_SERVER['HTTP_HOST']."' and passed=1 and del=0");//从顶级级域名中获取用户名

可以看到,在第三行处,直接将$_SERVER[‘HTTP_HOST’]插入到了查询语句中并且没有任何过滤,这就造成了SQL注入,只要我们找到一个引用了这个页面的页面,就可以利用这个漏洞了

zzcms_1.png

zzcms_2.png

这里可以看到这个目录下有很多页面都引入了这个文件,我们来尝试一下利用
这里碰到一个问题,修改了host的话,会出现400错误,那就先跳过这一个,往下复现过去
找到了问题,这一个漏洞就不复现了,链接

CVE-2018-13056

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-13056
poc URLhttps://github.com/actionyz/ZZCMS/blob/master/del.php.md
漏洞位置:user/del.php,影响版本:zzcms8.3
zzcms_4.png

可以看到这里对查询结果中的img进行判断,如果不等于/image/nopic.gif的话就在前面加上../并且删除,而这个查询结果可以在下面的代码中看到,来自表zzcms_main

1
2
3
4
5
6
7
if (strpos($id,",")>0){
$sql="select img,flv,editor from zzcms_main where id in (".$id.")";
}else{
$sql="select img,flv,editor from zzcms_main where id ='$id'";
}
$rs=query($sql);
$row=num_rows($rs);

所以我们需要找到一个可以向这张表插入信息的地方,经过搜索,只有zssave.php处可以向其中插入数据
zzcms_5.png
那只需要在这个页面提交数据,并且使img的内容为任意文件就能导致任意文件删除了
zzcms_19.png
发布成功,接下来去删除
zzcms_20.png
zzcms_21.png
zzcms_22.png
删除成功

CVE-2018-13116

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-13116
poc URL https://github.com/actionyz/ZZCMS/blob/master/SQL/1/del.php.md
漏洞位置:user/del.php,影响版本:zzcms8.3
zzcms_23.png
在这个判断上一级有一个tablename判断,不同的tablename使用不同的SQL语句

1
2
3
4
5
6
if ($tablename=='zzcms_guestbook'){//saver
...
}elseif ($tablename=='zzcms_dlly'){//saver 切不是从数据库中删,而是隐藏
...
}else{
...

可以看到除了上面两个表外,其他表都是用的同一个查询语句
$sql="select id,editor from“.$tablename.”where id in (". $id .")";
为了不触发下面的非法操作报错,我们需要先通过别的表插入数据,再利用这个漏洞
zzcms_69.png
添加成功,但是在尝试利用的时候发现了如下问题
zzcms_70.png
之后在同一文件找到这样一段代码
zzcms_71.png
很明显这样是没办法绕过的,不知道找到CVE的那个人是如何绕过这一段代码或者说在那人找到漏洞时并没有这一段代码…

CVE-2018-14961

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14961
poc URL

查询成功,但是这里发送邮件需要设置邮件服务器,可能要在本地搭一个,所以我就直接把结果给var_dump出来了
zzcms_72.png

CVE-2018-14962

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14962
poc URL https://github.com/AvaterXXX/ZZCMS/blob/master/README.md
漏洞位置:user/manage.php,影响版本:zzcms8.3
zzcms_7.png
zzcms_8.png
一个存储型XSS,问题出在update时没有对content变量进行过滤或编码,show页面又直接将content输出到屏幕上,从而导致了XSS
构造payload,保存,成功!!!
zzcms_9.png
终于成功复现了一个,这里要注意的就是在写入payload的时候需要切换到源码模式,我本来以为自己又复现失败了,还好注意到了这个
zzcms_10.png

CVE-2018-14963

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14963
poc URL https://github.com/AvaterXXX/ZZCMS/blob/master/README.md
发现这连续三个poc地址都是同一个大佬,膜一波
这是一个CSRF,应该就是配合上面那个存储型XSS使用的,大佬给了一个poc

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://10.10.10.39:8080/admin/adminadd.php?action=add" method="POST">
<input type="hidden" name="groupid" value="1" />
<input type="hidden" name="admins" value="123" />
<input type="hidden" name="passs" value="123" />
<input type="hidden" name="passs2" value="123" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>

将以上代码插入至刚刚的页面中,只要管理员访问了这个页面其密码就会被修改为123

CVE-2018-16344

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16344
poc URL https://github.com/cumtxujiabin/CmsPoc/blob/master/zzcms_8.3_file_del.md
漏洞位置:user/del.php,影响版本:zzcms8.3
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($row['img']<>"/image/nopic.gif"){
$f="../".substr($row['img'],1);
if (file_exists($f)){
unlink($f);
}
$fs="../".substr(str_replace(".","_small.",$row['img']),1)."";
if (file_exists($fs)){
unlink($fs);
}
}
if ($row['flv']<>''){//flv里没有设默认值
$f="../".substr($row['flv'],1);
if (file_exists($f)){
unlink($f);
}
}

其实这个CVE核心代码与CVE-2018-13056是同一个地方,只不过后者是验证图片,这个CVE是验证视频,这个CVE有利用限制,就是管理员必须把用户上传视频的权限打开
zzcms_12.png
管理员在用户组管理处将上传视频勾上,这个漏洞才能被利用,下面是利用
user/zsadd.php页面发布信息时,选择一个视频上传
zzcms_11.png
将参数flv修改成../install/install.lock,即系统安装锁,这个文件被删除之后,任何用户都可以直接访问install目录将系统重装
zzcms_13.png
zzcms_14.png
成功删除目标文件,复现成功,现在好像大致知道了一点点前面复现为什么失败了,继续尝试

CVE-2018-17136

CVE URL http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17136
poc URL https://github.com/TEag1e/zzcms
漏洞位置:user/check.php,影响版本:zzcms8.3
zzcms_15.png
zzcms_16.png
这里可以看到,我们可以通过CLIENT-IP或者X-Forwarded-For或者Remote-Addr修改ip来控制输入从而造成SQL注入
所以我们只需要找到一个包含了user/check.php的页面即可利用
就还是用刚才这个页面吧
zzcms_17.png
这里将公司信息的电话这一项设为的数据库名,待会可以在公司信息处看到
zzcms_18.png
注入成功

评论系统未开启,无法评论!