中间件漏洞

施工中

施工中

Apache

2.0-2.2版本存在个漏洞 CE-2012-0053:

攻击者可通过向网站植人超大的Cookie,令其HTTP头超过Apache的LititRequestFieldSize (最大请求长度,4192字节),使得Apache返回400错误,状态页中包含了HttpOnly 保护的Cookie。

core - Apache HTTP Server 版本 2.4

Apache解析配置漏洞\多后缀名解析配置漏洞

解析配置漏洞简介

此漏洞实际为人为的错误配置导致的漏洞,与Apache本身无关。

Apache对于多后缀文件的处理规则是Files with Multiple Extensions-mod_mime

对应的翻译

元数据指扩展名映射到关于语言、内容类型、字符集或编码的信息 原文: metadata (language, content type, character set or encoding)

文件可以有多个扩展名;扩展名的顺序通常是无关紧要的。例如,如果文件 welcome.html.fr 映射到内容类型 text/html 和法语,则文件 welcome.fr.html 会映射到完全相同的信息。如果给出了多个映射到相同类型元数据的扩展名,则右边的扩展名将被使用,语言和内容编码除外。例如,如果 .gif 映射到媒体类型 image/gif,而 .html 映射到媒体类型 text/html,则文件 welcome.gif.html 将与媒体类型 text/html 关联。

语言和内容编码被视为累积的,因为可以为特定资源分配不止一种语言或编码。例如,文件 welcome.html.en.de 将以 Content-Language: en, de 和 Content-Type: text/html 交付。

当一个具有多个扩展名的文件同时与媒体类型和处理程序关联时,应该小心处理。这通常会导致请求由与处理程序关联的模块处理。例如,如果 .imap 扩展名映射到处理程序 imap-file(来自 mod_imagemap),而 .html 扩展名映射到媒体类型 text/html,则文件 world.imap.html 将同时与 imap-file 处理程序和 text/html 媒体类型关联。处理时,将使用 imap-file 处理程序,因此它将被视为一个 mod_imagemap 图像映射文件。

如果你希望只有文件名中最后一个点分隔的部分映射到特定的元数据,那么不要使用 Add* 指令。例如,如果你希望文件 foo.html.cgi 被处理为 CGI 脚本,但不希望文件 bar.cgi.html 如此处理,那么不要使用 AddHandler cgi-script .cgi,而是使用

仅基于最终扩展名SetHandler配置处理程序

1
2
3
<FilesMatch "[^.]+\.cgi$">
SetHandler cgi-script
</FilesMatch>

Apache对多后缀文件的识别概括来说为:

  1. Apache允许文件有多个扩展名,并且会将所有后缀名进行识别,识别的顺序为:从右到左
    • 如: .html.fr 映射到 Content-Type: text/htmlContent-Language: de
  2. Apache允许扩展名映射到元数据(包括:语言、内容类型、字符集或编码)、处理程序。
    • .html 映射到 Content-Type: text/html
  3. 对于相同类型元数据,以从右到左第一个出现的为准,但对于语言和内容编码可累积的元数据,将会叠加
    • 如:.gif.html根据此规则映射到 Content-Type: text/html
    • .html.en.de根据此规则映射到Content-Language: en, deContent-Type: text/html
  4. 由于映射到处理程序和映射媒体类型,最后的返回结果不一致(一个为经过程序处理,一个为返回媒体文件)。当出现不同扩展名映射到处理程序和媒体类型时,映射到处理程序的优先等级高于映射到媒体类型
    • 如:.imap.html扩展名.imap 映射到处理程序 imap-file.html 映射到Content-Type: text/html ,根据上述原则,.imap.html文件会被imap-file程序处理
一点我的理解

按我的理解:元数据(metadata)是用于指示文件的类型或处理方式

这里我把元数据(metadata)的定义包括了处理方式,根据一下段落合理的进行拓展定义

If you would prefer only the last dot-separated part of the filename to be mapped to a particular piece of meta-data, then do not use the Add* directives. For example, if you wish to have the file foo.html.cgi processed as a CGI script, but not the file bar.cgi.html, then instead of using AddHandler cgi-script .cgi

如果你希望只有文件名中最后一个点分隔的部分映射到特定的元数据,那么不要使用 Add* 指令。例如,如果你希望文件 foo.html.cgi 被处理为 CGI 脚本,但不希望文件 bar.cgi.html 如此处理,那么不要使用 AddHandler cgi-script .cgi

因此当出现多个映射到处理程序,会按照从右到左第一个出现的为准,进行处理程序

使用 Add* 指令,Apache处理一个文件时会应用上述规则

Add* 指令指的是如:AddTypeAddDefaultCharsetAddEncodingAddHandlerAddOutputFilterAddLanguageAddCharset等指令,其中AddHandler设置对应后缀名映射到处理程序,如:

1
AddHandler application/x-httpd-php .php

由此,当用户上传一个a.php.jpg文件时,Apace的配置文件中包含AddHandler处理PHP文件,且未对上传后的文件进行重命名,此时a.php.jpg被解析为一个PHP脚本,解析漏洞由此而来

解析配置漏洞条件

  • 文件没有被重命名
  • Apache中配置中含有AddHandler的设置

解析配置漏洞解决办法

  • 将上传的文件进行重命名
  • 根据官方文档的说明,可以使用SetHandler指令来代替AddHandler,因为SetHandler仅根据最右端的后缀名来判断映射的处理程序