来源:自学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