网站地图    收藏   

主页 > 后端 > 网站安全 >

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

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] 作者:conqu3Pax.Mac 核心成员群里某人求助上传,老是说突破突破。然后就发了个地址:http://www.2cto.com /club/cafe_bbs.php?cafeid=zmaicaptype=boardsptype=insertmode=insertcode=bookmark_1过了几分......

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论