7.1 文件上传

1. 未做过滤

请看下面的一段代码:

```if (!empty($_FILES)) {

$path = "uploads/".$_GET['folder']."/";
$tempFile = $_FILES['Filedata']['tmp_name'];
//允许的文件后缀
$fileTypes = array('jpg','jpeg','gif','png'); 
$fileParts = pathinfo($_FILES['Filedata']['name']);
$ftype=$fileParts['extension'];
$fileName=microtime(true).".".$fileParts['extension'];    
if(!is_dir($path))
   mkdir($path);
if (move_uploaded_file($tempFile, $path.$fileName)){
    echo $fileName;
}else{
    echo $fileName."上传失败!";
}
}
没有做任何过滤,直接move_uploaded_file,导致任意文件上传。


### 2. 扩展名判断绕过

在进行php文件上传时,我们队文件扩展名的检测有两种方式,黑名单方式和白名单方式。黑名单方式一般绕过方式就是根据黑名单,fuzz或者查找有没有漏掉的,比如下面:
1.黑名单方式检测

$config->file->dangers = 'php,php3,php4,phtml,php5,jsp,py,rb,asp,aspx,ashx,asa,cer,cdx,aspl,shtm,shtml,html,htm'; $file['extension'] = $this->getExtension($filename);

public function getExtension($filename) { $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));//@@没有过滤空格 if(empty($extension)) return 'txt'; if(strpos($this->config->file->dangers, $extension) !== false) return 'txt';//@@任意文件上传漏洞 return $extension; }

可以看到,后缀取自上传文件名,然后做小写处理,然后和配置文件里的黑名单做毕竟,但是并没有最后缀做过滤处理, 可以用空格绕过。我们可以上传文件名为"test.php "(注意这里有个空格),便可以绕过检测,上传php木马。因为这个黑名单比较全了,所以没有其他可利用的后缀名了。
2.白名单结合截断或者解析漏洞等上传

$fileTypes = array('jpg','jpeg','gif','png'); $filename=$_FILES['file1']['name']; $ext=strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if (in_array($ext, $dangers)) { move_uploaded_file($tmpfile, './'.time()-.$filename); }else{ echo 'file type error'; }


如果是上面这种情形的话,并且文件名没有修改,导致可以在某些php版本可以用%00截断上传php。当php<5.3时,可用提交文件名为"test.php%00.jpg" 来截断绕过。


### 3. content-type 验证


直接看有漏洞的代码:

```list ( $width, $height, $type, $attr ) = getimagesize ( $_FILES ['Filedata'] ['tmp_name'] );
   $imgtype = array ('gif','jpg','png','jpeg' );
   $filetype = $type;
   $tmpavatar = _DATADIR . './tmp/upload/';
   if(in_array($filetype,$imgtype)){
           move_uploaded_file ( $_FILES ['Filedata'] ['tmp_name'], $tmpavatar.$_FILES         
           ['Filedata']['name'] );
   }else{
           echo "type error";
   }

从上面代码可以看出文件类型$type直接是从getimagesize()函数获取得到的。所以我们只要提交文件头为GIF89a的木马文件就会绕过检测,从而上传我们的木马。这类函数还有exif_imagetype()。

上面只是列出了常见的几种文件上传漏洞,当然还有根基实际代码逻辑去分析,有时候也会碰到通过上传一个zip压缩包,我们可以通过构造特殊的压缩包来上传我们的php木马。

results matching ""

    No results matching ""