RT.
详细说明:
下载地址 http://bbs.qibosoft.com/down2.php?v=download1.0#down
0x01 老问题
在download/inc/job/down_encode.php中
if(eregi('.php',$url)){ header("location:$true_url"); exit; } $webdb[upfileType] = str_replace(' ','|',$webdb[upfileType]); if(file_exists(ROOT_PATH."$webdb[updir]/$url") && eregi("($webdb[upfileType])$",$url) && filesize(ROOT_PATH."$webdb[updir]/$url")<1024*1024*10) { $filetype=substr(strrchr($url,'.'),1); ob_end_clean(); header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT'); header('Pragma: no-cache'); header('Content-Encoding: none'); header('Content-Disposition: attachment; filename='."$true_name.$filetype"); header('Content-type: '.$filetype); header('Content-Length: '.filesize(ROOT_PATH."$webdb[updir]/$url")); readfile(ROOT_PATH."$webdb[updir]/$url"); exit;
厂商对上次我爆的那个洞做了修补
eregi("($webdb[upfileType])$",$url 白名单验证。
但是在download/inc/down_encode.php 中
$true_url=tempdir($url); if(eregi('.php',$url)){ header("location:$true_url"); exit; }
if(file_exists(ROOT_PATH."$webdb[updir]/$url")&&filesize(ROOT_PATH."$webdb[updir]/$url")<1024*1024*10) { $filetype=substr(strrchr($url,'.'),1); ob_end_clean(); header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT'); header('Pragma: no-cache'); header('Content-Encoding: none'); header('Content-Disposition: attachment; filename='."$true_name.$filetype"); header('Content-type: '.$filetype); header('Content-Length: '.filesize(ROOT_PATH."$webdb[updir]/$url")); readfile(ROOT_PATH."$webdb[updir]/$url"); exit;
却没有做白名单验证 只是黑名单验证是否含有.php 按照上次发的那个可以绕过。
然后这个涉及到了个入库出库 然后在发布软件的时候图片地址写要下载的就行了
绕过黑名单参照这个。及剩下的参照下面这个 我就不多说了。
WooYun: qibocmsV7整站系统任意文件下载导致无限制注入多处(可提升自己为管理 Demo演示)
____________________________________________________________________
0x02 注入
在全局文件中
$_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)){ $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; }
这里调用了这个函数来对get post cookie来转义 如果gpc off的话 就addslashes对数组中的value进行转义 这里没有对数组中的key进行过滤。
在download/member/post.php中
elseif($job=='manage') { if(!$atc_power)showerr("你没权限"); if($rsdb[pages]<2){ header("location:post.php?job=edit&aid=$aid");exit; } if($step==2){ asort($orderDB); $i=0; foreach( $orderDB AS $key=>$value){ $i++; $db->query("UPDATE {$_pre}reply SET orderid=$i WHERE aid='$aid' AND rid='$key'"); } refreshto("$FROMURL","排序成功",1); }
if($lfjid){ if($web_admin||$lfjuid==$rsdb[uid]){ $atc_power=1; } }
这个只要是你自己发布的就有权限了。 所以我们自己先发布一个。
foreach( $orderDB AS $key=>$value){ $i++; $db->query("UPDATE {$_pre}reply SET orderid=$i WHERE aid='$aid' AND rid='$key'
这里把数组中的key循环出来后 没有做任何的过滤就带入到了查询当中
造成了注入。
漏洞证明:

首先注册一个会员 投稿 因为if($rsdb[pages]<2){
header("location:post.php?job=edit&aid=$aid");exit;
}
验证了两页 所以得发两页。

然后就成功注入了。
修复方案:
对于第一个问题 做白名单
第二个 $key=intval($key);
|
还没有人抢沙发呢~