zzcms2020代码审计笔记
2024-10-19 10:18:39
在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,点到为止,类似的注入还有很多,就不一一验证了:
最新文章
- Windows 10 版本 1507 中的新 AppLocker 功能
- android之Volley实现瀑布流
- Arcgis 几何网络分析
- Hadoop HDFS编程 API入门系列之HdfsUtil版本2(七)
- 物理系统迁移虚拟化P2V技术
- LAMT基于mod_jk方式的负载均衡集群
- MVC缓存技术
- Recommender Systems 基于知识的推荐
- SharePoint 学习记事(三)
- careercup-数学与概率 7.7
- HOWTO:保存nohup日志
- iOS中的retainCount
- 解决ie阴影的兼容性
- libconfig第二篇----两个小例子
- Python中将一个对象倒序输出的4种方法
- [Swift]LeetCode488. 祖玛游戏 | Zuma Game
- Hibernate Tools生成注释
- because its MIME type (&#39;text/html&#39;) is not executable, and strict MIME type checking is enabled
- java项目配置域名(tomcat直接配置 or 使用nginx反向代理)
- C#、Java、Javascript获取Unix时间戳