文件上传是很多 web application 所需要的功能。但如果 web application 对上传的文件过滤不严格的话就会产生文件上传漏洞。

产生

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不严格,而导致的用户可以越权上传一些非正常文件。如木马,WebShell等。这种攻击方式是最为直接和有效的,并且隐蔽性也较好。
“文件上传”本身没有问题,有问题的是文件上传后,服务器如何对文件进行判断,筛选。如果服务器的处理做的不够安全,则会导致文件上传漏洞的产生。

使用

将攻击用的 webshell,木马等文件打包上传即可。(但服务器怎么可能不过滤呢)

过滤

1.前端限制

如以下代码:

function check(){

        var filename=document.getElementById("file");

        var str=filename.value.split(".");

        var ext=str[str.length-1];

        if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif'){

            return true;

        }else{

            alert("这不是图片!")

            return false;

        }

        return false;

    }

这种前端的过滤仅仅只是在本地进行检查,只能算是防止用户误上传用的。

绕过方法

想要绕过的话就先以正常的扩展名上传,再通过抓包将扩展名改回扩展名。

如果使用JS过滤的话禁止JS就好了。

2.文件扩展名判断

一些 web application会通过上传文件的后缀名进行判断。如果后缀名不正常就阻止上传。

两种判断策略:

(1): 黑名单策略

通过禁止不合法的扩展名来过滤。但这种方法并不是很好。(谁知道传上来的是什么扩展名)

(2): 白名单策略

只允许特定的扩展名上传。
如DVWA中的限制:

if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG")
//只有满足这几个扩展名才可以上传
绕过方法

在一些 web server 中存在解析漏洞:

nginx < 8.03 空字节代码执行漏洞

在Fast-CGI关闭的状态下,文件路径 /xx.jpg%00.php 会解析成PHP文件。

apache解析漏洞
apache在解析文件时,是从右往左开始解析,如果遇到不认识的后缀名,就在往左解析。
如解析类似 shell.php.xxx.rar的文件时,rar无法解析,接着往左判断xxx也不可解析,最后到PHP后缀。
(所以说黑名单策略白名单策略)

3.检查HTTP Header中的Content-Type

HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型来进行过滤。

//MIMETYPE:判断文件真实类型。它是先由文件头判断文件类型,再根据内容和扩展名判断。

绕过方法

使用工具抓包篡改Header即可。

常用的MIMETYPE:


image/jpeg(JPEG图像)

image/png(PNG图像)

video/mpeg(MPEG动画)

application/octet-stream(二进制数据)

application/pdf(PDF文档)

application/(编程语言) 该种语言的代码

application/msword(Microsoft Word文件)

message/rfc822(RFC 822形式)

multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)

application/x-www-form-urlencoded(POST方法提交的表单)

multipart/form-data(POST提交时伴随文件上传的表单)

4.分析文件头内容来检查文件类型

这种方法是直接检查文件的开头,利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。
正常情况下,通过判断前10个字节,基本上就能判断出一个文件的真实类型。

绕过方法

在上传的文件前面加上相应的头即可。因为PHP会将 <? 之前的内容当作html文本,不解释而跳过之,后面的代码仍然能够得到执行。

5.限制Web Server对于特定类型文件的行为

文件上传漏洞的根本原因就是 web server 将本应是数据的内容当成了代码而去执行。知道了这点就可以在这方面进行限制。

绕过方法

这一部分视频里是直接将上传文件所在的upload文件夹的执行权限去掉。我没想到如何绕过。

参考资料里的限制后面再看吧(咕咕咕警告)

参考资料:
https://www.jianshu.com/p/5ebba0482980
https://www.kanxue.com/book-6-307.htm

最后修改:2019 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