檔案上傳漏洞過程
使用者上傳了一個可執行的指令碼檔案,並通過此指令碼檔案獲得了執行伺服器端命令的能力。
一般的情況有:
- 上傳檔案WEB指令碼語言,伺服器的WEB容器解釋並執行了使用者上傳的指令碼,導致程式碼執行;
- 上傳檔案FLASH策略檔案crossdomain.xml,以此來控制Flash在該域下的行為;
- 上傳檔案是病毒、木馬檔案,攻擊者用以誘騙使用者或管理員下載執行;
- 上傳檔案是釣魚圖片或為包含了指令碼的圖片,某些瀏覽器會作為指令碼執行,實施釣魚或欺詐;
上傳漏洞需要具備以下幾個條件:
- 上傳的檔案具備可執行性或能夠影響伺服器行為,所以檔案後所在的目錄必須在WEB容器覆蓋的路徑之內;
- 使用者可以從WEB上訪問這個檔案,從而使得WEB容器解釋執行該檔案;
- 上傳後的檔案必須經過安全檢查,不會被格式化、壓縮等處理改變其內容;
常見,繞過檔案上傳檢查功能
常見的檔案上傳檢查針對檔案型別進行,攻擊者可以使用手動修改POST包然後新增%00位元組用於截斷某些函式對檔名的判斷。如xxx.php[\0].JPG,對於一個只允許上傳JPG格式的伺服器,此檔案可以繞過檔案上傳檢查,但是對於伺服器端解釋來說,函式會被[\0]截斷,導致成為xxx.php程式碼。除了修改檔名來繞過型別檢查外,還可以修改檔案頭來偽造檔案頭,欺騙檔案上傳檢查。
如何安全上傳檔案
針對檔案上傳漏洞的特點和必須具備的三個條件,我們阻斷任何一個條件就可以達到組織檔案上傳攻擊的目的:
- 最有效的,將檔案上傳目錄直接設定為不可執行,對於Linux而言,撤銷其目錄的'x'許可權;實際中很多大型網站的上傳應用都會放置在獨立的儲存上作為靜態檔案處理,一是方便使用快取加速降低能耗,二是杜絕了指令碼執行的可能性;
- 檔案型別檢查:強烈推薦白名單方式,結合MIME Type、字尾檢查等方式;此外對於圖片的處理可以使用壓縮函式或resize函式,處理圖片的同時破壞其包含的HTML程式碼;
- 使用隨機數改寫檔名和檔案路徑,使得使用者不能輕易訪問自己上傳的檔案;
- 單獨設定檔案伺服器的域名;
各種形式的檔案上傳漏洞總結
1.在很早以前,很多上傳檔案過濾是用的是javascript,所以改一下javascript或直接nc發包就行了。有的是判斷字尾,有的只是判斷id,比如:
“uploadfile” style=”file” size=”uploadfile” runat= “lbtnUpload” runat= “JavaScript”>
只是簡單的對ID進行驗證,只要構造javascript:lbtnUpload.click();滿足條件達到上傳木馬的效果。成功以後檢視原始碼
a “lbtnUpload” “javascript:__doPostBack(‘lbtnUpload’,”)”script ‘javascript’
2.IIS6的目錄解析問題如/a.aspx/a.jpg,在某些特殊情況下會應用到,在很早的時候由我同事1982發現的。
3.某些上傳檔案的被動過濾有缺陷,有的只過濾asp,卻忘了.asa、.cdx、cer等等,php的話就嘗試php2、.php3、.php4 等等,相關例項有動力文章(Powereasy),具體參考http://www.sebug.net/vulndb/4326/
4.結束符%00截斷最後的字尾,最早是老外發現,當時非常流行,主流bbs程式都有此漏洞,比如dvbbs就存在此漏洞,非常經典!
5.iis的檔名解析漏洞,比如a.asp;.gif,分號本身以及後面的都會被系統忽略,國人kevin1986發現的,非常經典!
6.apache檔名解析漏洞,比如a.php.gif或a.php.aaa,最早看到國內的superhei先提出的。不過在新版 apache/php給補了。
7.二次上傳漏洞,最新的上傳漏洞方法,主要是利用邏輯漏洞,比如無懼無元件上傳程式碼:
view sourceprint?1 fileExt=lcase(Mid(ofile.filename,InStrRev(ofile.filename,".")+1)) arrUpFileType=split(UpFileType,"|")'獲得允許上傳的所有副檔名 for i=0 to ubound(arrUpFileType)'判斷上傳的副檔名是否在允許的範圍內 if fileEXT=trim(arrUpFileType(i)) then EnableUpload=true exit for end if
這裡的EnableUpload只驗證了一次就變為了true,第一次上傳合法檔案使其變為true,第二次再上傳webshell,利用這個漏洞需要上傳元件支援一次多檔案上傳。
有此類邏輯漏洞的不在少數,比如fckeditor最新版中,由於Fckeditor對第一次上傳123.asp;123.jpg 這樣的格式做了過濾。也就是IIS6解析漏洞。
上傳第一次,被過濾為 123_asp;123.jpg 從而無法執行。但是第2次上傳同名檔案123.asp;123.jpg後。由 於”123_asp;123.jpg”已經存在。
檔名被命名為123.asp;123(1).jpg 123.asp;123(2).jpg這樣的編號方式。其他的還有fckeditor 2.4 提交1.php再提交1.php+空格,詳見http://superhei.blogbus.com/logs/4603932.html 《又見fckeditor》superhei一文。
8.關鍵字一次性替換,比如有的後臺增加.asa上傳型別asa被過濾替換為空字元,但用.asasaa被過濾其中的asa剩下.asa就繞過了, 比如還有科訊Kesion CMS,漏洞在http://localhost/User/UpFileSave.asp?user_upfile.asp,檔名最後保證 是.asachr0.jpg或者.cerchr0.jpg就行了。
9.上傳程式存在sql注入。比如fckeditor 2.1.6就可以通過sql注入增加一個.asp上傳型別。還有PunBB pun_attachment上傳附件擴充套件sql注射漏洞,詳見http://sebug.net/vulndb/12538/。
10.小數點或空格被忽視,這個也是利用了win系統特性了,比如a.asp.和a.asp空格、a.php.
11.超長檔名截斷檔案字尾,各系統版本的超長檔名長度可能各不相同,最常見的是應用在本地包含漏洞方面,由於php新版過濾了%00,所以用 a.php?files=../../../../../../../../../etc/passwd…………………………………(N個 點).html,推薦用.和/或空格來試。在win下:
echo aaaa>a.asp若干個空格.gif dir a.asp 2010-03-15 17:41 2,852 a.asp
12.只校驗了檔案頭和檔案完整性
有的上傳程式校驗檔案頭,並只允許上傳圖片檔案型別且驗證圖片檔案完整性(僅偽造檔案頭還是不行),但沒有驗證檔案字尾,也沒有強制更改上傳檔案的 字尾。我們可以新建一個幾kb大小以內的jpg圖片檔案(顏色填充),然後用ue以十六進位制開啟檔案,在檔案內容末尾加些空格後再加上一句話木馬< ?fputs(fopen("c.php","w"),"“)?>存為 aaa.php上傳。如果有驗證檔案字尾,也可以結合以上方法繞過檔案的字尾驗證。