摘要:代碼審計一文件上傳概述在網站的運營過程中,不可避免地要對網站的某些頁面或內容進行更新,這時便需要使用到網站上的文件上傳功能。
PHP 代碼審計:(一)文件上傳 0x00 概述
在網站的運營過程中,不可避免地要對網站的某些頁面或內容進行更新,這時便需要使用到網站上的文件上傳功能。如果不對被上傳文件進行限制,或限制被繞過,該功能便有可能會被利用于上傳可執行文件、腳本到服務器上,今兒進一步導致服務器淪陷。
由此可見,了解上傳漏洞的前提是了解文件上傳這個功能,以及其中的原理。如果只知道有文件上傳這個東西,以及可能會出現漏洞,那么跟不知道一個樣。
具體來說,一些用戶上傳的文件還是PHP腳本,這些PHP腳本上傳到服務器上能夠被用戶通過服務器直接訪問,其中包含的一些命令就會被執行。文件上傳的功能就是如此強大,如果你的網站在文件上傳方面控制得不夠好,就會淪陷。
導致文件上傳漏洞的原因較多,主要包含:
服務器配置不當
開源編輯器上傳漏洞
本地文件上傳限制被繞過
過濾不嚴或被繞過
文件解析漏洞導致文件執行
文件路徑截斷
...
其中,開源編輯器漏洞和文件上傳漏洞原理一樣,只不過多了一個編輯器。上傳的時候還是會把我們的腳本上傳上去。
過濾不嚴這個非常常見,后面的例子中我們會看到。比如大小寫問題,網站只驗證是否是小寫,我們就可以把后綴名改成大寫。
然后是文件解析漏洞。比如 Windows 系統會涉及到這種情況:文件名為1.php;.jpg,IIS 6.0 可能會認為它是jpg文件,但是執行的時候會以php文件來執行。我們就可以利用這個解析漏洞來上傳。再比如 Linux 中有一些未知的后綴,比如a.php.xxx。由于 Linux 不認識這個后綴名,它就可能放行了,攻擊者再執行這個文件,網站就有可能被控制。
最后是路徑截斷,就是在上傳的文件中使用一些特殊的符號,使文件在上傳時被截斷。比如a.php%00.jpg,這樣在網站中驗證的時候,會認為后綴是jpg,但是保存到硬盤的時候會被截斷為a.php,這樣就是直接的php文件了。
常用來截斷路徑的字符是: