一、漏洞原理
1.1 核心
文件上传漏洞,顾名思义,将攻击者将恶意文件上传到服务器,服务器将恶意文件解析,攻击就达成了。
1.2 漏洞详解
文件上传漏洞非常好理解,有三个关键点,一是上传文件,二是找到文件上传的路径,三是使恶意文件得到解析。
假设一个系统没有防御(后面会讲绕过),文件上传漏洞步骤就如下:
- 上传恶意文件,如php一句话木马:
php
<?php @eval('cmd');?>
- 服务器返回上传到的路径:
路径可能可以在Response中看到,也可能很简单的回显给你,比如头像,文章之类的,你就知道路径了(当然,也有可能很难找)
例如路径为:http://xxx.com/41937489134/cmdshell.php - 使恶意文件得到解析:
有时候直接点击链接,文件就得到执行了(有时候无法执行,就需要配合文件包含漏洞等),如:
点击http://xxx.com/41937489134/cmdshell.php ,之后用蚁剑等工具连接就getshell了。
上述的情况非常理想,几乎不可能,那么如何绕过和构造利用链就是重中之重了。
二、检测与利用
检测方法很简单,找到可以上传文件的接口,尝试各种绕过技巧或构造利用链,如果可以,那就是存在。
利用也很简单,构造木马文件(一句话木马,大马,图片马等),上传解析,就可以getshell了。
主要还是绕过和构造利用链!!!
三、修复与绕过
这里将修复与绕过统一起来说,便于读者理解和选择绕过技巧。偏向于攻击者视角。
3.1 JS前端检查
JS前端检查这种防御手段形同虚设,两种绕过方式:
- F12开发者工具禁用JS。
- BurpSuite抓包,改包。例如想传muma.php,先改一下后缀名,改为muma.jpeg,然后BP抓包再改回muma.php即可。
3.2 Content-Type校验
根据请求报文Content-Type字段进行校验,绕过方式:
抓包,将Content-Type改为image/jpeg,image/png,application/pdf等服务端允许接收的即可。
3.3 文件头类型检测
文件头(有时也叫 魔数 Magic Number)指的是文件开头的几个字节(通常 2~8 字节,有的更长),这些字节是文件格式的标识,用来告诉操作系统或应用程序该文件属于什么类型。可用于识别文件类型,往往比扩展名更可靠。常见的文件头有:
文件类型 | 十六进制文件头 (Magic Number) | 说明 |
---|---|---|
JPEG (jpg) | FF D8 FF E0 或 FF D8 FF E1 |
数码照片最常见格式 |
PNG (png) | 89 50 4E 47 0D 0A 1A 0A |
PNG 标志 |
GIF (gif) | 47 49 46 38 39 61 或 47 49 46 38 37 61 |
"GIF89a" 或 "GIF87a" |
BMP (bmp) | 42 4D |
"BM" |
TIFF (tif) | 49 49 2A 00 或 4D 4D 00 2A |
分别对应小端/大端 |
PDF (pdf) | 25 50 44 46 |
"%PDF" |
ZIP (zip/docx/pptx/xlsx/jar) | 50 4B 03 04 |
ZIP 压缩包及基于 ZIP 的 Office 文件 |
RAR (rar) | 52 61 72 21 1A 07 00 或 52 61 72 21 1A 07 01 00 |
RAR4 / RAR5 |
7z (7zip) | 37 7A BC AF 27 1C |
7-Zip |
EXE (Windows) | 4D 5A |
"MZ" 标志 |
ELF (Linux可执行) | 7F 45 4C 46 |
"ELF" 标志 |
MP3 (音频) | 49 44 33 或 FF FB |
"ID3" 标签 或 MP3 帧头 |
MP4 (视频) | 00 00 00 18 66 74 79 70 69 73 6F 6D |
"ftypisom" |
WAV (音频) | 52 49 46 46 + ... + 57 41 56 45 |
"RIFF....WAVE" |
XML/HTML | 没有固定魔数,一般开头是 < |
|
文件头检测也不一定安全,工具者可以通过二进制编辑工具,如010Editor,在文件开头插入伪造的文件头进行绕过。 |
3.4 文件拓展名检测
文件拓展名检测大体可分为白名单检测和黑名单检测。白名单检测往往更加的安全。
3.4.1 黑名单检测:
如服务器端禁止"php,jsp"文件。
绕过方法大致如下:
- 大小写双写混淆:如PhP, jsP这类的,还有pphphp,jjspsp
- 00截断:php版本低于5.3.4可以尝试%00截断。如muma.php%00.jpeg。这样%00之后的字段会被截断丢弃,就相当于muma.php,从而进行绕过。
- Windows特性:有些绕过利用了Windows的特性,如Windows会忽略最后的'.'' ',还有Windows附加数据流。如muma.php. .,muma.php::$DATA进行绕过
- 同义文件拓展名:如将php换成php3,php2之类的,默认配置下可能不太好用。
- .htaccess绕过:.htaccess文件为Apache配置文件,仅作用于当前目录。通过在里面写"AddType application/x-httpd-php .php .txt .jpg"等将常见后缀名作为php解析,之后上传.txt等文件就可以实现注入了。但是前提是Apache允许其生效,AllowOverride All才可以,默认配置不可以。
- .user.ini绕过:.user.ini是用户自定义配置文件,用于覆盖或追加全局配置文件(如.php.ini)中的PHP配置选项。
3.4.2 白名单检测:
绕过方法大致如下:
- 00截断:php版本低于5.3.4可以尝试%00截断。如muma.php%00.jpeg。这样%00之后的字段会被截断丢弃,就相当于muma.php,从而进行绕过。
- 图片马:图片马的使用一般需要结合文件包含漏洞来实现(详细见下)。图片马的制作就是将一句话木马写入合法图片之中,然后上传图片,但是因为图片默认不会被执行,所以需要配合文件包含漏洞来实现。如果上传的图片会被重写,可以上传GIF图片,因为GIF图片常常会有大段内容不被重写。之后对比原GIF图片和重写后的GIF,找到没有被重写的部分,加入恶意代码。重新上传即可。
3.5 绕过链
3.5.1 与文件包含漏洞:
- 先正常上传一个图片马,因为是图片,所以大部分时候都可以上传成功。
- 得到图片上传到的地址:http://xxx.com/pics/muma.jpeg
- 使用文件包含漏洞(可执行)包含图片马执行:如:http://xxx.com/aaa?include=http://xxx.com/pics/muma.jpeg
- 使用蚁剑连接即可。
当然,如果有文件包含漏洞,常常可以尝试日志注入,日志注入成功就用不着文件上传漏洞了。文件包含漏洞详解:https://www.cnblogs.com/L-xy/p/19093806
3.5.2 与反序列化漏洞:
- 先将序列化payload进行上传。
- 同样的,利用反序列化漏洞对上传的序列化payload进行反序列化。
- payload被执行,攻击成功。
同样的,如果有反序列化漏洞,也可以考虑日志注入。