网站地图    收藏   

主页 > 后端 > 网站安全 >

qibocms多个系统因为补丁而造成的注入 - 网站安全

来源:自学PHP网    时间:2015-04-16 23:15 作者: 阅读:

[导读] 看了看qibo发的补丁, 对我之前发的那个洞发了补丁之前以为只是补丁没打好 还能绕过。之前以为只要把之前那一处补补就好了。可是自从出了这补丁之后 倒导致了很多其他的注入。。...

看了看qibo发的补丁, 对我之前发的那个洞发了补丁
之前以为只是补丁没打好 还能绕过。
之前以为只要把之前那一处补补就好了。
可是自从出了这补丁之后 倒导致了很多其他的注入。。
这补丁 。。。。。。。。。。。。。。。。
依旧qibo的大部分的系统都有这个。
就演示一个系统。

http://bbs.qibosoft.com/read-forum-tid-422299-fpage-0-page-1.htm




这里补丁地址



(最后更新于2014-7-28)



附件: 安全补丁.rar (218 K) 下载次数:15597



刚更新的,对我之前发的那个洞有了防御。



来看看怎么修改的。

________________________________________________________________



在inc/common.inc.php中
 

$_POST=Add_S($_POST);
$_GET=Add_S($_GET);
$_COOKIE=Add_S($_COOKIE);

function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
$key=str_replace(array("'",'"','\\','&'),'',$key);
$value=str_replace("&#x","& # x",$value);//过滤一些不安全字符
$value=preg_replace("/eval/i","eva l",$value);//过滤不安全函数
!get_magic_quotes_gpc() && $value=addslashes($value);
$array[$key]=$value;
}else{
$array[$key]=Add_S($array[$key]); 
}
}
return $array;
}





可以看到 这个补丁其实就是在全局的过滤函数中多了一句

$key=str_replace(array("'",'"','\\','&'),'',$key);



看起来好像没问题的样子。 但是实际呢?



这一句代码 不仅不能把 WooYun: qibocms V7 整站系统最新版SQL注入一枚 & 另外一处能引入转义符的地方。 这一处的洞补好



而且还导致了其他的注入漏洞。。。



我们来测试一下qibo的这个过滤函数。


 

<?php  

$_GET=Add_S($_GET);
var_dump ($_GET);

function Add_S($array){
foreach($array as $key=>$value){
if(!is_array($value)){
$key=str_replace(array("'",'"','\\','&'),'',$key);
$value=str_replace("&#x","& # x",$value);//过滤一些不安全字符
$value=preg_replace("/eval/i","eva l",$value);//过滤不安全函数
!get_magic_quotes_gpc() && $value=addslashes($value);
$array[$key]=$value;
}else{
$array[$key]=Add_S($array[$key]); 
}
}
return $array;
}





依旧用这来看看。


 

6.jpg





array(2) { ["asd'"]=> string(4) "asd'" ["asd"]=> string(5) "asd\'" }

可以看到提交了一个 而数组中有了两个元素



这点我并没有太清楚 问了一下P神说是 因为提交key为asd'

然后被$key=str_replace(array("'",'"','\\','&'),'',$key);后

然后单引号被清空后 就成了asd

第一次循环的时候并没有asd 就创建了一个这个元素 然后数组里面就有了两个元素。



但是原来的那个还在

就有了array(2) { ["asd'"]=> string(4) "asd'" ["asd"]=> string(5) "asd\'" }

其实我还是没太理解, 但是测试就是这样。

- - 数组中的一个key中含单引号 value中含单引号。 另外一个没有。



这里之前注入就是靠的数组里面的key没过滤 能引入单引号 然后来注入

然后出了这个补丁 连数组中的value都能引入单引号了。 导致了新的注入。。



然后找个foreach 数组的 再把value带入到查询中的就能注入了。



value的点可比key的点多一些了。



我随便找几个点来。



1: vote/vote.php中
 

foreach($voteId AS $key=>$value)
{
$db->query("UPDATE {$pre}vote_element SET votenum=votenum+1 WHERE id='$value' ");
}



这里是把value带入到了查询 没出这个补丁之前 这里是没办法注入的 因为value是会被转义的。

"多亏"了这个补丁 导致了这里的注入。



这里我输出一下数据
 

7.jpg





这里由于我们需要数组中有两个元素 所以数组中的key是需要含一个单引号才行

这样key中的单引号被清空后又创建了另外一个元素 就有两个元素了。


 

8.jpg





成功出数据。



类似的点还有 member/comment.php中
 

**************/
if($job=='del'){
foreach( $cidDB AS $key=>$value){
$rs=$db->get_one("SELECT aid FROM {$pre}comment WHERE cid='$value'");





不多说了啊。
 

 

修复方案:

认真过滤。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论