任意文件上传漏洞
文件上传漏洞(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']变量用来保存上传文件时的错误信息,它的值如下: