第21天文件上传黑白名单绕过
文件上传常见验证:
后缀名,类型,文件头等
后缀名:黑名单,白名单(直接验证)
绕过黑名单:apache服务器能够使用php解析.phtml.php3等格式(注意这些是否没有被记入黑名单)能否被正确执行取决于对方服务器的情况
文件类型:MIME(content-type)
文件头:文件编码的头部信息(png,jpg)
<?php
$is_uplode=false;
$msg=null;
if(isset($_POST['submit'])){//已上传
if(file_exists(UPLOAD_PATH){//存在指定目录
if($FILES['uplode_file']['type']=='image/jpeg'){//判断文件类型
$temp_file=$_FILES['upload_file']['tmp_name'];
$img_path=UPLOAD_PATH.'/'.$_FILES['uplode_file']['name']
if(move_uploaded_file($temp_file,$img_path)){
$is_upload=true;//文件上传到对应目录
}
else{
$msg='上传出错!';
}
}else{
$msg='文件类型不正确,请重新上传!';
}
}
else{
$msg=UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
$deny_ext=array('.asp','.aspx','.php','.jsp');//黑名单
$file_name=trim($_FILES['uoload_file']['name'])//去除字符或其他预定义字符
$file_name=deldot($file_name);//删除文件名末尾的点(1.jpg.php)
$file_ext=strrchr($file_name,'.');//找到文件的真实后缀
$file_ext=strtolower($file_ext);//转换为小写
$file_ext=str_ireplace('::$DATA','',$file_ext);//去除字符串::$DATA
$file_ext=trim($file_ext);//收尾去空(空格绕过)
.htaccess apache中实现解析自定义
将文件名cimer文件以php执行
::$DATA会把之后的数据当成文件流处理,不会检测后缀名,且保持'::$DATA'之前的文件名;
一次过滤
a.pphphp->a.php
循环过滤
a.pphphp->a.
%00截断(地址)
0x00(文件名)
License:
CC BY 4.0