中间件解析漏洞及Apache解析漏洞原理和复现

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版本。

相关推荐
千年死缓15 小时前
gin中间件
中间件·gin
FserSuN1 天前
Apache Calcite - 查询优化之自定义优化规则
apache·calcite
黑风风2 天前
Ubuntu 22 安装 Apache Doris 3.0.3 笔记
笔记·ubuntu·apache
General_G2 天前
FastDDS服务发现之PDP和EDP的收发
数据库·中间件·服务发现·fast dds·rtps
网络安全指导员2 天前
常见网络安全设备默认口令
服务器·网络·安全·web安全·php·apache
Mr_Xuhhh3 天前
Linux第一个小程序-进度条
linux·运维·visualstudio·小程序·编辑器·apache
萤火夜3 天前
Linux之信号量
中间件
风口上的吱吱鼠4 天前
20241031 Apache2修改日志里面的时间格式
服务器·apache
小刘同学++4 天前
在 Ubuntu 22.04 上部署Apache 服务, 访问一张照片
linux·ubuntu·apache