Apache漏洞
Apache HTTPD 多后缀解析漏洞
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立 一个处理请求的子进程或线程的池。
漏洞原理
apache httpd支持一个文件有多个后缀,如:shell.php.doc 。在windows下,会直接根据最后的.来进 行分隔,将其判定为doc文件,但在apache中可不是这样的,apache会从后往前依次进行判别,遇到不 认识的后缀,便会往前读,如果还是不认识再往前,若是到最后一个都不认识,则会将该文件当成默认 类型文件读取。
apache可以识别的后缀在/etc/mime.types中(前提是已经安装了apache):
该解析漏洞产生的原因一部分是基于apache的这种特性
还有一大部分原因都是由于开发人员的配置不当构成的,当运维人员在配置文件给.php添加了处理器 时:
AddHandler application/x-httpd-php .php
这种情况,多后缀的文件名中只要存在.php后缀,则就会将该文件当做php文件解析。
漏洞复现
这里我们就不自己去搭建apache环境了,大家只要知道apache是用来干什么的就行。
这里我们借助vulhub来进行环境搭建。
官网地址:https://vulhub.org/#/index/
提示:
在安装docker-compose的时候我们用:
pip3 install docker-compose
在安装docker-compose的时候可能会报错,先执行:
pip3 install --upgrade pip
再安装。
下载好vulhub之后,我们进入目录: vulhub/httpd/apache_parsing_vulnerability
然后执行如下命令:
docker-compose up -d
注意: 第一次运行的时候会去拉取基础镜像
启动之后查看运行的容器:
docker-compose ps
直接访问:就是一个文件上传
在对应的文件夹中存在一个码:
直接访问查看:
说明存在多后缀解析漏洞。
我们可以查看一下源码:
<?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);
.......
我们发现有白名单校验且没有修改文件名。接下来我们可以构造白名单后缀的文件:shell.php.png进行 上传。
直接上传php文件是不行的。可以考虑直接改后缀或者burp抓包修改。
漏洞防御
该漏洞和apache版本和php版本无关,属于用户配置不当造成的解析漏洞
搞清楚漏洞产生的原因,就知道怎么防御了,这个漏洞产生的前提有几点:
1. apache必须以模块的形式运行,其他形式不行
2. 在配置文件中存在:AddHandler application/x-httpd-php .php
3. 没有修改文件名
这3点必须满足,所以防御反着来即可。
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
漏洞原理
在2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,shell.php\x0A将被按照PHP后缀进行解析, 导致绕过一些服务器的安全策略。
漏洞复现
进入vulhub/httpd/CVE-2017-15715
然后执行如下命令:
docker-compose build
docker-compose up -d
这个地方需要注意,直接启动会报错:
原因是docker-compose版本太高,我们需要降版本。
安装低版本:
pip3 install docker-compose==1.26.2
这样就不会报错了。
直接访问浏览器:
看一下源码:
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
} else {
?>
发现只有黑名单。
可以尝试多后缀解析:
貌似上传上去了:
解析来尝试换行解析:
也上传上去了。
直接访问:/shell.php%0a
漏洞防御
我觉得最好的方式换apache版本。