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