黑名单及白名单过滤扩展名机制与绕过
【实训目的】
1.理解在服务端进行扩展名检测的方法及可能存在的风险;
2.能够掌握服务器端扩展名绕过的方法。
【实训原理】
1.黑名单过滤是定义了一系列不安全的扩展名,服务器端在接收到文件后,
将其扩展名与黑名单进行匹配,如果发现匹配成功,则认为文件不合法。这种过
滤方式不够安全,因为有些危险的扩展名可能被忽略,导致危险。
2.白名单过滤是定义了允许上传的扩展名,即扩展名不在白名单内的文件
将不允许上传,其拥有比黑名单更好的防御机制,但也可能结合WEB容器的解
析漏洞绕过白名单限制。
【实训步骤】
步骤1、编写文件上传的WEB前端代码
在XAMPP的htdocs目录下建立upload2.html文件,然后用记事本等工具进
行编辑,编写以下代码:
html
head
title图片上传/title
/head
body
divstyle=margin:0auto;width:320px;height:100px;
formaction=upload2.phpmethod=POSTenctype=multipart/form-data
inputtype=filename=fileid=file/br
inputtype=submitvalue=提交name=submit/
/form
/div
/body
/html
该前端页面表单中具有文件上传的功能。
步骤2、编写后端接收文件代码
在XAMPP的htdocs目录下建立upload2.php文件,然后用记事本等工具进
行编辑,编写以下代码:
?php
header(Content-type:text/html;charset=utf-8);
$blacklist=array(php,php5,jsp,asp,asa,aspx);//黑名单
if(isset($_POST[submit])){
//将字符串编码由utf-8转到gb2312,解决中文文件不能上传问题
$name=iconv(utf-8,gb2312,$_FILES[file][name]);
$extension=substr(strrchr($name,.),1);//得到扩展名
$flag=true;
//迭代判断扩展名是否在黑名单中
foreach($blacklistas$key=$value){
if($value$extension){
$flag=false;
break;
}
}
if($flag){
$size=$_FILES[file][size];//接收文件大小
$tmp=$_FILES[file][tmp_name];//临时路径
//指定上传文件到uploadFile目录
move_uploaded_file($tmp,./uploadFile/.$name);
echo文件上传成功!
}else{
echo上传文件不合法;
}
}
?
upload.php用于接收文件,然后将文件放在uploadFile目录。
步骤3、测试程序运行情况
在浏览器URL处输入:/upload2.html,将出现文件上传对话
框,当上传文件扩展名在黑名单时,将出现“上传文件不合法”的提示,不能上
传。
步骤4、绕过服务器端黑名单检测机制
(1)分析服务器端源程