网站常见漏洞 -- 文件上传漏洞

简介:
任意文件上传漏洞

文件上传漏洞(File Upload Attack)是由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。


一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件。
 下面是一个简单的文件上传表单 

<form action="upload.php" method="post" enctype="multipart/form-data" name="form1"> 

<input type="file" name="file1" /><br /> 

<input type="submit" value="上传文件" /> 

<input type="hidden" name="MAX_FILE_SIZE" value="1024" /> 

</form> 


php的配置文件php.ini,其中选项upload_max_filesize指定允许上传的文件大小,默认是2M 
$_FILES数组变量 
PHP使用变量$_FILES来上传文件,$_FILES是一个数组。
如果上传test.txt,那么$_FILES数组的内容为: 

$FILES 

Array 

  [file] => Array 
   {

     [name] => test.txt                            //文件名称 
     [type] => text/plain                          //MIME类型 
     [tmp_name] => /tmp/php5D.tmp                   //临时文件 
     [error] => 0                                //错误信息 
     [size] => 536                               //文件大小,单位字节 
   }
}

如果上传文件按钮的name属性值为file 
<input type="file" name="file" /> 
那么使用$_FILES['file']['name']来获得客户端上传文件名称,不包含路径。使用$_FILES['file']['tmp_name']来获得服务端保存上传文件的临时文件路径


存放上传文件的文件夹 

PHP不会直接将上传文件放到网站根目录中,而是保存为一个临时文件,名称就是$_FILES['file']['tmp_name']的值,开发者必须把这个临时文件复制到存放的网站文件夹中。 

$_FILES['file']['tmp_name']的值是由PHP设置的,与文件原始名称不一样,开发者必须使用$_FILES['file']['name']来取得上传文件的原始名称。 
上传文件时的错误信息 $_FILES['file']['error']变量用来保存上传文件时的错误信息,它的值如下:


 

 

235554372.png

 

 

文件上传漏洞 

如果提供给网站访问者上传图片的功能,那必须小心访问者上传的实际可能不是图片,而是可以指定的PHP程序。如果存放图片的目录是一个开放的文件夹,则入侵者就可以远程执行上传的PHP文件来进行攻击。
下面是一个简单的文件上传例子:
<?php 
// 设置上传文件的目录 
$uploaddir = "D:/www/images/"; 

// 检查file是否存在 
if (isset($_FILES['file1'])) 

// 要放在网站目录中的完整路径,包含文件名 
$uploadfile = $uploaddir . $_FILES['file1']['name']; 

// 将服务器存放的路径,移动到真实文件名 move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile);

?> 
…… 
<form method="post" enctype="multipart/form-data" name="form1">  
<input type="file" name="file1" /><br /> 
<input type="submit" value="上传文件" /> 
<input type="hidden" name="MAX_FILE_SIZE" value="1024" /> 
</form> 

这个例子没有检验文件后缀,可以上传任意文件,很明显的上传漏洞。
利用此漏洞黑客克制自由上床任意的木马文件而导致网站失陷。


漏洞防护措施

解决上面所述问题的一种方法是通过检查上传文件的类型来限制用户的文件上传,如以下代码所示。 


<?php 

if(isset($_POST["form"])) 


{
if($_FILES['upfile']['type'] == 'image/pjpeg')  //检查文件类型是否为JPEG 

{
$uploadfile = "upfiles/".$_FILES['upfile']['name'];
//上传后文件所在的文件名和路径 


move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile); 

//上传文件 

 

print_r($_FILES);
die();


else
   {
     die("上传文件的格式不正确!");
   }
}
?>

上面的代码要求用户上传的文件必须是JPEG类型的图片文件,彻底地避免了终端用户通过上传PHP脚本危害服务器的行为。



文件上传路径变量过滤不严


在许多论坛的用户发帖页面中存在这样的上传Form,如图7-27所示,其网页编程代码为:

  “<form action="user_upfile.asp" ...>

  <input type="hidden" name="filepath" value="UploadFile">

  <input type="file" name="file">

  <input type="submit" name="Submit" value="上传" class="login_btn">

  </form>”


 

在其中“filepath”是文件上传路径,由于网页编写者未对该变量进行任何过滤,因此用户可以任意修改该变量值。在网页编程语言中有一个特殊的截止符"\0",该符号的作用是通知网页服务器中止后面

