定义
Web应用程序一般都具有上传功能,如果服务端代码未对客户端上传的文件进行严格的验证和过滤,恶意攻击者可以上传脚本文件并被服务器解析,文件上传漏洞就产生了。
检测及绕过姿势
一般来说,关于文件上传漏洞的检测分为两个大方面:
注明:
以下的绕过方法,是针对具体的某种检测方式而言,现实中遇到的环境,大多是多种检测方式的组合,绕过方式也视具体而定。
客户端检测
原理:
在网页上写一段Javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
绕过方法:
1.直接禁用Javascript实现绕过。
2.先改成允许上传的文件类型,然后用Burpsuite改成脚本文件类型,即可绕过。
服务端检测
MIME类型检测
原理:
通过对上传包里面的Content-Type类型进行检测,若是非法则无法上传;
绕过方法:
方法1. 上传Php一句话后,捉包修改mime类型;
方法2. 上传.jpg格式的一句话改后缀。
文件上传中常使用的mime type:
image/gif -> .gif
image/jpeg -> .jpg / .jpeg
image/png -> .png
目录路径检测
原理
目录路径检测,检测跟path 参数相关的内容,一般就检测路径是否合法。
绕过方式
利用对目录路径的检测不够严谨,使用一些比较特殊的路径,例如:0x00 截断(系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束)绕过
文件内容检测
文件幻数检测(文件开头)
原理
幻数 magic number,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47
绕过方式
方法1,上传一句话,捉包,加上图片类型的文件头;
方法2,上传图片马,改后缀,或者直接在可上传的图片内容后加上一句话木马。
文件加载检测(代码注入)
原理
一种是对上传的图片文件进行渲染/加载测试;
还有是对上传的图片文件进行二次渲染。
绕过方式
对于第一种:使用代码注入的方法,使用winhex在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区;
对于第二种:对文件加载器进行攻击,常见的就是溢出攻击;上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行 shellcode,比如 access/mdb 溢出。
文件扩展名检测
原理:
文件拓展名检测主要分为黑名单检测和白名单检测的方式。
黑名单,即在程序中定义了特定的文件后缀名为不可上传的;
白名单,即在程序中定义了允许上传的后缀名。
绕过方式:
文件名大小写绕过,
如:. Php…;Jsp;*.aSP *.AsP…
名单列表绕过,
如:
php2,php3,php5,phtml; aspx、ascx、
ashx、cer、asa;
特殊文件名绕过
//windows文件名最后不能有.或空格,可设为 *.php. 或 *.php+
0x00截断绕过
//如:*.php(0x00).jpg 或 *.php%00.jpg
利用文件包含漏洞
由于PHP包含的所有文件都会以PHP文件的形式来执行,所以当网站同时存在文件包含漏洞和文件上传功能时,即使上传处不存在上传漏洞,依旧可以结合包含漏洞获得webshell。
利用服务器解析漏洞
Apache
Apache(1.x,2.x)解析文件的原则:Apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar、gif等扩展名是Apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的。
IIS
IIS6.0下主要是有两个解析漏洞:
一个是目录解析,如果网站目录中有一个 *.asp/ 的文件夹,那么该文件夹下面的一切内容都会被 IIS 当作 asp 脚本来执行,如/xx.asp/xx.jpg;
另一个就是文件解析,IIS在解析文件名的时候会将分号后面的内容丢弃,如xx.asp;.jpg,可通过此漏洞上传shell,对服务器危害较大。
IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa
/test.cer
/test.cdx
IIS 7.0/7.5/Nginx < 8.03,默认 Fast-CGI 开启。如果直接在 url 中图片地址(.jpg)后面输入/.php,会把正常图片解析为 php 文件。本质:PHP CGI的漏洞,在PHP的配置文件中有一个关键的选项cgi.fix_pathinfo在本机中位于C:wampbinphpphp5.3.10php.ini,默认是开启的,当URL中有不存在的文件,PHP就会向前递归解析。
Nginx
空字节漏洞,影响版本:0.5、0.6、0.7<=0.7.65、0.8<= 0.8.37
也就是当Fast-CGI执行php时,http://127.0.0.1/1.jpg%00.php 会把1.jpg文件(木马文件)当做php文件来执行。
.htaccess文件攻击
.htaccess文件
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
若是如下的.htaccess配置,则可以令所有的文件都以PHP文件来执行:
<FileMatch "a.jpg"> SetHandler application/x-httpd-php </FilesMatch>
其他检测机制:
先上传后检测
原理
一开始允许任意上传文件,上传后再检测,若是恶意文件则删除;
绕过方式
条件竞争绕过,通过上传一个内容为生成一句话木马的脚本,由于服务器检测出文件为恶意文件并删除存在极短的时间差,利用burpsuite或其他工具不断的上传和访问该文件,若是竞争成功,则会生成一句话木马从而躲避了服务器的检测。
危害
网站挂马;
服务器失陷等
防御
1, 文件扩展名服务端白名单校验;
2, 文件内容服务端校验;
3, 上传文件名重命名;
4, 隐藏上传路径;
5, 限制上传目录的执行权限
参考:
https://segmentfault.com/a/1190000016012608
https://blog.egsec.cn/archives/476
练习
upload-labs靶场
后续更新