好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

对一次韩国站的上传点分析 - 网站安全 - 自学

作者:conqu3   Pax.Mac 核心成员   群里某人求助上传,老是说突破突破。然后就发了个地址:http://HdhCmsTest2cto测试数据 /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了,所谓的上传突破,方法不过就是那么几种,关键在于的是灵活运用,而不是单纯地去查别人怎么上传的。 文中若有错误,还请指正,谢谢!  

查看更多关于对一次韩国站的上传点分析 - 网站安全 - 自学的详细内容...

  阅读:41次