文件上传校验方式
- 客户端javascript校验(一般只校验后缀名)
- 服务端校验
文件头content-type字段校验(image/gif)
文件内容头校验(GIF89a)
后缀名黑名单校验
后缀名白名单校验
自定义正则校验 - WAF设备校验(根据不同的WAF产品而定)
1. 客户端校验
一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
2. 服务端校验
2.1 content-type字段校验
代码对上传文件的文件类型进行了判断,如果不是图片类型,返回错误
<?php
if($_FILES['userfile']['type'] != "image/gif") #这里对上传的文件类型进行判断,如果不是image/gif类型便返回错误。
{
echo "Sorry, we only allow uploading GIF images";
exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>
2.2 文件头校验
可以通过自己写正则匹配,判断文件头内容是否符合要求,这里举几个常见的文件头对应关系:
(1) .JPEG;.JPE;.JPG:”JPGGraphic File”
(2) .gif:”GIF 89A”
(3) .zip:”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr:”MS Compound Document v1 or Lotus Approach APRfile”
文件上传绕过方式
- 客户端绕过(抓包改包)
- 服务端绕过
文件类型
文件头
文件后缀名 - 配合文件包含漏洞绕过
- 配合服务器解析漏洞绕过
- CMS、编辑器漏洞绕过
- 配合操作系统文件命名规则绕过
- 配合其他规则绕过
- WAF绕过
1.客户端绕过
可以利用burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可。
2.服务端绕过
2.1 文件类型绕过
我们可以通过抓包,将content-type字段改为image/gif