文件上传漏洞这个问题不是php中所存在的只是我们用户在程序开发时可能做得不够好所导致的,以前的asp同样也存在文件上传漏洞,下面我来给大家介绍php文件上传漏洞简单分析与解决办法。
下面是一个简单的文件上传表单
代码如下
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
代码如下
那么使用$_files[‘file’][‘name’]来获得客户端上传文件名称,不包含路径。使用$_files[‘file’][‘tmp_name’]来获得服务端保存上传文件的临时文件路径
存放上传文件的文件夹
php不会直接将上传文件放到网站根目录中,而是保存为一个临时文件,名称就是$_files[‘file’][‘tmp_name’]的值,开发者必须把这个临时文件复制到存放的网站文件夹中。
$_files[‘file’][‘tmp_name’]的值是由php设置的,与文件原始名称不一样,开发者必须使用$_files[‘file’][‘name’]来取得上传文件的原始名称。
上传文件时的错误信息
$_files[‘file’][‘error’]变量用来保存上传文件时的错误信息,它的值如下:
错误信息 数值 说 明
upload_err_ok 0 没有错误
upload_err_ini_size 1 上传文件的大小超过php.ini的设置
upload_err_from_size 2 上传文件的大小超过html表单中max_file_size的值
upload_err_partial 3 只上传部分的文件
upload_err_no_file 4 没有文件上传
文件上传漏洞
如果提供给网站访问者上传图片的功能,那必须小心访问者上传的实际可能不是图片,而是可以指定的php程序。如果存放图片的目录是一个开放的文件夹,则入侵者就可以远程执行上传的php文件来进行攻击。
下面是一个简单的文件上传例子:
代码如下
……
这个例子没有检验文件后缀,可以上传任意文件,很明显的上传漏洞,要解决上面的问题很简单,我们从一段代码来看。
代码如下
switch( $extension )
{
case ‘application/msword’:
$extension =’doc’;
break;
case ‘application/vnd.ms-excel’:
$extension =’xls’;
break;
case ‘application/vnd.openxmlformats-officedocument.wordprocessingml.document’:
$extension =’docx’;
break;
case ‘application/vnd.ms-powerpoint’:
$extension =’ppt’;
break;
case ‘application/pdf’:
$extension =’pdf’;
break;
case ‘application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’:
$extension =’xlsx’;
break;
default:
die(‘只允许上传doc,docx,xls,pdf,ppt文件 重新上传’);
}
这个是用来限制用户上传的类型号或后缀名了,这样可以过滤简单不能直接上传php了,但是我们再看一个实例,你绘发现太可怕了。
用画图工具新建一个jpg或gif或png之类图片格式,开头一定是gif或jpg或png之类。
将php网马的头部写入gif 如图:
代码如下
然后写一个简单的php上传文件处理(我赶时间随便写的,没什么美感):
就可以看到如图这样坑爹的效果了。
首先是print_r($_files) 直接显示的是扩展的jpg结果。
然后是php函数getimagesize()的结果是gif(它以文件开头那段为判断依据)。
在这种问题上php是无法解决的,但我们可以从服务器目录权限来操作,下面提供一些解决办。
其实,我们抓住几个地方即可,我们先来分析下,既然用户要上存文件,而且文件将是多种多样格式;可能有的文件内容与用户传入格式不一致,有的文件内容还夹杂木马代码。 那么,我们让用户上存文件,跟站点文件做一个分别授权,做隔离。
让保存上存目录独立开来,目录权限只读不能执行
这一步从系统设计加以授权,无论你上次什么文件,都不可能执行到。就算我不做任何检测,你的文件都上存到这里了,也不会对我系统构成安全。(如果有用户上存一些反动言语的图片,那另外需要处理的)
不直接使用服务器传入值,所有都要进行检测
这类跟我们做一切输入都是有害原则一样,对于客户端传入的:type, name ,都要进行判断,不直接使用。对于要生成到某个目录,某个文件名。
文件名最好方法是:自己写死目录(不要读取传入目录),文件名,最好自己随机生成,不读取用户文件名。文件扩展名,可以取最右边”.”后面字符。
以上2个方法,刚好从2个方面对上存做了整体约束。
方法2 : 保存上存文件名,按照自己指定目录写入,并且文件名自己生成的。
方法1:只要保证文件写对了位置,然后从配置上,对写入目录进行权限控制,这个是治本。可以做到,你无论上存什么文件,都让你没有权限跳出去可以运行。
以上2个方法,一起使用,可以保证文件正确存到地方,然后,权限可以控制。 这里顺便说明下, 判断用户上存文件是否满足要求类型,就直接检查文件扩展名,只要满足扩展名就让上存。 反正,做了执行权限限制,你不按要求上存内容,也无妨。 反正,不能执行,也不会有多大危害性的。
正确步骤:
1.读取文件名,验证扩展名是不是在范围内
2.自己定义生成的文件名,目录,扩展名可以来自文件名扩展名。 其它值,都自己配置,不读取上存中内容
3.将文件 移到新目录(这个目录权限设置只读)
http://www.bkjia.com/phpjc/629604.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/629604.htmltecharticle文件上传漏洞这个问题不是php中所存在的只是我们用户在程序开发时可能做得不够好所导致的,以前的asp同样也存在文件上传漏洞,下面我来…