只要 Web 应用程序允许上传文件,就有可能存在文件上传漏洞。
攻击者在利用上传漏洞时,通常与 Web 容器的解析漏洞配合。常见的 Web 容器有 IIS、Nginx、Apache、Tomcat 等,以 IIS、Apache 容器为例。
-
Web 容器是运行在服务器上的软件,负责监听网络端口并接收用户的 HTTP 请求。
-
它根据文件后缀名决定处理方式:直接返回静态资源(如图片),或调用解释器执行动态脚本(如 PHP)。
-
它是连接底层操作系统与上层 Web 应用程序的中间层,为代码运行提供必要的环境支持。
1. IIS 解析漏洞
IIS 6.0 在解析文件时存在两个解析漏洞:
-
建立
*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被 IIS 当作 asp 文件来解析。- 例如建立文件夹 `parsing.asp` ,在 `parsing.asp` 文件夹内新建文本文档 `test.txt` ,内容为 `<%=NOW()%>` ,在浏览器内访问,IIS 会获取当前时间显示,即当作 ASP 脚本来解析。 - **ASP (Active Server Pages)** 是一种由微软开发的**动态网页技术标准**。它是一种包含 HTML 标签、普通文本和脚本代码(通常是 VBScript 或 JScript)的文件,后缀名为 `.asp`。当浏览器请求该文件时,Web 容器(通常是 IIS)会先在服务器端执行其中的脚本,生成标准的 HTML,再发送给浏览器。 -
当文件为
*asp;1.jpg时,IIS 6.0 同样会以 ASP 脚本来执行。如新建文件test.asp;1.jpg,内容为<%=NOW()%>,执行得到当前时间。
2. Apache 解析漏洞
Apache 在解析文件时,碰到不认识的扩展名时,会从后向前解析,直到碰到认识的扩展名。如果都不认识,会暴露其源代码。
如: 1.php.rar.xs.aa ,Apache 首先解析 aa 扩展名,不认识就解析 xs 扩展名,一直遍历到认识的扩展名位置。Apache 安装目录下 /conf/mime/types 中有详细的 Apache 可识别的扩展名列表。
- 程序开发人员设置在上传文件时判断文件名是否时 PHP、ASP、ASPX、ASA、CER、ASPX 等脚本扩展名,是就不允许上传。攻击者可能上传
1.php.rar等来绕过程序检测,配合解析漏洞获取到 Webshell。
3. PHP CGI 解析漏洞
3.1 核心原因:cgi.fix_pathinfo
PHP 的配置文件 php.ini 中有一个参数叫 cgi.fix_pathinfo。为了支持跨平台路径,当它开启时(值为 1),如果请求的文件路径不存在,PHP 会递归地查询路径,直到找到一个存在的文件为止。
3.2 漏洞触发逻辑
当 Nginx 配置不当时,攻击者可以构造如下请求:
http://www.example.com/upload/avatar.jpg/.php
-
Nginx:看到后缀是
.php,认为这是一个 PHP 脚本,于是把它转发给后端的 PHP 解释器(PHP-FPM)。 -
PHP:
-
去找
avatar.jpg/.php,发现这个文件不存在。 -
由于
cgi.fix_pathinfo=1,开始向左递归查找。 -
发现
avatar.jpg是存在的,于是强行将avatar.jpg当作 PHP 脚本进行解析并执行。
-
3.3 漏洞危害
如果上传一个包含恶意代码的图片(图片木马),利用此漏洞,就可以让服务器像执行脚本一样运行这个图片里的木马。
3.4 修复方案
-
配置层面:将
php.ini中的cgi.fix_pathinfo设置为0。 -
Nginx 层面:在过滤规则中加入判断,如果文件不存在则直接返回 404。