Skip to content

只要 Web 应用程序允许上传文件,就有可能存在文件上传漏洞。

攻击者在利用上传漏洞时,通常与 Web 容器的解析漏洞配合。常见的 Web 容器有 IIS、Nginx、Apache、Tomcat 等,以 IIS、Apache 容器为例。

  • Web 容器是运行在服务器上的软件,负责监听网络端口并接收用户的 HTTP 请求。

  • 它根据文件后缀名决定处理方式:直接返回静态资源(如图片),或调用解释器执行动态脚本(如 PHP)。

  • 它是连接底层操作系统与上层 Web 应用程序的中间层,为代码运行提供必要的环境支持。

1. IIS 解析漏洞

IIS 6.0 在解析文件时存在两个解析漏洞:

  1. 建立 *.asa 、 *.asp 格式的文件夹时,其目录下的任意文件都将被 IIS 当作 asp 文件来解析。

    - 例如建立文件夹 `parsing.asp` ,在 `parsing.asp` 文件夹内新建文本文档 `test.txt` ,内容为 `<%=NOW()%>` ,在浏览器内访问,IIS 会获取当前时间显示,即当作 ASP 脚本来解析。
    
    - **ASP (Active Server Pages)** 是一种由微软开发的**动态网页技术标准**。它是一种包含 HTML 标签、普通文本和脚本代码(通常是 VBScript 或 JScript)的文件,后缀名为  `.asp`。当浏览器请求该文件时,Web 容器(通常是 IIS)会先在服务器端执行其中的脚本,生成标准的 HTML,再发送给浏览器。
    
  2. 当文件为 *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

  1. Nginx:看到后缀是 .php,认为这是一个 PHP 脚本,于是把它转发给后端的 PHP 解释器(PHP-FPM)。

  2. 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。