中間件漏洞篇 - 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