中间件解析漏洞及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版本。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 13:20:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 13:20:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 13:20:08       82 阅读
  4. Python语言-面向对象

    2024-06-07 13:20:08       91 阅读

热门阅读

  1. 安全通信网络

    2024-06-07 13:20:08       28 阅读
  2. 眼在手上的手眼标定(matlab+python)实测精度±1mm

    2024-06-07 13:20:08       18 阅读
  3. spring boot 白盒测试实战

    2024-06-07 13:20:08       26 阅读
  4. FPGA verilog入门案例笔记一

    2024-06-07 13:20:08       34 阅读
  5. Flask、uWSGI和Nginx在Web服务器架构中的职责

    2024-06-07 13:20:08       29 阅读
  6. 多云世界中的 API 治理

    2024-06-07 13:20:08       50 阅读
  7. Github 2024-06-04 Python开源项目日报 Top10

    2024-06-07 13:20:08       30 阅读
  8. 【路径规划】二维Dijkstra启发式改进算法

    2024-06-07 13:20:08       31 阅读
  9. LeetCode|938. Range Sum of BST

    2024-06-07 13:20:08       29 阅读
  10. 什么情况下需要进行网络安全等级保护?

    2024-06-07 13:20:08       31 阅读