4.2 File Upload
简介
这一节主要探讨文件上传的安全。主要参考资料
是什么?
上传恶意文件到服务器。
而程序编写时,没有对上传来的文件做严格检查,从而导致用户可能上传恶意的文件。例如 webshell
成功攻击的影响是?
上传 webshell ,可以执行系统命令。
上传其它类型恶意文件,见文末。
平常用文件上传干什么?它的是怎么运作的?
网站某些功能需要进行文件上传,例如上传头像、上传相片。
通过 html 表单、Ajax 请求或其它技术将文件通过 http 传输给服务器。这篇博文 总结了常见的文件上传方式。
实际中的限制
通常有严格的 代码机制 或 WAF 对文件名、文件内容,进行严格检查。
即使上传 webshell 成功,也可能会被检测出来,阻止运行。动态检测
如何攻击?
- 进行多次上传尝试、探测后端检测类型。
- 有针对的采用 payload 进行 fuzz 、突破有缺陷的代码防御。
- 连接 webshell。
自动化 fuzz 工具 fuxploider
如何防御?
对上传的文件重命名。白名单后缀。
对中间件等其它组件默认配置进行完善配置。
探测服务端处理逻辑
前端 js 判断通常很好绕过。就暂且不表。
MIME 类型通常不影响webshell 能否正常执行。所以可以不管。
多次上传,重点关注文件名,文件内容。上传成功后的文件是否与源文件文件名、后缀名、文件内容一致。
例如上传图片时可能会进行二次渲染。
特殊的探测技巧
-
上传一个已存在的文件,即文件名相同。
-
上传以特殊字符命名的文件。
. .. ...
-
在 windows 平台上,上传特殊的文件
# 不容易删除的文件 …:.jpg # 文件名包含不合法字符 |<>*?” # 不允许的文件名 CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
常见防御绕过
js 前端
前端 js 验证通常验证的是文件的后缀名。
绕过方式:合法输入,通过 js 验证,然后抓取数据包进行修改。
MIME
MIME 是告诉客户端或服务器将文件内容以何种格式处理。
直接在数据包中修改为合法 MIME 即可。MIME 一般不影响文件类型。
上传表单中 MIME 类型是由浏览器生成的,详见 具体讨论 。
后缀黑名单
罕见格式后缀
这些可能是中间件默认配置所支持的格式,而代码中没有注意过滤。
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc
ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
此外,这些罕见后缀可以和下面其它的技术结合起来使用。
特殊字符
特殊字符,利用编程语言截断缺陷、或利用操作系统文件系统特性。
# 在末尾添加特殊符号
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.\
file.
file.php....
file.pHp5....
# 在中间
file.png.php
file.png.pHp5
file.php%00.png
file.php\x00.png
file.php%0a.png
file.php%0d%0a.png
flile.phpJunk123png
# 添加多个有效后缀,看中间件按哪个进行解析,而代码是按哪个进行检查的。
file.png.jpg.php
file.php%00.png%00.jpg
# 可以检测中间件是否误配置
file.php.png
Win NTFS 文件系统 ADS
交换数据流,具有特殊的语法格式。感兴趣详见 ads stream 。
file.php:.jpg
file.asp::$data.
特殊的配置解析文件
看是否对配置文件设置黑名单。若没有设置,则可以尝试上传这些配置文件,在其中可以配置一些文件解析规则。
- apache 服务器。
.htaccess
- iis 服务器。
.config
- cgi/fastcgi 模式下 PHP 。
.user.ini
后缀白名单
截断,添加特殊字符尝试截断。
文件内容
检查上传前后文件的 md5 是否相同。
检查文件头
即检查 magic bytes
解决方法:将脚本追加到正常的图片里,形成 polyglot file 。
二次渲染
二次渲染,就是从一张图片中生成另一张图片。通常进行二次渲染后,后门代码会消失。
# 例如 php 函数
imagecreatefromjpeg
imagejpeg
从概念上来讲,能绕过二次渲染的文件,也称为 polyglot 文件,关于如何绕过二次渲染,详见下文。
检查 <?php
利用 php 语言特性,php < 7 可以识别以下形式的代码。
<script language="php">echo "asdasd";</script>
其它
关于绕过方式的补充
后缀大小写敏感
一般代码都大小写不敏感。
条件竞争
是指文件先被挪到上传目录,再进行检查是否合法决定是否删除。实际中,不太可能出现这种处理逻辑。
利用方法:不断上传,同时不断访问。
其它层次的漏洞
其它层次如果存在漏洞的话也可能会影响到文件上传安全。例如中间件解析漏洞等。
与其它漏洞结合
如果文件名被用于其它场合,就可能会产生相应漏洞。例如以下特殊文件名
../../../tmp/lol.png # 目录遍历
sleep(10)-- -.jpg # sql 注入
<svg onload=alert(document.comain)> # xss
; sleep 10; # 命令注入
其它文件格式可能攻击方式
具体利用手法, google 搜索关键词
- ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
- SVG: Stored XSS / SSRF / XXE
- GIF: Stored XSS / SSRF
- CSV: CSV injection
- XML: XXE
- AVI: LFI / SSRF
- HTML / JS : HTML injection / XSS / Open redirect
- PNG / JPEG: Pixel flood attack (DoS)
- ZIP: RCE via LFI / DoS
- PDF / PPTX: SSRF / BLIND XXE
polyglot file
主要内容来自 这篇博文 。
polyglot 文件可以呈现出多态,当使用不同的应用程序访问会呈现不同内容。其原理是使文件内容符合多种文件格式。
举个例子,在二次渲染中,经常将 php 一句话写入到图片文件的某个位置中,形成 polyglot 文件,这个文件既可以以图片的方式查看,也可以正常执行 php 内容。详见
具体的实现细节请参考上面两篇博文。
这个是生成工具 https://github.com/huntergregal/PNG-IDAT-Payload-Generator
打算到后期了解了 WAF 识别机制后,尝试写一个能绕过 WAF 的 polyglot 文件的脚本。
WAF 绕过
等链接到后面的章节。