跳转至
阅读量:

文件上传漏洞

概念

文件上传(File Upload)是大部分Web应用都具备的功能,例如用户上传附件、修改头像、分享图片/视频等。正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储,需要的时候再调用出来返回。

如果恶意文件如PHP、ASP等执行文件绕过Web应用,并顺利执行,则相当于黑客直接拿到了Webshell,则可以拿到Web应用的数据,删除Web文件,本地提权,进一步拿下整个服务器甚至内网。

一、验证与绕过

1. 前端

最常见的就是检测扩展名是否合法,有白名单形式也有黑名单形式。

对于前端的验证,我们可以通过修改 JS 代码,或者通过抓包的方式绕过验证。

实例:upload-labs —— Pass-01

2. 服务端

1. MIME绕过

MIME(Multipurpose Internet Mail Extensions):多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型。服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的。

绕过方式:

通过抓包工具 Burp Suite 进行抓包,修改 Content-Type 字段的值为合法值。

Content-Type 对照表

数据类型 Content-Type(Mime-Type) 数据类型 Content-Type(Mime-Type)
HTML text/html GIF image/gif
纯文本 text/plain jpg 图片 image/jpeg
XML text/xml png 图片 image/png
JSON application/json PDF application/pdf
二进制流数据(如常见的文件下载) application/octet-stream js application/x-javascript
jsp text/html

实例:uploads-labs —— Pass-02

2. 特殊解析后缀

一些特殊的后缀名有可能会被相应的服务器解析,在遇到检测文件后缀名的网站时,我们可以通过抓包修改后缀名的方式进行绕过。

php:php3、php4、php5、php7、phtml

jsp:jspx、jspf

asp:asa、cer

实例:uploads-labs —— Pass-03

3. 上传 .htaccess 文件

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:

网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

假如我们自定义一个规则,并让服务器运行我们定义的规则,便可绕过上传限制。

htaccess 文件写法一:

AddType application/x-httpd-php .后缀名
# 创建相同后缀名的一句话木马,作用就是会让这个后缀名变成php代码执行

htaccess 文件写法二:

# FileMatch 参数即为文件名的正则匹配
<FilesMatch "xxxx">
SetHandler application/x-httpd-php
</FilesMatch>

​ 实例:uploads-labs —— Pass-04

4. 大小写绕过

当服务器没有使用 strtolower() 函数将文件名全部变成小写进行检测时,就可以通过大小写进行绕过检测。

如:.PHP .Php .PHp 等等

​ 实例:uploads-labs —— Pass-05

5. 空格绕过

Windows 系统会自动去掉后缀名最后的空格,或者服务端不存在 trim($file_name) 用以删除文件名后面的空格,就那么可以通过在文件名后面加空格进行绕过。

​ 实例:uploads-labs —— Pass-07

6. ::$DATA绕过

在window的时候如果文件名+"::\(DATA"会把::\)DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

例如:"phpinfo.php::\(DATA"Windows会自动去掉末尾的::\)DATA变成"phpinfo.php"

实例:uploads-labs —— Pass-09

### 7. 点号绕过

Windows 系统会自动去掉后缀名最后的“.”,或者服务端不存在 deldot($file_name) 用以删除文件名后面的空格,就那么可以通过在文件名后面加“.”进行绕过。

​ 实例:uploads-labs —— Pass-08

8. 双写绕过

str_ireplace(php,"",pphphp)

通常出现这个函数往往只会替换一次,那么就可以通过双写后缀名进行绕过:

pphphp >> php

实例:uploads-labs —— Pass-10

9. 00 截断

0x00,%00,/00之类的截断,都是一样的,只是不同表示而已。

0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制,

%00 截断的使用条件:

php版本必须小于5.3.4 且 php.ini中的 magic_quotes_gpc设置为Off

原理:

php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束 0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制 。

效果:

demo.php%00.jpg >> demo.php

实例:uploads-labs —— Pass-11

评论