无意间发现的注入,结果已经有师傅提交了有关的XSS的CVE,虽然利用的地方是一样的。
源码下载处:
http://www.zzcms.net/download/zzcms2019.zip
漏洞分析
漏洞位于/inc/function.php的markit函数中
function markit(){
$userip=$_SERVER["REMOTE_ADDR"];
//$userip=getip();
$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $url;
query("insert into zzcms_bad (username,ip,dose,sendtime)values('".$_COOKIE["UserName"]."','$userip','$url','".date('Y-m-d H:i:s')."')") ;
}
从上面的代码能看出$url的值由$_SERVER['REQUEST_URI']拼接而成,也就是我们的访问的url。接着直接就在sql中进行了拼接,并没有进行相应的过滤。
而在/inc/stopsqlin.php中的2-5行,也能发现存在相应过滤
//主要针对在任何文件后加?%3Cscript%3E,即使文件中没有参数
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}
但是这是针对于XSS的过滤,对我们并没有什么影响。
我们能在好几处地方找到对markit函数的调用
比如以/user/del.php为例
<?php
$pagename=isset($_POST["pagename"])?$_POST["pagename"]:'';
$tablename=isset($_POST["tablename"])?$_POST["tablename"]:'';
$id='';
if(!empty($_POST['id'])){
for($i=0; $i<count($_POST['id']);$i++){
checkid($_POST['id'][$i]);
$id=$id.($_POST['id'][$i].',');
}
$id=substr($id,0,strlen($id)-1);//去除最后面的","
}
if (!isset($id) || $id==''){
showmsg('操作失败!至少要选中一条信息。');
}
$tablenames='';
$rs = query("SHOW TABLES");
while($row = fetch_array($rs)) {
$tablenames=$tablenames.$row[0]."#";
}
$tablenames=substr($tablenames,0,strlen($tablenames)-1);
if (str_is_inarr($tablenames,$tablename)=='no'){
echo "tablename 参数有误";
exit();
}
if ($tablename=="zzcms_main"){
if (strpos($id,",")>0){
$sql="select id,img,flv,editor from zzcms_main where id in (".$id.")";
}else{
$sql="select id,img,flv,editor from zzcms_main where id ='$id'";
}
$rs=query($sql);
$row=num_rows($rs);
if ($row){
while ($row=fetch_array($rs)){
if ($row["editor"]<>$username){
markit();showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
}
能发现,只需更改$username
,其对应的值是Cookie中的UserName
的值,使得查询出来的$row["editor"]
值与之不同即可触发markit()
函数。
需要注意的是,因为注入点位于URL中,直接路径加sql语句肯定是不行的,这里可以使用?
进行连接。
对$_SERVER['REQUEST_URI']
进行过滤
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.