文件上传
上传
就是将信息从个人计算机传送至中央计算机系统上,让网络上的人都能看到。将制作好的网页、文字、图片、视频等通过Web或者Ftp传送至互联网上的服务器系统,这一过程称为上传。通过上传点实现我们想要的一系列操作。
客户端校验-----Javascript校验
JavaScript是在自己电脑本机上运行的,用户本身是可以控制的
如何判断是JS校验
在点击上传的时候,查看网络,如果没有网络请求说明是客户端校验
JS校验代码示例
<script type="text/javascript">
function checkFile(){
var file = document.getElementsByName('upfile')[0].value;
if(file==null||file==""){
alert("你还没有选择任何文件,不能上传!");
return false;
}
var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
var ext_name = file.substring(file.lastIndexOf("."));
if(allow_ext.indexOf(ext_name + "|")==-1){
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:";
alert(errMsg);
return false;
}
}
</script>
绕过方法
- 抓包改包
先将文件的后缀名改成可以通过JS校验的后缀,然后在上传的时候通过burpsuite抓包,将文件名的后缀改回原本的后缀名,再forward一下,就可以上传成功我们想要上传的文件
- 禁用JS
通过禁用JS阻止js校验,从而上传我们想要上传的文件
<script language='php'>
highlight_file(__FILE__);system($_GET['cmd']);
</script>
服务器端校验-----content-type字段校验
MIME类型检测
扩展名 | MIME类型 |
---|---|
gif | image/gif |
png | image/png |
jpg | image/jpeg |
js | text/javascript |
html | text/html |
绕过方法 ——————content-type字段正确即可
- 抓包改content-type字段
- 改文件名后上传抓包后再改回文件名
- 上传正常文件改文件内容
服务端校验----后缀名黑名单校验
现在的后缀名太多了,黑名单只能过滤掉一部分的后缀
判断代码
$uptypes = array("php","php3");
$filename = $_FILES["upfile"]["name"];
function getFileExt($file_name){
while($dot = strpos($file_name,".")){
$file_name = substr($file_name,$dot+1);
}
return $file_name;
}
$filetype = strtolower(getFileExt($filename));
if(in_array($filetype,$uptypes)){
echo "非法文件禁止上传";
exit();
}
绕过方法
-
大小写绕过,例如Php、PhP
-
利用黑名单中没有的,但是又能够被解析的后缀名,例如php、php3、php4、php5,phps、pht、phtml等等
-
配合Apache的.htaccess文件上传解析
.htaccess文件(分布式配置文件),全称是Hypertext Access。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或者多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
让某些目录做一个独特的配置
.htaccess文件写入内容
<FilesMatch "filename">
SetHandler application/x·httpd·php
</FilesMatch>
-
使用00截断
-
超长文件名截断上传(windows 258byte | linux 4096byte)
服务端校验----白名单校验
配合Apache的解析缺陷
Apache的解析漏洞主要特性为Apache是从后面开始检查后缀,按最后一个合法后缀
绕过方法
满足后缀名要求
【后续还有其他缺陷正在学习中】
服务端校验-----文件内容头校验
图像处理函数
getimagesize():测定图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通HTML文件中IMG标记中的height/width文本字符串。
如果不能访问filename指定的图像或者其不是有效的图像,getimagesize()将返回FALSE并产生一条E_WARNING
级的错误
绕过方法
在恶意脚本前加上允许上传文件的头标识
竞争上传
情景:
文件上传后,检测是否合法,不合法就删除
注意:意味着文件写入过远程服务器,只是存在时间很短,所以理论上还是可以访问到的
绕过方法
趁代码不注意,赶紧访问(利用各种各种工具)
让被删除的文件,在删除前生成新的文件
开启两个爆破,一个用于上传文件,一个用于访问上传文件后的文件位置