当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-065834

漏洞标题:qibocms 新闻系统 Getshell (需结合解析漏洞)

相关厂商:齐博CMS

漏洞作者: ′雨。

提交时间:2014-06-23 18:51

修复时间:2014-09-21 18:52

公开时间:2014-09-21 18:52

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-23: 细节已通知厂商并且等待厂商处理中
2014-06-24: 厂商已经确认,细节仅向厂商公开
2014-06-27: 细节向第三方安全合作伙伴开放
2014-08-18: 细节向核心白帽子及相关领域专家公开
2014-08-28: 细节向普通白帽子公开
2014-09-07: 细节向实习白帽子公开
2014-09-21: 细节向公众公开

简要描述:

IIS || Apache。

详细说明:

http://bbs.qibosoft.com/down2.php?v=news1.0#down
下载地址。
在news/member/post.php中

require_once(Mpath."inc/check.postarticle.php");
if($job=='postnew')
{
if($step=='post')
{
post_new();
//生成静态
make_article_html("$Murl/member/post.php?job=endHTML&aid=$aid");
$mid && $mid<106 && $none='none';
refreshto("?job=postnew&fid=$fid","<CENTER>[<A HREF='?job=postnew&fid=$fid'>继续发表新主题</A>] <span style='display:$none;'>[<A HREF='?job=post_more&fid=$fid&aid=$aid'>续发本主题</A>]</span> [<A HREF='myarticle.php?job=myarticle&fid=$fid'>返回主题列表</A>] [<A HREF='$Mdomain/bencandy.php?fid=$fid&aid=$aid' target=_blank>查看主题</A>] [<A HREF='?job=edit&aid=$aid'>点击修改</A>]</CENTER>",60);
}
$MSG='新发表内容';
$select_fid=$Guidedb->SelectIn("{$_pre}sort",0,$fid);
require(ROOT_PATH."member/head.php");
require(dirname(__FILE__)."/template/post.htm");
require(ROOT_PATH."member/foot.php");


包含了这个进来inc/check.postarticle.php 进去看看。

$postdb[title]		=	filtrate($postdb[title]);
$postdb[subhead] = filtrate($postdb[subhead]);
$postdb[keywords] = filtrate($postdb[keywords]);
$postdb[smalltitle] = filtrate($postdb[smalltitle]);
$postdb[picurl] = filtrate($postdb[picurl]);
//$postdb[description]= filtrate($postdb[description]);
$postdb[author] = filtrate($postdb[author]);
$postdb[copyfrom] = filtrate($postdb[copyfrom]);
$postdb[copyfromurl]= filtrate($postdb[copyfromurl]);
$postdb[description] = preg_replace('/javascript/i','java script',$postdb[description]);
$postdb[description] = preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[description]);

//针对火狐浏览器做的处理
$postdb[content]=str_replace("=\\\"../$webdb[updir]/","=\\\"$webdb[www_url]/$webdb[updir]/",$postdb[content]);
if(!$groupdb[PostNoDelCode]){
$postdb[content] = preg_replace('/javascript/i','java script',$postdb[content]);
$postdb[content] = preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[content]);
}
//采集外部图片
$postdb[content] = get_outpic($postdb[content],$fid,$GetOutPic);


跟这函数来看看。get_outpic

function get_outpic($str,$fid=0,$getpic=1){
global $webdb,$lfjuid,$_pre;
if(!$getpic){
return $str;
}
preg_match_all("/http:\/\/([^ '\"<>]+)\.(gif|jpg|png)/is",$str,$array);
$filedb=$array[0];
foreach( $filedb AS $key=>$value){
if( strstr($value,$webdb[www_url]) ){
continue;
}
$listdb["$value"]=$value;
}
unset($filedb);
foreach( $listdb AS $key=>$value){
$filedb[]=$value;
$name=$lfjuid.'_'.rands(5)."__".basename($value);
if(!is_dir(ROOT_PATH."$webdb[updir]/$_pre/$fid")){
makepath(ROOT_PATH."$webdb[updir]/$_pre/$fid");
}
$ck=0;
if( @copy($value,ROOT_PATH."$webdb[updir]/$_pre/$fid/$name") ){
$ck=1;
}elseif($filestr=file_get_contents($value)){
$ck=1;
write_file(ROOT_PATH."$webdb[updir]/$_pre/$fid/$name",$filestr);
}


preg_match_all("/http:\/\/([^ '\"<>]+)\.(gif|jpg|png)/is",$str,$array);
$filedb=$array[0];
foreach( $filedb AS $key=>$value){
if( strstr($value,$webdb[www_url]) ){
continue;
}
$listdb["$value"]=$value;
}
unset($filedb);


这里匹配了 http://xxxx.com/xx.jpg|png|gif 这种的
匹配出来后 循环赋值 然后又再把数组$listdb循环出来

foreach( $listdb AS $key=>$value){
$filedb[]=$value;
$name=$lfjuid.'_'.rands(5)."__".basename($value);


然后拼接成$name 最后 $name做了文件的名字。然后再file get contents
就write file了。
由于这里匹配的时候限制匹配到.jpg 结束
所以要利用一下解析漏洞
这里先说下解析漏洞。
IIS6解析漏洞:yu.php;1.jpg 这样是可以当php文件来执行的。
Apache解析漏洞:yu.php.jpg (当最后一个后缀无法解析的时候也就是.jpg无法解析的时候 就会向上来解析就解析成了.php. 当服务器是windows的时候jpg是会被识别的所以这样解析无效, 当linux时 jpg无法解析 就会解析成.php了)

漏洞证明:

发表文章的时候抓个包。

function get_outpic($str,$fid=0,$getpic=1){
global $webdb,$lfjuid,$_pre;
if(!$getpic){
return $str;
}


由于这里当这变量为false的时候就直接返回了。
结合qibocms的伪全局机智 直接post提交下就行了。
$name=$lfjuid.'_'.rands(5)."__".basename($value);
这里文件名的名字是由uid_随机5个字符__拼接的名字
这里uid 和名字我们自己都能知道 但是随机的5个字符不太清楚
但是后面有函数会帮忙。

gdpic(ROOT_PATH."$webdb[updir]/$postdb[picurl]",$Newpicpath,$picWidth?$picWidth:300,$picHeight?$picHeight:225,$webdb[autoCutSmallPic]?array('fix'=>1):'');

//多生成一张3:4的图片,方便标签调用
gdpic(ROOT_PATH."$webdb[updir]/$postdb[picurl]","$Newpicpath.jpg",$picHeight?$picHeight:225,$picWidth?$picWidth:300,$webdb[autoCutSmallPic]?array('fix'=>1):'');
//多生成一张1:1的图片,方便标签调用
gdpic(ROOT_PATH."$webdb[updir]/$postdb[picurl]","$Newpicpath.jpg.jpg",$picWidth?$picWidth:300,$picWidth?$picWidth:300,$webdb[autoCutSmallPic]?array('fix'=>1):'');


在这里 调用了这个函数

function gdpic($srcFile,$dstFile,$width,$height,$type=''){
require_once(ROOT_PATH."inc/waterimage.php");
if(is_array($type)){
//截取一部分,以满足匹配尺寸
cutimg($srcFile,$dstFile,$x=$type[x]?$type[x]:0,$y=$type[y]?$type[y]:0,$width,$height,$x2=$type[x2]?$type[x2]:0,$y2=$type[y2]?$type[y2]:0,$scale=$type[s]?$type[s]:100,$fix=$type[fix]?$type[fix]:'');
}elseif($type==1){
//成比例的缩放
ResizeImage($srcFile,$dstFile,$width,$height);
}else{
//与尺寸不匹配时.用色彩填充
gdfillcolor($srcFile,$dstFile,$width,$height);


继续跟

function cutimg($srcimgurl,$endimgurl,$x,$y,$endimg_w,$endimg_h,$border_w,$border_h,$scale=100,$fix=0){
$path = dirname ($endimgurl);
if (!is_dir($path)) {
if(!@mkdir ($path, 0777)){
showerr("{$path} 此目录不能创建,文件创建失败");
}
}
$ground_info = getimagesize($srcimgurl);
switch($ground_info[2]){
case 1:$im = imagecreatefromgif($srcimgurl);break;
case 2:$im = imagecreatefromjpeg($srcimgurl);break;
case 3:$im = imagecreatefrompng($srcimgurl);break;
default:die("图片格式不允许$srcimgurl");


当cut失败的时候 会直接透漏出文件的名字。

qn1.jpg


qn2.jpg


这种格式的文件在iis 或者 apache下是能解析的。

修复方案:

。。看你们啦。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-06-24 11:11

厂商回复:

感谢提出来

最新状态:

暂无