共计 3408 个字符,预计需要花费 9 分钟才能阅读完成。
常见的文件上传过滤手段
- 服务器JS前端校验
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
- 文件头content-type字段校验(image/gif)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (in_array($mimeType, $allowedMimeTypes)) {
echo "文件类型合法";
} else {
echo "文件类型不合法";
}
- 文件内容头校验(GIF89a)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (in_array($mimeType, $allowedMimeTypes)) {
echo "文件类型合法";
} else {
echo "文件类型不合法";
}
- 后缀名黑名单校验
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
- 后缀名白名单校验
// 定义允许上传的文件后缀白名单
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
// 获取上传文件的后缀
$fileExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
// 转换为小写,确保校验时不受大小写影响
$fileExtension = strtolower($fileExtension);
// 检查文件后缀是否在白名单中
if (in_array($fileExtension, $allowedExtensions)) {
echo "文件类型合法,允许上传";
// 进行后续文件上传操作
} else {
echo "文件类型不合法,拒绝上传";
}
- 自定义正则校验
$fileName = $_FILES['file']['name'];
$pattern = '/^photo_\w+\.(jpg|png)$/i';
if (preg_match($pattern, $fileName)) {
echo "文件名格式合法,允许上传";
} else {
echo "文件名格式不合法,拒绝上传";
}
- 文件内容校验
$image = imagecreatefromstring(file_get_contents($_FILES['file']['tmp_name']));
if ($image !== false) {
echo "文件类型合法";
imagedestroy($image);
} else {
echo "文件类型不合法";
}
常见php函数
exif_imagetype() #通过读取文件的头部字节并检查其签名来判断文件类型。
常见绕过手段
文件名变形绕过
1.大小写绕过
在对大小写敏感的服务器上使用可以
如使用.phP,.Php,.pHp等
2.文件头绕过
在木马前面插入文件头或者将木马和正常的图片文件合并
tips:一种特殊的文件头部(可以注释的同时也绕过了文件头校验,可以配合.htaccess)
#define width 1
#define height 1
3.配合操作系统文件命令规则
上传不符合windows文件命名规则的文件名 test.asp. test.asp(空格) test.php:1.jpg test.php::$DATA shell.php::$DATA……. 会被windows系统自动去掉不符合规则符号后面的内容。
4.0×00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
test.php(0x00).jpg test.php%00.jpg
配置文件上传绕过
.htaccess
htaccess文件时Apache服务中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能.
前提:http.conf文件中设置 AllowOverried All ,才能使用.htaccess文件
.user.ini
前提:
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
正文完
还有获取图片尺寸(宽和高)等方法哦
@Bail 好的好的