24、文件上传漏洞——Apache文件解析漏洞

一、环境简介

  Apache文件解析漏洞与用户配置有密切关系。严格来说,属于用户配置问题,这里使用ubantu的docker来复现漏洞:

apt-get install apache2
apt-get install php7.0
apt-get install libapache2-mod-php7.0

一、Apache与php三种结合方法

  • CGI:共同网关接口,是HTTP服务器与机器上其他程序进行通信的一个接口,让web服务器必要时启动额外的程序处理动态内容。
  • FastCGI:CGI解释器的更快实现,可以提供良好的性能、伸缩性等。
  • Module:php作为apache的模块,也是用的最多的一种方法。

Apache文件解析漏洞就发生在Module结合方法上。

查看apache和php的结合方法:
在这里插入图片描述

二、Apache解析文件的方法

一个重要文件/etc/mime.types
在这里插入图片描述
  这里记录了大量的文件后缀和mime类型,当客户端请求一个文件时,如果后缀在这个列表里,那么apache一方面返回对应的content-type给浏览器,一方面根据文件的MIME类型进行下一步处理。如果不在列表,apache不会返回content-type给浏览器,而是直接返回文件内容,由浏览器自动处理。

cat /etc/mime.types | grep php
在这里插入图片描述

这里注释掉关于php的全部项。例如对于第一项后缀名为php/pht/phtml的文件,apache将会将其给php处理器进行解析。

三、Apache解析php的方法

/etc/apache2/mods-enabled/php7.2.conf
在这里插入图片描述

  • apache通过/etc/mime.types识别文件所属mime类型,然后根据MIME类型,apache将文件交给对应的程序进行处理。
  • apache或者通过/etc/apache2/mods-enabled/php7.2.conf进行文件匹配,用SetHandler设置请求处理程序。
    如上图,如果(php|php3|php5|php7|pht|phtml)是请求文件的最后一个后缀,则把文件交给php处理器(php_module)来处理,处理完之后把结果返回给apache,再由apache发送给浏览器。

四、漏洞原理

  Apache文件解析漏洞设计到一个解析文件的特性:Apache默认一个文件可以有多个以点分割的后缀,当右边的后缀无法识别(不在mime.types内),则继续向左识别。例如,当我们请求这样一个文件:shell.php.xxx.yyy

  • yyy无法被识别,向左;
  • xxx无法被识别,向左;
  • php发现后缀是php,交给php处理这个文件。

如果,apache都不认识,将把文件直接返回给客户端,也就是爆源码。

在web目录下创建一个1.php.aaa的文件,并访问:
在这里插入图片描述

可以看到并没有被解析成php,为什么?
因为apache本身并不存在所谓的解析漏洞。让我们回顾解析过程:

  • yyy无法被识别,向左;
  • xxx无法被识别,向左;
  • php发现后缀是php,交给php解释器处理这个文件。

最后这一步虽然交给php解释器来处理这个文件,但是php解释器也不认识.aaa的后缀,所以就直接输出了。

  其实,解析漏洞的产生,是由于运维人员在配置服务器时,为了使apapche服务器能解析php,而自己添加了一个handler,例如:AddHandler application/x-httpd-php .php。它的作用是为了让apache把文件交给php_module解析,就是说在文件名的任何位置匹配到php后缀,apache都会让pap_module去解析。

添加一个handler之后,访问1.php.xxx.yyy的解析流程是这样:

  • yyy无法被识别,向左;
  • xxx无法被识别,向左;
  • php激活php处理器,执行php代码。

解析漏洞就产生了。
在这里插入图片描述

五、修复方法

  1. 不要使用AddHandle,改成SetHandler,写好正则,就不会有解析问题。
    在这里插入图片描述
  2. 禁止.php.这样的文件执行
    在这里插入图片描述
<think>好的,我现在需要处理用户关于Apache文件解析漏洞CVE-2017-15715的修复方案的询问。首先,我需要回顾用户提供的引用内容,确保准确理解漏洞的成因和现有信息。 根据引用[1]和[2],这个漏洞主要涉及Apache HTTPD 2.4.0到2.4.29版本中,由于使用正则表达式匹配.php文件时,$符号错误地匹配了换行符(\x0a)。攻击者上传带有换行符的文件名(例如“test.php\x0a”)时,会绕过安全配置,导致文件被当作PHP执行。因此,修复的关键在于修正正则表达式,避免匹配换行符。 接下来,用户需要具体的修复方案和CVE编号。CVE编号已经明确是CVE-2017-15715,这点需要确认引用中的内容是否一致。引用[1]、[2]、[3]、[4]都提到了这个CVE编号,所以正确无误。 修复方案方面,引用[2]指出问题出在FilesMatch的正则表达式使用了\.php$,而$在正则表达式中默认不匹配换行符,但Apache的配置中可能启用了Multiline属性,导致$可以匹配换行符。正确的做法是修改正则表达式,严格匹配文件名结尾,不使用多行模式。例如,将正则表达式改为\.php$,并确保没有启用Multiline标志。或者更严格地使用\\.php$(转义点)并在末尾使用\z来明确匹配字符串结束,避免换行符的影响。 此外,升级到Apache HTTPD 2.4.30及以上版本是官方解决方案,因为该版本已修复此问题。用户若无法立即升级,可以手动修改配置文件,调整FilesMatch的正则表达式。 还需要考虑其他防御措施,比如文件上传时对文件名进行严格过滤,禁止换行符等特殊字符,以及限制上传文件的执行权限。这些补充措施能增强整体安全性,防止类似漏洞被利用。 最后,生成相关问题时要围绕漏洞原因、修复方法、升级影响、检测方法和相关漏洞展开,确保问题覆盖用户可能关心的其他方面。</think>### Apache 文件解析漏洞(CVE-2017-15715)修复方案 #### 漏洞概述 Apache HTTPD 换行解析漏洞(CVE-2017-15715)影响 2.4.0 至 2.4.29 版本。攻击者可通过在文件名末尾添加换行符(如 `test.php\x0a`),绕过服务器对 PHP 文件解析规则,导致非预期文件(如图片)被解析为 PHP 脚本执行[^1][^2]。 #### 漏洞成因 配置文件 `docker-php.conf` 中的正则表达式 `\.php$` 错误匹配了换行符 `\n`(十六进制 `0x0a`),导致包含换行符的文件名(如 `test.php\n`)被识别为 PHP 文件[^2]。 #### 修复方案 1. **升级 Apache HTTPD 版本** 官方修复版本为 **Apache HTTPD 2.4.30 及以上**,升级后正则表达式匹配逻辑已修正[^3]。 2. **手动修改配置文件** 若无法立即升级,可调整正则表达式,禁止匹配换行符: ```apache <FilesMatch \.php$> → <FilesMatch \.php\z> ``` 使用 `\z` 替代 `$` 严格匹配字符串末尾,避免匹配换行符[^2]。 3. **文件上传验证** 在服务器端对上传文件名进行过滤,禁止包含换行符(`\x0a`)或其他特殊字符。 4. **限制文件执行权限** 配置上传目录禁止执行 PHP 脚本,例如通过 `.htaccess` 添加: ```apache php_flag engine off ``` #### 漏洞复现与验证 可通过 Vulhub 靶场(`httpd/CVE-2017-15715`)快速搭建测试环境,验证修复效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值