現在的網站越來越多的采用了PHP作為其主要的腳本來構造網頁,一來因為PHP功能強大且容易使用;再者則為其后台支持用到的是Apache作為服務器,而Apache是免費的,也許正是因為這樣那樣的原因,現在的PHP也越來越流行。另外一個方面是大家普遍認為PHP比起ASP要安全的多,很多人提到IIS就搖頭,甚至有人毫不誇張的說一台沒有人工配置的IIS服務器可以不花10分鍾就能進入,這個方面比起Apache真的要差的多,由於種種原因,知道的。不知道的,反正現在PHP大行其道。
然而PHP真的很安全么,在越來越多人的關注下,其越來越多的不足和弱點都逐漸暴露在我們面前,注射,讀源代碼等等系列漏洞都展現在世人的面前,然而這些明顯的漏洞發現以后,我們又把目光轉向了其后台的支持者Apache,我們今天就來看看這個號稱足夠安全的服務是否真的一切都處理的很好呢?
一、追其根究其底
事情很偶然,只是忽然心血來潮,跑去看Apache手冊,在apache手冊上看到關於后綴的一段描述是這樣的:
extension
In general, this is the part of the filename which follows the last dot. However, Apache recognizes multiple filename extensions, so if a filename contains more than one dot, each dot-separated part of the filename following the first dot is an extension. For example, the filename file.html.en contains two extensions: .html and .en. For Apache directives, you may specify extensions with or without the leading dot. In addition, extensions are not case sensitive.
大概的翻譯過來意思就是:
extension (后綴)
一般是指filename中最后一個"."號后面的部分。 但是,Apache可以辨隙喔鑫募笞海綣鶊ilename含有多個".", 則第一個"."后面由每個"."分隔開的部分都是此文件的后綴。 比如filename為file.html.en一個一個文件,它就有兩個后綴:.html和.en. 在Apache指令中指定extension時,可以有也可以沒有前導的".",而且不區分大小寫。
都明白是什么意思么?我再解釋一下吧,按照上面的翻譯可以這樣來理解:一般來說apache把最后一個“.“后面的作為后綴來解析的,但是注意的是如果這個后綴不是合法的,那就沒辦法解析了, 下面做寫測試看看,寫個畫圖象的文件,名為extension_test.php,
代碼如下: (由於這篇文章不是教你PHP語法的,所以一些PHP的知識我就在代碼注釋了簡單說下,更多資料請參考其他PHP資料)
//注意,在此之前不能向瀏覽器輸出任何信息,要注意是否設置了 auto_prepend_file.
header ("Content-type: image/png"); //創建一個PNG圖象
$im = @imagecreate (200, 50) //畫圖的面板大小,這里是200X50
or die ("無法創建圖像");
$online="NoHack,This is working--"; //上面寫的字
$background_color = imagecolorallocate ($im, 0,0,0); //背景顏色
$text_color = imagecolorallocate ($im, 230, 140, 150); //字體顏色
imagestring ($im, 100, 10, 15, "$online", $text_color); //在畫布上的起始點
imagepng ($im); //按照前面的設置創建這個圖象
?> //文件結束
執行這個文件,就回按照我們前面的設置創建一個圖,如下圖1:
圖1
NO.1>>>
OK,測試開始,先正常運行我們上面的這個文件,在IE的輸入地址,如下顯示一個正常的和我們構想一樣的這個圖:如下圖2:
http://127.0.0.1/test/extension_test.php
圖2
NO.2>>>
修改我們上面的那個文件名為extension_test.php.nohack,再做測試如下: 在IE地址欄輸入http://127.0.0.1/test/extension_test.php.nohack,看到下面顯示,圖3
圖3
解釋下:按照前面我們看到的關於后綴的定義,我們知道這個文件有2個后綴,從后往前分別是.nohack和.php,我們知道Apache從后面的那個后綴開始解析,就是開始解析.nohack,但是問題就在這出現了,Apache 不認識.nohack這個后綴,在Apache里沒有關於怎么來解析.nohack這個后綴的描述,所以開始解析失敗;故它接着往前解析,看到另外一個后綴.php,這個它是認識的,所以按照PHP文件解析,所以顯示正常,如上面的圖3顯示一樣。
http://127.0.0.1/test/extension_test.php.bak
NO.3>>>
再來,修改文件名為extension_test.php.nohack.iceskysl ,大家可以看到有三個后綴,但是最后面兩個都不是合法的,所以按照前面講的思路,它最后還是解吸PHP文件,所以顯示也是正常,為下圖4:
執行:http://127.0.0.1/test/extension_test.php.nohack.iceskysl
圖4
NO.4>>>
好了,我們再來看另外一種可能,修改文件名為extension_test.php.lock.txt,結果會怎么樣呢?大家看到的是.txt、.lock和php三個后綴,從后面解析TXT,是可以解析的,所以它就會按照TXT文件進行解析,如下顯示結果,圖5:
執行:http://127.0.0.1/test/extension_test.php.lock.txt
圖5
結論:
由上面的測試和分析大家不難看出,正如Apach文檔中對后綴的描述:Apache對於多后綴文件,是從文件名后面開始檢查后綴,檢查其合法性,並且按照最后一個合法的后綴去執行文件執行。
二、特性利用分析舉例:
忙了半天看文檔、做測試可不能白忙哈,我們來看看關於這個特性,或者說弱點來說說利用。
(一) 可憐的被動利用:抓住疏忽
不曉得大家還記不記得前段時間藍色魔法(BMForum)的一個漏洞,大家到知道去執行一個install.php.lock的文件來添加網站管理員,但是卻很少有人出來說明白到底是怎么回事:
這個文件是哪里來的;為什么可以執行;為什么能添加管理員等等問題!很多新手朋友也就跟在別人后面在BAIDU上尋找這樣的論壇,然后添加管理員再黑了人家論壇還在上面炫耀一番,說自己是多么多么厲害!呵呵~技術沒有提高,知識也沒長進。
還是靜下心來看看到底是怎么搞的:結合我們今天講的東西看就很簡單了:起因就是由於該論壇在安裝后把引導安裝文件install.php自動改為install.php.lock以避免被別人再次利用,想法是好的,但是做法出現疏忽。他忽略了.lock后綴在Apache中是無法解析的,也正是這里出了問題,按照這個前面我們的分析,我們就可以利用這個install.php.lock來執行install.php文件的功能,而其中就有添加管理員的功能,利用者正是利用這個來直接添加管理員,進而登陸后台寫入WEBSHELL而導致網站被黑(具體利用方法我不再重述,不了解的請參看以前雜志文章)
我們上面說到的是利用別人的疏忽(一是代碼編寫者錯誤的把文件改為install.php.lock;二是代碼使用者沒有注意把這個文件刪除),但是一旦別人注意到這個問題的存在,你就沒有什么利用的余地了。
(二) 可怕的主動利用:上傳突破
上面我們分析了一種利用情況,大家也看到其利用的局限性,主要原因是利用者處於一種被動狀態,那么現在我們再說一種利用者處於主動狀態的情況:
大家都知道,現在最流行的攻擊方法應該算是注入了,對一些本身沒有缺陷的主機,大家最喜歡的進攻方式就是從網站上找漏洞,在直接上傳WEBSHELL失效的今天,很多人便鍾情與SQL注射:找能注射的頁面,用手工或者工具自動猜解后台管理員密碼,找后台登陸頁面登陸,修改上傳文件類型,上傳WEBSHELL,折騰半天還是想辦法傳WEBSHELL上去,進而提權限,放木馬,按后門,這樣的一次入侵才能結束。這其中能不能傳WEBSHELL上去成了最關鍵的一步,傳不上去,一切都是惘然。
如上 所說的方法是個很長的步驟,其中任何一步驟出現的問題突破不了都是白搭,再加上PHP站本身的安全性就比較好,SQL注射也不是都能很順利,怎么辦,我們自然是尋找另外的一個突破口:
讓我們把目光拉回來,利用最直接最如意的方式就是能直接傳一個網頁木馬,但是網站現在都限制了ASP、CER、PHP、JSP等敏感的文件上傳了,於是大家就想辦法去突破后綴,大家還記得動易 的突破就是在ASP 后面加一空格 再用十六制編輯器把這個空格改成00%來截斷來突破后綴限制的。
我們這里拿國外的一個網站的代碼來舉例子,class-1 Forum Software 什一個基於PHP/MySQL 的論壇程序,它的實用也是很廣泛的,安全性也是大家普遍承認的,但是它有個問題就是出在對於后綴的處理上,然而很多的PHP網站的后處理都和這個類似的,我們來看看具體的代碼:
// 取文件后綴
$tokens = explode(".", $upload_filename);
$image = 0;
//[!!!]
$extension = $tokens[count($tokens) - 1];
// 取的文件大小
$filesize = $_FILES['filename']['size'];
// 檢查文件是否已經存在
if (file_exists("$upload_folder/$upload_filename")) {
echo "<tr><td class=\"otherfields\" colspan=\"2\">The attachment already exists in the upload folder.</td></tr>";
$upload_file = 0;
$upload_filename = "";
}
// 檢查文件后綴是否合格
//[!!!!]
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='$extension' AND file_type='Image'", $link);
if (mysql_num_rows($result)) $image = 1;
...
我再大概的解釋下這段代碼的意思和作用:
NO.1>>
$tokens = explode(".", $upload_filename); 把傳上來的文件名按照其中"."來分割,把分割后的幾段放在$tokens這個數組中.
NO.2>>
$extension = $tokens[count($tokens) - 1];注意啦!看它是怎么取的后綴,首先count($tokens) 取數組的中元素的個數,然后取$tokens[count($tokens) - 1];這個,也就是最后一個"."后面的作為后綴.NO.3>>
接下來取的文件大小和檢查文件是否已經存在,這個不是在重點,我們繼續往下看,是檢查后綴是否合格的,我們來看看是怎么些的:
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='$extension' AND file_type='Image'", $link);
這里$extensions_table是已經定義好的一個關於上傳文件后綴的表單,這句的意思就是再$extensions_table表單中查找文件類型是'Image'且后綴是我們上面代碼去的取的的后綴,如果表里存在這樣的對應,就返回真,然后就傳上去了.
好了,大概的流程就是這樣的,比如我上傳一個圖片文件nohack.gif,那么就是先取后綴gif,再檢查大小和是否已存在,最后按照gif Image這樣的關系來判斷!也就是
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='gif' AND file_type='Image'", $link);這樣如果表里有extension='gif' ;file_type='Image'的對應關系存在,拿就可以上傳了.
看上去是不是都很正常啊,沒有什么奇怪的嘛!是把?如果上傳圖片時你上傳的時PHP文件,那么在表$extensions_table里沒有extension='php' ;file_type='Image',那么就上傳不了.很正常嘛!
但是看好了,如果我些一個PHP木馬文件並修改它的文件的名字是shell.phpshell.php.' or 'a' ='a再來上傳它,我們看看會出現什么現象.開始取后綴,按照它3的定義取得的是最后一個"."后面的,也就是 "' or 'a' ='a";接下來判斷文件大小和是否已上傳,最后做后綴檢查,我們把這個后綴放到它的語句里就是:
SELECT * FROM [extensions table name] WHERE extension='' or 'a' ='a' AND file_type='Image'.怎么樣?會不會通過呢?肯定過啦!WHERE語句中extension='' or 'a' ='a' AND file_type='Image' 有個'a' ='a' 是肯定對的,這樣就返回真,最后就通過這個檢測傳了上去了.
傳上去了,我們接着怎么利用呢?還記得我說我是把一個PHP木馬文件的后綴修改成上面的樣子傳上去的么?這樣我的木馬就傳上去了,接着怎么運行呢?相信能耐心看到這里的朋友都明白了,我們上傳上去的文件就是shell.phpshell.php.' or 'a' ='a,這個文件有兩個后綴,從后往前以此是.' or 'a' ='a和.php,我們直接運行這個文件,Apache不曉得最后的那個.' or 'a' ='a后綴怎么解析,就往前解析.php,這樣的話,我們的PHP木馬就順利運行了!
自然這里也有一些理想的情況,其中之一就是它是按照你上傳時的文件名保存文件的,如果它把除掉后綴外的文件名重新按照自己的算法定義,也就消除了我們的通過多個文件后綴來利用的可能,但是直接保存的還時占了很大一部分的,只要大家善於發現,有很多利用的場合!
通過上面的分析,你明白了么?這里我們不是被動的利用別人的疏忽而是主動的去修改后綴,人為的滿足它的條件檢測,最后達到我們上傳的目的.再這里不光PHP文件能上傳,別的也是可以這樣構造傳上去的.是不是很嚇人!
好了,這次就通過一個主動利用,一個被動利用,一個國內論壇的缺點和一個國外論壇的不足分別闡述了關於后綴的利用,版面有限,其他情況就不一一舉例了,大家根據前面的分析能抓住問題的本質,就能舉一反三,多多利用了!