中間件漏洞篇 - Apache 篇
Apache 是世界使用排名第一的 Web 服務器軟件。它可以運行在幾乎所有廣泛使用的計算機平台上,由於其跨平台和安全性被廣泛使用,是最流行的 Web 服務器端軟件之一。
apache目錄結構
bin:存放常用命令工具,如httpd
cgi-bin:存放linux下常用命令,如xxx.sh
error:錯誤記錄
htdocs:網站源碼
icons:網站圖標
manual:手冊
modules:擴展模塊
未知擴展名解析漏洞(CVE-2017-15715)
漏洞原理:
Apache默認一個文件可以有多個以點分割的后綴,當最右邊的后綴無法識別,則繼續向左識別,直到識別到合法后綴才進行解析。
- 使用module模式與php結合的所有版本apache存在未知擴展名解析漏洞。
- 使用fastcgi模式與php結合的所有版本apache不存在此漏洞。
- 利用此漏洞時必須保證擴展名中至少帶有一個.php,不然將默認作為txt/html文檔處理。
復現:
上傳了一個名字叫lcx.php.qqq 的文件,當此特性存在的時候,一看.qqq不認識,
繼續解析,.php我認識,解析成php文件了。訪問也是同理,比如訪問phpinfo.php.qqq可成功顯示phpinfo
那么哪些后綴Apache不認識?
不在mime.types當中的都不認識 (Multipurpose Internet Mail Extensions)
Kali虛擬機中包含有Apache。
systemctl restart apache2
systemctl status apache2
在 /var/www/html下創建index.php文件
利用條件:
1.使用module模式,且正則符合條件
2.文件擴展名中至少帶有一個.php
切換到 /etc/apache2/mods-enabled目錄下找到apache-php模塊的配置:
正則表達式中,$用來匹配字符串結尾位置。如果設置了RegExp對象的Multiline屬性的條件下,還會匹配到字符串結尾的換行符"\n"或"\r"。
試着把"$"換成"\."
然后重啟apache
service apache2 restart
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
**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>
防御
在httpd.conf文件中找到Options + Indexes + FollowSymLinks + ExecCGI並修改成Options -Indexes +
FollowSymLinks + ExecCGI並保存(吧+修改為-)
+ Indexes 允許目錄瀏覽 — Indexes 禁止目錄瀏覽
即可
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,然后發包,成功上傳
瀏覽器訪問 /x.php%0A,正常解析
后台是通過黑名單方式過濾了php后綴的文件,根據最開始的知識,什么樣的文件算是php文件呢?在
有定義,這句話的意思是以php結尾的文件都算php文件,在正則中表示匹配輸入字符串的結尾位置。
如果設置了 RegExp對象的 Multiline屬性,則也匹配 \n 或 \r
恰好,我們在文件末尾加了0x0a(
n),所以被匹配成功了。
0x0a和0x0d
1.0x0d \r CR這三者代表是回車,是同一個東西,回車的作用只是移動光標至該行的起始位置
2.0x0a \n CL這三者代表換行,是同一個東西,換行至下一行行首起始位置;
4.****修復建議
1.升級到最新版本
2.或將上傳的文件重命名為為時間戳+隨機數+.jpg的格式並禁用上傳文件目錄執行