File Inclusion
產生場景:
由于服務器腳本根據用戶點擊頁面傳入的參數進行文件包含的時候,沒有對點擊頁面傳入的參數進行有效過濾,導致可能包含任意文件。若還對傳入的參數,在頁面上進行輸出,那么還可能存在XSS漏洞。
錯誤的過濾機制示范:
完全沒有過濾:若對參數完全沒有過濾,直接引入相關文件,那么將會導致直接包含任意文件(前提是知道可能存在的文件名、路徑)。若還將傳入的參數值在頁面進行輸出,那么還必將導致XSS攻擊。
由于dvwa的源碼中,并未對傳入的參數進行頁面上的輸出,所以,這里不存在xss漏洞。
黑名單的方式進行過濾:我個人的感悟是,只要是使用黑名單的過濾方式,那么就非常有可能有某種奇淫技巧進行繞過。
下面是dvwa中進行的錯誤的過濾方法,一一提供繞過方式。
第一種
源碼中的黑名單只有四個,而對于str_replace()這個函數來說,它是區分大小寫的進行替換。因此,若你想包含遠程文件,比如你自己的服務器上的釣魚網頁,那么只需要將http進行大小寫轉換即可。亦或是其他的能讓電腦認識你的輸入是http,而卻不屬于這個黑名單之中的寫法都可以。
很多人都喜歡../../../../../etc/password這樣的包含linux系統本地文件的方法。亦或者是..\..\..\..\..\..\..\windows\win.ini包含windows系統文件的方法。但是,這里卻對這種方法進行了過濾。繞過的方法也非常簡單,只需要變成/etc/password這類格式即可。原理就是前者是不知道目錄格式的情況下為了到達跟目錄。后者是直接猜測網站目錄。如果知道真實目錄路徑,那是最好的情況了。
第二種
源碼中依舊使用了黑名單策略。當然也可以理解為范圍比較廣泛的白名單策略。他的代碼邏輯就是,只要傳入的參數值是以file開頭,那么便可以直接包含。若不是以file開頭,并且不是include.php文件,那么就報錯。
這樣咋一看是無法繞過,但是,實驗中發現若是參數值為"file1.php../../../../../etc/password"或者"file1.php..\..\..\..\..\..\..\windows\win.ini"那么便滿足了過濾條件。直接執行邏輯包含該文件。這就是我說的“計算機能認識你的輸入,但是過濾機制卻能繞過”的思路。
正確的白名單機制:
可以看到,對傳入的參數值限定的非常死,只能是提前規定好的值才能傳入、包含該文件。否則,一律報錯。
總結:防止各種繞過的重點就一句話——白名單!而繞過各種過濾的重點也只有一句話——思路一定要騷!