CVE-2022-28585 SQL注入漏洞分析
漏洞情报:
漏洞分析:
根据漏洞情报,可以知道,漏洞点在 AdClass.php ,我们进入文件中查看:
<?php
define('EmpireCMSAdmin','1');
require("../../class/connect.php");
.....
$link=db_connect();
$empire=new mysqlquery();
$editor=1;
//验证用户
..........
//验证权限
CheckLevel($logininid,$loginin,$classid,"ad");
//增加广告类别
function AddAdClass($add,$userid,$username){
.......
}
//修改广告类别
function EditAdClass($add,$userid,$username){
.......
}
//删除广告类别
function DelAdClass($classid,$userid,$username){
.........
}
$enews=$_POST['enews'];
if(empty($enews)){$enews=$_GET['enews'];}
if($enews=="AddAdClass"){ //增加广告类别
$add=$_POST['add'];
AddAdClass($add,$logininid,$loginin);
}elseif($enews=="EditAdClass"){//修改广告类别
$add=$_POST['add'];
EditAdClass($add,$logininid,$loginin);
}elseif($enews=="DelAdClass"){ //删除广告类型
$classid=$_GET['classid'];
DelAdClass($classid,$logininid,$loginin);
}
$sql=$empire->query("select classid,classname from {$dbtbpre}enewsadclass order by classid desc");
?>
可以看到的,这里通过传入$enews来区分不同的操作,分别是增加、删除、修改广告类别,分别调用了AddAdClass()、EditAdClass()、DelAdClass()函数。我们这里先进入AddAdClass()函数看看:
function AddAdClass($add,$userid,$username){
global $empire,$dbtbpre;
if(!$add[classname]){
printerror("EmptyAdClassname","history.go(-1)");
}
//验证权限
CheckLevel($userid,$username,$classid,"ad");
$sql=$empire->query("insert into {$dbtbpre}enewsadclass(classname) values('$add[classname]');");
$classid=$empire->lastid();
if($sql){
//操作日志
insert_dolog("classid=".$classid."<br>classname=".$add[classname]);
printerror("AddAdClassSuccess","AdClass.php");
}else{
printerror("DbError","history.go(-1)");}
}
可见,这里执行SQL的地方在第8行,插入了我们传入的classname,并且在插入的时候并没有对参数进行过滤,所以这是一个漏洞点。
我们接着看看看EditAdClass()函数:
function EditAdClass($add,$userid,$username){
global $empire,$dbtbpre;
$add[classid]=(int)$add[classid];
if(!$add[classname]||!$add[classid])
{printerror("EmptyAdClassname","history.go(-1)");}
//验证权限
CheckLevel($userid,$username,$classid,"ad");
$sql=$empire->query("update {$dbtbpre}enewsadclass set classname='$add[classname]' where classid='$add[classid]'");
if($sql){//操作日志
insert_dolog("classid=".$add[classid]."<br>classname=".$add[classname]);
printerror("EditAdClassSuccess","AdClass.php");
}else {printerror("DbError","history.go(-1)");}
}
可以看到这里的SQL语句也在第8行,通过update语句,修改了calssname的值,被修改的新的数据,同样是我们传入的classname,在这里也没有进行任何操作就传入了,也是一个漏洞点。
我们再看看DelAdClass()函数
function DelAdClass($classid,$userid,$username){
global $empire,$public_r,$dbtbpre;
$classid=(int)$classid;
if(!$classid){printerror("NotChangeAdClassid","history.go(-1)");}
//验证权限
CheckLevel($userid,$username,$classid,"ad");
$c=$empire->fetch1("select classname from {$dbtbpre}enewsadclass where classid='$classid'");
$sql=$empire->query("delete from {$dbtbpre}enewsadclass where classid='$classid'");
if($sql){//操作日志
insert_dolog("classid=".$classid."<br>classname=".$c[classname]);
printerror("DelAdClassSuccess","AdClass.php");
}else{
printerror("DbError","history.go(-1)");
}
}
在这里通过$calssid来删除了我们的广告类别,但是calssid在传入后,使用了int强制转换,所以这里不存在漏洞点。
综合起来可以知道,这里存在两个漏洞点,分别是一个insert型注入和一个update型注入,只不过该漏洞点位于系统后台,需要登录后才能进行操作,危害相对低一些。
漏洞利用:
这里以其中一个漏洞点 EditAdClass()为例,利用报错注入获取数据的方法如下:
获取数据库基本信息:
使用SQLmap获取数据:
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