[web安全] 上传漏洞之修复漏洞

上传漏洞最终的形成原因主要有以下两点:
1目录过滤不严,攻击者可能建立畸形目录。
2文件未重命名,攻击者可能利用Web容器解析漏洞。

<?php
	if(!isset($_POST['submit'])){
		exit();
	}
	$arr=Array('jpg','gif','jpeg','png','rar','zip','doc','docx');//白名单
	$imageTempName=$_FILES['file']['tmp_name'];//接收临时文件路径
	$imageName=$_FILES['file']['name'];//接收文件名称
	$last=strtolower(substr($imageName,strrpos($imageName,".")+1));//取得扩展名,转换为小写
	if(!in_array($last,$arr)){
		exit("不支持上传的扩展名.$last...");
	}
	$Extension=$_POST['Extension'];//获取文件上传目录
	$imageName=md5($imageName).".".$last;//对文件重命名
	move_uploaded_file($imageTempName,"./$Extension/".$imageName);
	echo("文件上传成功!!path=/$Extension/$imageName");
?>

安全的编码方案应该包含如下三个步骤:

1接收文件及其文件临时路径。
2获取扩展名与白名单做对比

3对文件进行重命名

这段代码如果上传目录是固定的,而不是通过参数来获得,将会更加安全。白名单已经将安全调整到很高的级别了,随后又对文件重命名,进一步降低了利用web容器解析漏洞的可能性。

“获取扩展名与白名单做对比”,攻击者只能考虑利用web容器的解析漏洞来绕过。之后“对文件进行重命名”,会破坏攻击者所构造的特殊文件名。
因此如果想突破这种后台代码,可能存在的攻击方法为PHP CGI解析漏洞。
如果进一步,对用户上传的文件做图片二次渲染处理,那么任何解析漏洞(包括PHP CGI)也会被防御,因为存在于图片中的代码将会被破坏。
二次渲染就是根据用户上传的图片,生成一个新的图片,然后删除用户上传的原始图片,将新图片存储到数据库中。

你可能感兴趣的:([web安全] 上传漏洞之修复漏洞)