ZZCMS v8.2代码审计入门

zzcms8.2

链接:https://pan.baidu.com/s/1NHAcGAX2C3dG2zWVvej7hw

提取码:tatj

0x00查看目录结构

*********************************
*               *
*   ZZCMS产品版目录结构    *
*               *
*********************************

/install 安装程序目录(安装时必须有可写入权限)
/admin 默认后台管理目录(可任意改名)
/user 注册用户管理程序存放目录
/skin 用户网站模板存放目录;更多用户网站模板可从http://www.zzcms.net/skin.asp 下载
/template 系统模板存放目录;更多系统模板可从http://www.zzcms.net/template.asp 下载
/inc 系统所用包含文件存放目录
/area 各地区显示文件
/zs 招商程序文件
/dl 代理
/zh 展会
/company 企业
/job 招聘
/zx 资讯
/special专题
/pp 品牌
/wangkan 网刊
/ask 问答
/zt 注册用户展厅页程序
/one 专存放单页面,如公司简介页,友情链接页,帮助页都放在这个目录里了
/ajax ajax程序处理页面
/reg 用户注册页面
/3 第三方插件存放目录
    /3/ckeditor CK编缉器程序存放目录
    /3/alipay 支付宝在线支付系统存放目录
    /3/tenpay 财富通在线支付系统存放目录
    /3/qq_connect2.0 qq登录接口文件
    /3/ucenter_api discuz论坛用户同步登录接口文件
    /3/kefu 在线客服代码
    /3/mobile_msg 第三方手机短信API
    /3/phpexcelreader PHP读取excel文件组件
/cache 缓存文件
/uploadfiles 上传文件存放目录
/dl_excel 要导入的代理信息excel表格文件上传目录
/image 程序设计图片,swf文件存放目录
/flash 展厅用透明flash装饰动画存放目录
/js js文件存放目录
/html 静态页存放目录

/favicon.ico 地址栏左侧小图标文件
/web.config 伪静态规则文件for iis7(万网比较常用)
/httpd.ini  伪静态规则文件for iss6
/.htaccess  伪静态规则文件for apache

0x01 了解大概结构

寻找名称里有没有带有api、admin、manage、include一类关键字的文件和文件夹,通常这些文件比较重要,在这个cms中主要是inc,admin,user,这三个目录,其中inc是主要的系统包含文件,其中,config.php为配置文件, function.php功能函数文件, stopsqlin.php过滤文件以及其他文件通过conn.php文件包含在一起,conn.php文件还负责检测是否安装,以及数据库的连接。 admin为管理员文件,uesr为注册用户的功能文件

 

/inc/stopsqlin.php

代码

<?php
function zc_check($string){
    if(!is_array($string)){
        if(get_magic_quotes_gpc()){
        return htmlspecialchars(trim($string));
        }else{
        return addslashes(htmlspecialchars(trim($string)));
        }
     }
    foreach($string as $k => $v) $string[$k] = zc_check($v);
    return $string;
}
    
if($_REQUEST){
    $_POST =zc_check($_POST);
    $_GET =zc_check($_GET);
    $_COOKIE =zc_check($_COOKIE);
    @extract($_POST);
    @extract($_GET);
}

zc_check函数过滤了GET、POST、COOKIE请求中的sql注入和xss,这个函数是将$_REQUEST请求通过函数过滤,再重新给$_POSE、$_GET、$_COOKIE赋值,但掉了其本身的$_REQUEST请求。

测试代码

测试结果

通过post请求的fname参数单引号被过滤,但是用$_REQUEST请求的fname参数单引号没被过滤,所以可以通过查找相关request请求的参数来进行SQL注入。

0x02 网站重装

/install/index.php

打开/install/index.php

其判断是否安装的代码是在第一步(54行)

跟进一下

如果把请求参数$step=2则可以绕过检测

0x03 万能密码

/user/index.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"]);//过滤',/,\,<,>,�
    $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){
      .......

可以看到这个文件没有包含conn.php文件,所以其获得变量未经过过滤,第七行将$_COOKIE["UserName"]变量过滤了,后面的SQL语句对$_COOKIE["PassWord"]进行了直接调用,所以可以做个万能密码登入

测试

我们直接请求/user/index.php

当密码错误时会跳转至登录页面,我们试一下万能密码

0x04 SQL注入

/user/index.php文件

测试

上面的万能密码,我们还可以通过这个参数来做时间盲注

所以只要包含check文件的页面请求中的PassWord参数都有SQL注入的风险。

/user/adv.php文件

继续查看user下的文件,打开/user/adv.php发现36行-66行的参数全部是用$_REQUEST方式请求的,而且下面紧接着就是数据库请求(96行),还是带参数的那种,这不是巧了吗,这不是,不测都对不起程序猿小哥。

代码

测试

只测试了$adv参数,如下

搜索$_REQUEST["   相关文件也不少

/user/login.php

继续查看user目录,到/user/login.php文件,有个sql语句中有个$ip是通过getip()函数获取的

代码

跟进这个getip()函数

测试

发现是通过HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR、REMOTE_ADDR获取的,所以我们用X_FORWARDED_FOR试一下

0x05 文件上传

uploadflv.php

查看根目录下的uploadflv.php文件,发现如下几个检测方式。

代码

 

 

 

 

测试

第一个是检测type类型(修改Content-Type),第二个是检测文件名后缀(phtml后缀没有被过滤),第三个是检测文件内容获取文件大小(通过加GIF89a绕过)

上传成功后发现怎么也解析不了文件,后来发现是PHP study没有设置好,具体方式是打开phpstudy->其他选项菜单->打开配置文件->httpd-conf,搜索phtml把那个注释符删去重启就可以了

0x06 任意文件删除

这个可以通过搜索unlink函数,快速查一下

/user/adv.php

打开/user/adv.php文件

代码

很明显的文件删除,只要$action=modify,$oldimg不等于$img,就会删除$oldimg文件

测试

/admin/dl_data.php

还有一个在/admin/dl_data.php文件,第22行

代码

测试

 

 

*未经允许禁止转载!

参考文章:

https://www.cnblogs.com/wangtanzhi/p/12320922.html

 

 

 

posted @ 2020-10-08 20:58  薛定谔的猫~  阅读(545)  评论(0编辑  收藏  举报