中间件漏洞篇 - Apache 篇


中间件漏洞篇 - Apache 篇

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

apache目录结构

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

未知扩展名解析漏洞(CVE-2017-15715)

漏洞原理:

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

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

复现:

上传了一个名字叫lcx.php.qqq 的文件,当此特性存在的时候,一看.qqq不认识,
继续解析,.php我认识,解析成php文件了。访问也是同理,比如访问phpinfo.php.qqq可成功显示phpinfo

那么哪些后缀Apache不认识?
不在mime.types当中的都不认识 (Multipurpose Internet Mail Extensions)

image-20211026150522098

image-20211026150602575

Kali虚拟机中包含有Apache。

systemctl restart apache2 

systemctl status apache2

image-20211026150702671

在 /var/www/html下创建index.php文件

image-20211026150722893

利用条件:
1.使用module模式,且正则符合条件
2.文件扩展名中至少带有一个.php

切换到 /etc/apache2/mods-enabled目录下找到apache-php模块的配置:

image-20211026150751193

image-20211026150758838

正则表达式中,$用来匹配字符串结尾位置。如果设置了RegExp对象的Multiline属性的条件下,还会匹配到字符串结尾的换行符"\n"或"\r"。

试着把"$"换成"\."
然后重启apache
service apache2 restart

image-20211026150823034

4.修复建议

解决方案一

在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:

<FilesMatch ".(php.|php3.|php4.|php5.)"> 
Order Deny,Allow 
Deny from all 
</FilesMatch>

解决方案二

如果需要保留文件名,可以修改程序源代码,替换上传文件名中的"."为"_":

$filename = str_replace('.', '_', $filename);

AddHandler导致的解析漏洞

漏洞:
1.apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后往前解析,直到遇到认识的扩
展名为止
2.如果都不认识将会暴露源码。
在apache配置不当的时候就会造成apache解析漏洞。

复现

1、在httpd.conf 把注释去掉,后缀是存在.php .phtml都会解析成php文件

AddType application/x-httpd-php .php .phtml

image-20211026151430903

image-20211026152025309

**4.*修复建议

1.在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:

<FilesMatch ".(php.|php3.|php4.|php5.)"> 
Order Deny,Allow 
Deny from all 
</FilesMatch>

2.把配置不当的文件进行修改

目录遍历漏洞

1.****原理

原理:当客户端访问到一个目录时,Apache服务器将会默认寻找一个index list中的文件,若文 件不存

在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为称为目录遍历。

2.****复现

httpd.conf

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

image-20211026152552727

防御

在httpd.conf文件中找到Options + Indexes + FollowSymLinks + ExecCGI并修改成Options -Indexes +

FollowSymLinks + ExecCGI并保存(吧+修改为-)

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

image-20211026152945766

即可

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自动去除,所以 $_FILES['file']['name'] 这种方式获取文件名就不会造成
这个漏洞
影响范围
apache :2.4.0~2.4.29版本
漏洞复现

复现环境:

vulhub

打开漏洞页面,发现一片空白,到docker里查看了一下,发现此页面并未写前端,所以就自己写html表单上传文件

<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'])){ #1.php php $name =basename($_POST['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);}?>

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

burp抓包,在Hex选项卡.php后面0d的位置右键-Insert byte,添加一个0a,然后发包,成功上传

img

浏览器访问 /x.php%0A,正常解析

image-20211026160712694

后台是通过黑名单方式过滤了php后缀的文件,根据最开始的知识,什么样的文件算是php文件呢?在

有定义,这句话的意思是以php结尾的文件都算php文件,在正则中表示匹配输入字符串的结尾位置。

如果设置了 RegExp对象的 Multiline属性,则也匹配 \n 或 \r

恰好,我们在文件末尾加了0x0a(

n),所以被匹配成功了。

0x0a和0x0d

1.0x0d \r CR这三者代表是回车,是同一个东西,回车的作用只是移动光标至该行的起始位置 
2.0x0a \n CL这三者代表换行,是同一个东西,换行至下一行行首起始位置;

4.****修复建议

1.升级到最新版本

2.或将上传的文件重命名为为时间戳+随机数+.jpg的格式并禁用上传文件目录执行


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM