上传文件的时,如果未对上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,上传脚本等。
造成的危害
导致网站甚至整个服务器被控制,恶意的脚本文件又称为WebShell,WebShell具有强大的功能,如查看服务器目录、执行系统命令等。
JS检测绕过
原理:调用JS的selectFile()函数,将文件名转化为小写,然后通过substr获取文件名最后一个点好后面的后缀(包括点号)进行判断。
<script type=\"text/javascript\">
function selectFile(fnUpload) {
var filename = fnUpload.value;
var mime = filename.toLowerCase().substr(filename.lastIndexOf(\".\"));
if(mime!=\".jpg\")
{
alert(\"请选择jpg格式的照片上传\");
fnUpload.outerHTML=fnUpload.outerHTML;
}
}
</script>
绕过方法:
抓包绕过前端JS的校验就可以直接上传WebShell到服务器。
文件后缀绕过
原理:
通过函数pathinfo()获取到文件后缀,将后缀转为小写后判断是不是php。
$info=pathinfo($_FILES[\"file\"][\"name\"]);
#pathinfo--返回文件路径的信息
$ext=$info[\'extension\'];//得到文件扩展名
if (strtolower($ext) == \"php\") {
exit(\"不允许的后缀名\");
}
绕过方法:
一:有些中间件允许解析其他文件后缀,如在httpd.conf配置文件中,下方文件则能解析php、php3、phtml文件,所以上传一个php3或phtml的文件即可。
二:结合Apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别,则继续判断知道遇到可解析的后缀为止。
比如:Apache的解析127.0.0.1/1.php.366==127.0.0.1/1.php
文件类型绕过(MIME绕过)
原理:
判断$_Files[“file”][“type”]是不是图片格式(image/gif、imge/jpeg、image\\pjpeg),不是则不允许上传。$_Files[“file”][“type”]的值是从请求数据包中Content-Type中获取。
if (($_FILES[\"file\"][\"type\"] != \"image/gif\") && ($_FILES[\"file\"][\"type\"] != \"image/jpeg\")
&& ($_FILES[\"file\"][\"type\"] != \"image/pjpeg\")){
echo(\"不允许的格式\");
exit($_FILES[\"file\"][\"type\"]);
绕过方法:
请求抓包上传php文件时,Content-Type值是application/octer-stream,上传jpg格式的文件时Content-Type值是image/jpeg,可以修改文件类型进行绕过。
文件类型绕过(文件幻数检测)
原理:
利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,则获取不到信息。
if(!getimagesize($_FILES[\"file\"][\"tmp_name\"])){
#getimagesize--取得图片大小
exit(\"不允许的文件\");
绕过方法:
在脚本文件开头补充图片对应的头部值,或在图片后写入写入脚本代码
文件截断绕过
检测原理:
有很多0x00,%00,/00之类的截断,但是核心都在chr(0)这个字符,它可以返回ascii字符,所以chr(0)表示的是null,当程序输出包含chr(0)变量时,chr(0)后面的数据会被截断,后面的数据直接被忽略导致漏洞产生。
绕过方法:
一:用burp抓包拦截,然后修改,
二:在/Upload/后面加一个空格,点开hex,将其对应的20改成00即可,就可以绕过后缀名的过滤,从而得到webshell
三:将文件名后面直接加上%00.jpg,先绕过后缀上传,然后利用burp的urldecode功能,其实和/00截断将hex20变成00一样,效果一样,两种方法都可以拿webshell
文件内容绕过(竞争条件攻击)
检测原理:
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含执行脚本,如果包含则删除。
绕过方法:
利用成功上传到删除文件的事件差上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。
什么是web容器?
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)
中间件:提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。
容器:给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。
服务器:www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向游览器提供服务的程序。
什么是IIS
IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。
.net Framework是基础类库,是程序运行的底层框架。
IIS是架设Web服务器用来提供网页游览服务的,属于系统环境。
一般用ASP.NET开发软件,然后靠IIS对公网提供服务。
什么是文件解析
当服务器接收到一个HTTP请求的时候,
IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名。
服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端。
IIS文件解析漏洞
实际环境漏洞中IIS一般是和asp搭配的,上传的地方如果限制了.asp的后缀名,那么可以使用其他IIS支持的文件后缀。(.cer和.asa)
漏洞利用:
IIS6.0
一:在处理含有特殊符号的文件路径时会出现逻辑错误(会正常执行),从而造成文件解析漏洞。
/test.asp/test.jpg
test.asp;.jpg
二:IIS6.0处理propfind指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候,引发栈溢出,导致远程代码执行。
栈溢出:
栈溢出是缓冲区溢出的一种,分配的内存空间是有限的,如果输入超长的字符串必然会导致溢出。缓冲区溢出中最危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码比如得到系统权限。
Apache文件解析漏洞
apache文件解析漏洞与用户的配置有密切关系。严格来说属于用户配置问题。
一个重要文件/etc/mime.types这里记录了大量的文件后缀和mime类型,当客户端请求一个文件的时候如果后缀在这个列表里,那么apache就返回对应的content-type给游览器如果没有就不会返回而是直接返回文件内容由游览器自动处理。
Nginx文件解析漏洞
与Apache相比,Nginx算是后起之秀,但大有赶超之势。百度一番,又谷歌一番,最终只找到了三个已公开的、关于Nginx的解析漏洞,记录如下。
Tomcat任意文件上传
Tomact远程执行漏洞,编号:CVE-2017-12615。将readonly参数设置为false时,即可通过PUT方式创建一个JSP文件并可以执行任意代码。
文件上传漏洞防御原则
限制文件上传类型
白名单结合黑名单:黑名单常常会出现遗漏或者大小写绕过等问题,所以通常采用白名单限制安全的文件类型。
扩展名检测需要防范%00截断或者文件名包含空格等特殊字符的绕过方式; 对于图片上传,可以考虑对其进行二次渲染/压缩。
限制上传文件大小
1.限制上传文件的大小,防止由于内存、磁盘耗尽造成的拒绝服务。
2.可以配置web server允许的最大Post大小。
3.可以在代码层面获取上传文件的大小,根据文件类型的不同进行进一步的过滤。
确保上传文件被访问正确返回
1.将文件上传目录设置为静态资源目录,防止被解析为脚本执行。
2.使用代理页面隐藏文件真实路径
3.使用上述方法时,确保Content-Type与实际文件类型一致。
4.如果文件不允许在页面展示,仅允许下载,请设置Content-disposition:attachment。
其他
1.确保上传的 文件放在安全的路径下,必要时可以将上传的文件防御web server之外的远程服务器。
2.确保web server版本为最新,防止由于web server漏洞造成文件意外解析。
3.部分文件上传攻击会配合本地其他漏洞进行,所以也要减少服务器其他可利用的漏洞。
注:文章参考来源:https://blog.csdn.net/jpygx123/article/details/83025002
暂无评论内容