檔案上傳漏洞總結(全)

清茶先生發表於2021-11-14

檔案上傳漏洞

凡是存在上傳檔案的地方,都有可能存在檔案上傳漏洞,並不是說有檔案上傳就一定有檔案上傳漏洞。

原理

這主要看一些檔案上傳的程式碼有沒有 嚴格限制使用者上傳的檔案型別,比如,只可以上傳.jpg|.png|.gif檔案,但是由於程式碼不嚴謹,或者只在前端驗證這個檔案的格式等等,造成了攻擊者可以上傳任意PHP檔案,自定義檔案。

危害

可以通過這個漏洞上傳後門檔案,webshell,可以直接獲取網站許可權,然後獲取伺服器的提權,獲取內網許可權,或去使用者資訊等等。屬於高危漏洞。

查詢:

黑盒:對方的網站情況,原始碼我們是不知道的。通過目錄掃描獲取到檔案上傳地址,功能查詢,看網站有沒有檔案上傳功能,比如會員中心上傳頭像等等。
白盒:有了原始碼,通過程式碼分析,本地測試。

利用思路:

常規類:掃描獲取上傳、會員中心上傳、後臺系統上傳、各種途徑上傳。CMS類:已知CMS原始碼。編譯器類:ckeditor、fckeditor、kindeditor、xxxxeditor。其他類/CVE:程式碼審計、平臺/第三方應用。

檔案上傳常見驗證

檔案頭的驗證(檔案內容的驗證):屬於間接驗證,內容頭資訊,不嚴謹可通過抓包修改進行欺騙。

檔案型別的驗證:屬於間接驗證:MIME資訊 也就是資料包中的content-Type型別。可以修改進行一個欺騙。不嚴謹。

字尾名的驗證:屬於直接驗證,黑名單驗證和白名單驗證。黑名單就是明確不允許上傳......檔案型別,如:.asp、.php、.jsp、.aspx、.cgi、war檔案。當然也得看情況是否支援。白名單就是明確只允許上傳......檔案,如:.jpg、.png、.gif、zip、rar檔案,相對黑名單較安全。

思路

一.黑名單的繞過

1.有些黑名單定義的不可上傳檔案的字尾名不完整,可以用.php5、.phtml、.phps、.pht檔案進行上傳,從而實現繞過。

2.上傳配置檔案.htaccess,在這個檔案寫上程式碼
<FilesMatch "x.png">
SetHandler application/x-httpd-php
如果有一個檔案的名字是x.png,那麼這個png檔案就會被當作php檔案進行解析,這樣也可以實現繞過

3.大小寫繞過將.phP檔名字尾大寫

4.收尾去空繞過,在字尾名加空格(需要在抓到的資料包中加空格,直接在檔案字尾名加空格會命名不成功,它會自動刪除空格)

5.不刪除末尾的點,在字尾名加點(需要在抓到的資料包中加點,直接在檔案字尾名加點會命名不成功,它會自動刪除點)

6.沒有去除字串::$DATA。如果檔名+"::$DATA"會把::$DATA之後的資料當成檔案流處理,不會檢測字尾名。例如:x.php::$DATA,Windows會自動去掉末尾的::$DATA變成x.php,但是這剛好就可以繞過黑名單了。

7.有時沒有迴圈驗證,只驗證一次,可以使用x.php. .類似的方法進行繞過。(方法不止一種,視情況而定)

二.白名單的繞過

1.可以使用%00進行截斷。%00只能用於php版本低於5.3的

2.圖片馬進行繞過

3.條件競爭進行繞過。
白名單要配合其他漏洞進行利用。

三.中介軟體之伺服器

如果我們嘗試上述的方法進行測試,發現網站確實沒有漏洞,這時我們就可以對他的中介軟體進行測試。

1.IIS6.0版本

(1) 當建立.asa、.asp格式的資料夾時,其目錄下的任意檔案都將被IIS當作為asp檔案解析。
(2) 當上傳檔案.asp;*.jpg IIS6.0會將檔案當做asp檔案解析。

2.apache低版本(2.x)

如果對方中介軟體是apache屬於低版本,我們可以利用檔案上傳,上傳一個不識別的檔案字尾,利用解析漏洞規則成功解析檔案,其中的後門程式碼被執行。例如:x.php.aaa.bbb.ccc.ddd,可以被當作php檔案進行解析,從最後一個.ddd開始,apache不認識,就往前走,一直到.php,這樣即繞過了驗證,有可以進行解析。

3.apache換行解析漏洞(2.4.0--2.4.29)

在解析PHP時,1.php\x0A將被按照PHP字尾進行解析,導致繞過一些伺服器的安全策略。

4.Nginx低版本、II7

上傳可以上傳的檔案,在檔案地址後加上/x.php,可以讓檔案以php程式碼去執行。

5.Nginx檔名邏輯(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7)

我們只需要上傳一個空格結尾的檔案,即可使PHP解析

四.中介軟體之編譯器

可以參考:https://navisec.it/編輯器漏洞手冊/

五.WAF繞過

如果對方有安全狗一些防護軟體,我們應該如何進行繞過
1.要明確上傳引數名哪些東西可以更改,哪些不可以
Content-Disposition:一般不可以更改
name:表單引數值,不能更改
filename:檔名,可以更改
Content-Type:檔案mime,視情況更改

2.繞過方法
資料溢位,防匹配,比如:filename=“x.php”可以在名字上寫入大量的立即資料,讓安全狗匹配不到,filename=“aaaaaaaaaasssssssssssfggghgjghtuyrfuy6tfgufujfffx.php”,大量寫入,我這裡這個量是不夠的,自行測試。
符號變異,防匹配,filename=“x.jpg;.php”
資料截斷防匹配,(%00;換行)
重複資料防匹配(引數多次寫入)

安全修復

1.後端驗證:採用服務端驗證模式
2.字尾驗證:基於白名單,黑名單過濾
3.MIME驗證:基於上傳自帶型別艱檢測
4.內容檢測:檔案頭,完整性檢測
5.自帶函式過濾
6.WAF防護軟體:寶塔、雲盾等

相關文章