在CNVD中看到zzcms后台sql注入漏洞:

漏洞细节未被公开,影响版本zzcms2020,本地搭建一套相同版本找一下漏洞触发点。

打开目录,后台ba***.php文件共有三个:

先看下bad.php,本地环境数据库中无数据,随便插点数据,访问http://localhost/admin/bad.php,功能如下:

看下删除功能代码块:

if ($action=="del"){
if (strpos($id,",")>0){
$sql="delete from zzcms_bad where id in (". $id .")";
}else{
$sql="delete from zzcms_bad where id='$id'";
}
query($sql);
echo "<script>location.href='bad.php'</script>";
}

$id代入sql语句执行,我们看下$id如何处理:

if ($action<>""){
$id="";
if(!empty($_POST['id'])){
for($i=0; $i<count($_POST['id']);$i++){
$id=$id.($_POST['id'][$i].',');
}
$id=substr($id,0,strlen($id)-1);//去除最后面的","
} if ($id==""){
echo "<script>alert('操作失败!至少要选中一条信息。');history.back();</script>";
}
}

这里$id未做处理,但是在文件中包含了防注入文件:

<?php include("admin.php");?>

追下admin.php:

<?php
include("../inc/conn.php");

继续追下/inc/conn.php:

<?php
error_reporting(0);
define('zzcmsroot', str_replace("\\", '/', substr(dirname(__FILE__), 0, -3)));//-3截除当前目录inc
ini_set("date.timezone","Asia/Chongqing");//设时区。php.ini里date.timezone选项,默认情况下是关闭的
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");
include(zzcmsroot."/inc/area.php");

这里的stopsqlin.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($_COOKIE){
$_COOKIE =zc_check($_COOKIE);
}
if($_REQUEST){
$_POST =zc_check($_POST);
$_GET =zc_check($_GET);
@extract($_POST);
@extract($_GET);
}

代码利用魔术引号或addslashes函数和htmlspecialchars函数对用户的所有COOKIE和REQUEST进行过滤,关键字符'被过滤了。

重新观察下代码:

if ($action=="del"){
if (strpos($id,",")>0){
$sql="delete from zzcms_bad where id in (". $id .")";
}else{
$sql="delete from zzcms_bad where id='$id'";
}
query($sql);
echo "<script>location.href='bad.php'</script>";
}

当传入多个id时,SQL语句没有拼接单引号,从而产生注入,省时间直接丢sqlmap:

这个注入需要管理员权限登录后台才能利用,比较鸡肋,简单看了下基础功能都是调用stopsqlin.php来进行过滤,那么有可能在前台存在类似的注入。全局搜索下in (:

后台的文件先无视掉,这个文件吸引了我们的注意,看下代码:

if (!isset($_COOKIE["UserName"])){
showmsg('请先登录','/user/login.php');
} $username=$_COOKIE["UserName"];
$id="";
$i=0;
if(!empty($_POST['id'])){
for($i=0; $i<count($_POST['id']);$i++){
$id=$id.($_POST['id'][$i].',');
}
}else{
$founderr=1;
$ErrMsg="<li>操作失败!请先选中要下载的信息</li>";
}
$id=substr($id,0,strlen($id)-1);//去除最后面的"," if (strpos($id,",")>0){
$sql="select * from zzcms_dl where passed=1 and id in (". $id .") order by id desc";
}else{
$sql="select * from zzcms_dl where passed=1 and id='$id'";
}

和后台的bad.php类似,妥妥的注入了,需要注册登录一个普通用户账号,注入过程就不重复说明了。

到官网演示环境测试一下,官网提供了普通用户测试账号test/test:

OK,点到为止,类似的注入还有很多,就不一一验证了:

