0x00 介绍
文件上传漏洞是Web漏洞类型中最常见的一种,也是最容易获得服务器权限的漏洞之一。
当网站上传功能设计时没有对安全考虑周全,就会产生这类漏洞。
0x01 文件检测方法
- 客户端 - JS检测:一般检测 文件扩展名
- 服务端 - 文件扩展名检测:检测文件 extension 相关内容
- 服务端 - 上传目录检查:检查 path 参数合法性(如果可以指定目录的话)
- 服务端 - MIME类型检测:判断 Content-Type 内容
- 服务端 - 文件内容检测:内容是否合法或含恶意代码
0x02 绕过方法
以下主要通过 BurpSuite 实现绕过并上传 WebShell :
-
JS检测:上传文件时,在向服务器发送数据前,就提示文件不合法,说明存在JS检测
- 覆盖JS检测代码;
- 禁用JS运行;
- 开启BP,拦截正常文件的上传请求,然后修改内容。
-
EXT扩展名绕过:上传正常文件可以通过,改了扩展名上传失败。
1.黑名单绕过:- 大小写:
.aSp
、.pHp
等 - 列表绕过:
.php3
、.php5
、.asa
、.cer、.cdx
等 - 仅Windows下特殊命名:
a.asp.
、a.asp空格
- 0x00截断绕过:
a.php+j.jpg
,利用BP的Hex将+[0x2B]
改为[0x00]
- Apache的.htaccess:
<FilesMatch "xxx">SetHandler application/x-httpd-php</FilesMatch>
设置名字含xxx的文件为php可执行文件
2.白名单绕过(输入一个不存在的后缀仍提示错误后缀,说明使用白名单):
-
0x00
截断绕过 ( php 版本<5.3.4 ) - (252-后缀长度)个
.
+后缀,实现绕过。 [参考]
3.解析漏洞
- Apache解析漏洞
- 可执行文件的
FilesMatch
配置错误(如.\php.\
)导致a.php.jpg
可运行 [参考] -
<FilesMatch ".+\.php$">
:利用换行0x0A
绕过$
[CVE-2017-15715]
- 可执行文件的
- IIS解析漏洞
- Nginx解析漏洞
- PHP-FPM攻击:使用
fpm3.py ip port php_file php_code
攻击 [参考] -
cgi.fix_pathinfo=1
可导致文件解析漏洞,高版本以白名单security.limit_extensions
修复
- PHP-FPM攻击:使用
- 大小写:
-
上传目录检查
- 利用 %00 截断攻击,例如
/fckeditor264/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=shell.php%00file.jpg
- 修改上传目录(IIS 6.0),若存在目录参数且可控,可用BP进行修改,并结合IIS 6.0的目录解析漏洞实现攻击。
- 利用 %00 截断攻击,例如
-
MIME类型检测:上传正常图片可以通过,改
Content-Type
为application/octet-stream
则失败- 开启BP,拦截正常文件的上传请求,然后修改
Content-Type
即可绕过。
- 开启BP,拦截正常文件的上传请求,然后修改
-
文件内容检测绕过:上传正常图片可以通过,改了文件头部上传失败。参考
1.幻数检测绕过:破坏文件幻数,上传失败。
在正常的幻数后面加入一句话木马,下面是常见幻数。- JPG:FF D8 FF E0 00 10 4A 46 49 46
- GIF:47 49 46 38 39 61
- PNG:89 50 4E 47
2.结构加载绕过:指API获取图片结构,若上传的文件结构无法解析,则上传失败。
只需要把文件头部分伪造好就可绕过。一般可直接在文件尾加入木马。GIF89a (...some binary data for image...) <?php phpinfo(); ?> (... skipping the rest of binary data ...)
3.渲染测试绕过:指调用API尝试渲染图片,若上传的图片无法渲染,则上传失败。
在不破坏文件本身的渲染情况下找一个空白区进行填充代码即可绕过。
渲染测试绕过4.二次渲染绕过:图片上传后被重新渲染后保存,因此文件内的注入代码会被破坏。即上传后下载的图片,与上传的图片数据内容不一致。
先上传不完整的图片,通过报错信息了解使用什么API进行二次渲染。然后对渲染组件进行攻击,常见为溢出攻击。
0x03 防护措施
- 检查配置信息无误
- 上传后,文件重命名+时间戳+随机数
- 安装必要的防护软件
网友评论