的数据接收。利用该截止符可们可以重新构造filepath,例如正常的上传路径是:

 

  “http://www.***.com/bbs/uploadface/200409240824.jpg”,

  但是当我们使用“\0”构造filepath为

 

  “http://www.***.com/newmm.asp\0/200409240824.jpg ”

  这样当服务器接收filepath数据时,检测到newmm.asp后面的\0后理解为filepath的数据就止结束了,这样我们上传的文件就被保存成了:“http://www.***.com/newmm.asp”。

  利用这个上传漏洞就可以任意上传如.ASP的网页木马,然后连接上传的网页即可控制该网站系统。

 

  提示:可能有读者会想,如果网页服务器在检测验证上传文件的格式时,碰到“/0”就截止,那么不就出现文件上传类型不符的错误了吗?其实在检测验证上传文件的格式时,系统是从filepath的右边向左边读取数据的,因此它首先检测到的是“.jpg”,当然就不会报错了。

 

 

最安全的防范办法就是删除上传页面。





     本文转自Tar0 51CTO博客,原文链接:http://blog.51cto.com/tar0cissp/1286799
,如需转载请自行联系原作者




相关文章
|
8天前
|
开发框架 安全 .NET
文件上传漏洞技术总结
该文总结了文件上传技术相关的漏洞和绕过方法,包括语言可解析的后缀(如phtml、pht)、常见的MIME类型、Windows特性(如大小写、ADS流、特殊字符)、0x00截断技巧(需满足PHP版本和magic_quotes_gpc状态)、POST型0x00截断、文件头检查(通过合成图片马绕过)、二次渲染(利用未修改部分插入恶意代码)以及各种服务器的解析漏洞(Apache的.htaccess、解析漏洞,IIS的目录解析、文件解析、默认解析和IIS 7.x/Nginx的畸形解析)。此外,还提到了Java的空字节截断问题。
23 1
文件上传漏洞技术总结
|
3月前
|
存储 安全 前端开发
【网络安全】文件上传漏洞
【网络安全】文件上传漏洞
76 1
【网络安全】文件上传漏洞
|
7月前
|
Web App开发 XML 安全
DedeCMS存在文件包含漏洞导致后台getshell(CVE-2023-2928)
DedeCMS存在文件包含漏洞导致后台getshell,攻击者可通过该漏洞获取目标服务器控制权限,进行深度利用。
175 1
|
安全 前端开发 JavaScript
【漏洞复现-dedecms-文件上传】vulfocus/dedecms-cve_2019_8933
【漏洞复现-dedecms-文件上传】vulfocus/dedecms-cve_2019_8933
402 0
【漏洞复现-dedecms-文件上传】vulfocus/dedecms-cve_2019_8933
|
开发框架 安全 .NET
9.文件上传漏洞基础
文件上传漏洞通常由于网页代码中的文件上传路径变量过滤不严造成的,如果文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
9.文件上传漏洞基础
|
开发框架 安全 前端开发
2022渗透测试-文件上传漏洞的详细讲解
2022渗透测试-文件上传漏洞的详细讲解
2022渗透测试-文件上传漏洞的详细讲解
|
安全 Shell Linux
文件上传漏洞及防_3 | 学习笔记
学习笔记 文件上传漏洞及防_3
128 0
文件上传漏洞及防_3 | 学习笔记
|
安全 PHP 缓存
网站漏洞修复之Discuz X3.4远程代码执行漏洞
近期在对discuz x3.4进行全面的网站渗透测试的时候,发现discuz多国语言版存在远程代码执行漏洞,该漏洞可导致论坛被直接上传webshell,直接远程获取管理员权限,linux服务器可以直接执行系统命令,危害性较大,关于该discuz漏洞的详情,我们来详细的分析看下。
5061 0
|
存储 缓存 安全
Discuz 网站漏洞修复之远程代码执行漏洞
近期SINE安全在对discuz x3.4进行全面的网站渗透测试的时候,发现discuz多国语言版存在远程代码执行漏洞,该漏洞可导致论坛被直接上传webshell,直接远程获取管理员权限,linux服务器可以直接执行系统命令,危害性较大,关于该discuz漏洞的详情,我们来详细的分析看下。
759 0
Discuz 网站漏洞修复之远程代码执行漏洞
|
SQL 缓存 安全
phpcms2008网站漏洞修复 远程代码写入缓存漏洞利用
SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客的攻击,关于这次发现的phpcms漏洞细节以及如何利用提权我们来详细剖析。
132 0
phpcms2008网站漏洞修复 远程代码写入缓存漏洞利用