对一次韩国站的上传点分析

作者:hack1990 时间:12-06-21 阅读数:639人阅读

群里某人求助上传,老是说突破突破。

然后就发了个地址:

http://xxx.xx/club/cafe_bbs.php?cafeid=zmaica&ptype=board&sptype=insert&mode=insert&code=bookmark_1
 

过了几分钟,直接拿下webshell


当时有事,我没立即去拿,后来去瞅了下,发现这东西太容易绕过了

那孩子天天突破突破,关键在于突破的思路!
比如,我们上传一个paxmac.php.r文件,出现的后缀是时间加上.p.r.再上传paxmac.aphp

则直接出现201211122.php文件。很容易就知道。此处的绕过方法。非常简单….不多说。

下面我把源码分析下


上传第一步,检测文件的mime头,判断是否为图片文件!代码如下…. /admin/lib.php

 function img_type($srcimg)
{
if(is_file($srcimg)){
$image_info = getimagesize($srcimg);
switch ($image_info['mime']) {
case ’image/gif’: return true; break;
case ’image/jpeg’: return true; break;
case ’image/png’: return true; break;
case ’image/bmp’: return true; break;
default : return false; break;
}
}else{
return false;
}

}

 此处很容易绕过,直接在图片文件里面加上GIE89a或者使用图片马。

 上传第二步,检测文件扩展名是否为php|htm|html文件 /admin/lib.php

function file_check( $filename, $file_str = ”php|htm|html” ) {

 $file_arr = explode(“|”, $file_str);

 $name_arr = explode(“.”, $filename);

 $name_cnt = count($name_arr) - 1;

 for($ii = 0; $ii < count($file_arr); $ii++) {

 if(!strcmp(strtolower($name_arr[$name_cnt]), strtolower($file_arr[$ii]))) {

 error(“頃措嫻 韺岇澕鞚€ 鞐呺霌滍暊 靾?鞐嗠姅 順曥嫕鞛呺媹雼?”);

 }

 }

}

 此处就不说了!

 重点代码如下:

 在cafe_lib.php文件中,这样定义上传的:

 /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

 * file upload 垬 (鞛勳潣鞝滌瀾;;)

  * type=file ?name ?鞛呺牓 $_FILES[靾榏 搿?鞛呺牓

 * uploadFile(韺岇澕氤靾橂獏,鞐呺霌滉步搿?鞐呺霌滍寣鞚茧獏,鞐呺?電ロ暅韺岇澕頇曥灔鞛?|搿滉惮攵?? .jpg|.bmp|.gif)

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/

 function uploadFile($ufile,$updir,$upfile,$upexf=""){  //注意此处$upexf="" 如果按作者思想,本来应该设计一个全局变量值为“.jpg|.bmp|.gif”经查,末设置全局变量。也末传值进来!
$base_dir = $updir;  //获取上传路径

 $kdir = str_replace($_SERVER[DOCUMENT_ROOT],”,$updir); //将路径去除根路径,作为相对路径。

 $kdir_ = explode(“/”,$kdir);  //分离

 $_rootdir = $_SERVER[DOCUMENT_ROOT];  //取绝对路径 

 $_tmpdir = ”;

//鞎堧霌れ柎歆?韽措崝 靸濎劚頃橁赴

 foreach($kdir_ as $key => $value){   //此处为建立上传文件存放文件路径

 if(!empty($value)){

 $_tmpdir.=’/’.$value;

 if(!is_dir($_rootdir.$_tmpdir)){

 @mkdir($_rootdir.$_tmpdir, 0707);

 }else{

 @chmod($_rootdir.$_tmpdir,0707);

 }

 }}

 $fls = $ufile;  //取上传文件信息

 $flsname = $upfile; 

 //鞐呺?頇曥灔鞛?? if($upexf){ //此处判断扩展名时,传入已经被赋值为空,所以末起作用,不过可借鉴

 $exif_tmp = explode(‘|’,$upexf);  //本身是将.jpg|.bmp|.gif按|分隔开来。赋值给$exif_tmp变量

 $exif=”;

 foreach($exif_tmp as $key => $value){

 $exif.=”\\”.$exif_tmp[$key].”$|”;   //此处将护展名分离,并作为正则模型

 }

 $exif = substr($exif,0,-1);  //获取正则模型

 }

 if($fls){ //判断上传文件是否为空,此处上传就不为空

 if($upexf)  //因开头已赋值所以,我们的文件后缀可以是任意的

 {

 if(!eregi($exif,$fls[name])) //此处正则判断上传文件扩展名是否为白名单内的值,白名单模式{

echo ’鞐呺?頃犾垬 鞐嗠姅 韺岇澕鞛呺媹雼?’;

 $fileupload=’0′;

 return;exit;

 }else{

 //鞐呺?? $fileupload=’1′;

 }

 }else{ //因为$upexf为空,所以$fileupload=1,导致任意文件上传。

 $fileupload=’1′;

 }

 //韺岇澕氇?毵岆摛旮?

 $fexi = substr($fls[name],-3); //上传后,截取后缀最后三位为文件格式,漏洞存在,利用只需要 paxmac.ephp即可

 $upfilename = $upfile.’.’.$fexi; //连接,上传

 @mkdir($updir,0777); //创建目录

 if(move_uploaded_file($fls[tmp_name],”$updir/$upfilename”)){ //上传文件

 return $upfilename;  //返回文件名

 }else{

 return false;

 }

 @unlink($fls[tmp_name]); //删除昨晚文件

 }else{

 echo ”鞐呺霌滍暊 韺岇澕鞚?鞐嗢姷雼堧嫟.”;

 }}
以上码,我们可以清楚地看到,漏洞位置。

 利用方法很简单。直接上传mei.aphp就可以拿到webshell

所谓的上传突破,方法不过就是那么几种,关键在于的是灵活运用

而不是单纯地去查别人怎么上传的


Author:PAX.MAC-conqu3r

发表评论