zzcms2020代码审计笔记的更多相关文章

  1. SeacmsV10.7版代码审计笔记

    data: 2020.11.9 10:00AM description: seacms代码审计笔记 0X01前言 seacms(海洋cms)在10.1版本后台存在多处漏洞,事实上当前最新版V10.7这 ...

  2. PHP代码审计笔记--弱类型存在的安全问题

    0x01 前言 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型. 弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整 ...

  3. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

  4. PHP代码审计笔记--代码执行漏洞

    漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞. 常见代码注射函数: 如:eval.preg_replace+/e.assert.call_user_func. ...

  5. PHP代码审计笔记--任意文件下载漏洞

    在文件下载操作中,文件名及路径由客户端传入的参数控制,并且未进行有效的过滤,导致用户可恶意下载任意文件.  0x01 客户端下载 常见于系统中存在文件(附件/文档等资源)下载的地方. 漏洞示例代码: ...

  6. PHP代码审计笔记--命令执行漏洞

    命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: <?php $target=$_REQUEST['ip']; ...

  7. PHP代码审计笔记--URL跳转漏洞

    0x01 url任意跳转 未做任何限制,传入任何网址即可进行跳转. 漏洞示例代码: <?php $redirect_url = $_GET['url']; header("Locati ...

  8. PHP代码审计笔记--文件包含漏洞

    有限制的本地文件包含: <?php include($_GET['file'].".php"); ?> %00截断: ?file=C://Windows//win.in ...

  9. PHP代码审计笔记--任意文件上传

     0x01 最简单的文件上传 未进行文件类型和格式做合法性校验,任意文件上传 漏洞代码示例: 新建一个提供上传文件的 upload.html <html> <body> < ...

随机推荐

  1. HCNA Routing&Switching之动态路由协议RIP

    前文我们了解了动态路由的基本概念,以及动态路由和静态路由的区别,优缺点,动态路由的分类,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14995317.html ...

  2. 「AGC021E」Ball Eat Chameleons

    「AGC021E」Ball Eat Chameleons 考虑如何判定一个合法的颜色序列. 不妨设颜色序列中有 \(R\) 个红球,\(B\) 个蓝球,所以有 \(R+B=k\). 考虑分情况讨论: ...

  3. C语言:char总结

    char字符型数据1.用单引号限制的1字节的字符称为字符型数据,字符型常量2.字符型常量实质保存的是对应字符的ASCII码值,是一个整数3.字符型常量表示范围:0-2554.声明字符型变量 char ...

  4. Modelsim波形显示字符

    偶然在 QQ 群里看到一个大佬发的 Modelsim 波形显示字符,闲着没事拿来玩玩,并将改良过程也整理一下. 一.字符点阵产生 软件采用 PCtoLCD2002,打开后不需要设置,直接打字然后点击[ ...

  5. SQL注入:sqli-labs lesson-1 小白详解

    为什么是小白详解?因为我就是小白 SQL注入早有耳闻,今天算是真正打开这个门了,但是想要跨进去应该还是没有那么容易. 在B站上听了40分钟的网课,老实说,他讲的还不错,第一遍听不懂也正常 https: ...

  6. PAT乙级:1070 结绳 (25分)

    PAT乙级:1070 结绳 (25分) 题干 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟 ...

  7. [SHOI2014]概率充电器 题解

    注意到本题的贡献是不带权的,所以期望其实就是每个点的概率之和. 本题正着做好像不是很好做,要考虑 \(P(A+B)=P(A)+P(B)-P(A)P(B)\) 的容斥(因为这是两个条件至少满足一个,所以 ...

  8. odoo视图 “动作” 里添加菜单按钮:案例

    ####################################################################################odoo中常用方法,在动作里面添 ...

  9. C++第三十五篇 -- 写第一个驱动开发程序

    VS2017+WDK+VMware12+Win10环境配置完毕,接下来写第一个驱动程序. 1.新建一个KMDF的程序. 2.配置项目属性. 3.编译项目.一般这里应该成功,我一台电脑成功了,另一台电脑 ...

  10. (JAVA3)MarkDown语法

    (三)MarkDown语法 分级标题(用 #数量 表示 级标题) #+空格+一级标题+回车 = 一级标题 ##+空格+二级标题+回车 = 二级标题 ###+空格+三级标题+回车 = 三级标题 加粗 选 ...