任意文件上传
漏洞原理
web 应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;另一方面,程序开发部署的时候,没有考虑到系统特性和过滤不严格;再者就是,攻击者通过 web 服务器解析漏洞绕过显示,导致可以上传任意文件。
漏洞危害
- 文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序、如果是 Linux 系统且开启了 ssh 可以上传公钥至服务器替换,达到控制服务器的目的。
- 如果 web 服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。
- 如果攻击者同通过其他漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。
- 同服务器下的其他网站无一幸免,均会被攻击者控制。
修复建议
- 将文件上传目录直接设置为不可执行。
- 文件类型检查:强烈推荐白名单方式,结合 MIME Type、后缀检查等方式(即只允许允许的文件类型进行上传)。
- 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件。
- 对于图片的处理可以使用压缩函数或 resize 函数,处理图片的同时破坏其包含的 HTML 代码。
- 单独设置文件服务器的域名。
测试方法
- 如果是前端检查后缀名,将文件名修改成 test.png,上传后抓包修改成 test.php。
- 修改 Content-Type 为 image/png 等。
- 修改文件后缀名,使用大小写或者双写,如 test.PHP、test.pphphp。
- 上传 .htaccess 文件,文件内容
SetHandler application/x-httpd-php
,作用是当前目录以及子目录所有文件将会被当作 php 解析。 - 使用文件流特性,test.php::$DATA。
- 文件名后缀加上 %00、0x00。
- 替换文件的头部信息,<0x89>PNG <0x47>GIF <0xFF>JEPG。
- 文件后缀名加空格或者点,test.php test.php. test.php..。
- 使用图片马,需要配合文件包含漏洞,
copy test.png /b + test.php /a test.jpg
。 - 使用条件竞争,利用服务端删除文件的时间差,一个线程上传文件,一个线程访问该文件。
- 使用
.user.ini
。
.user.ini:
# 绕过跨目录限制
open_basedir=:/
# 在php文件代码执行前用require包含进指定文件
auto_prepend_file=top.html
# 在php文件最后用require包含进指定文件
auto_append_file=down.html
# 利用条件
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
user.php:
<?php
eval($_post["pass"])
?>