File Inclusion
產(chǎn)生場(chǎng)景:
由于服務(wù)器腳本根據(jù)用戶點(diǎn)擊頁(yè)面?zhèn)魅氲膮?shù)進(jìn)行文件包含的時(shí)候斑芜,沒(méi)有對(duì)點(diǎn)擊頁(yè)面?zhèn)魅氲膮?shù)進(jìn)行有效過(guò)濾谈撒,導(dǎo)致可能包含任意文件蚕捉。若還對(duì)傳入的參數(shù)律胀,在頁(yè)面上進(jìn)行輸出贝乎,那么還可能存在XSS漏洞杈笔。
錯(cuò)誤的過(guò)濾機(jī)制示范:
完全沒(méi)有過(guò)濾:若對(duì)參數(shù)完全沒(méi)有過(guò)濾,直接引入相關(guān)文件糕非,那么將會(huì)導(dǎo)致直接包含任意文件(前提是知道可能存在的文件名蒙具、路徑)。若還將傳入的參數(shù)值在頁(yè)面進(jìn)行輸出朽肥,那么還必將導(dǎo)致XSS攻擊禁筏。
由于dvwa的源碼中,并未對(duì)傳入的參數(shù)進(jìn)行頁(yè)面上的輸出,所以昙读,這里不存在xss漏洞扔罪。
黑名單的方式進(jìn)行過(guò)濾:我個(gè)人的感悟是,只要是使用黑名單的過(guò)濾方式州刽,那么就非常有可能有某種奇淫技巧進(jìn)行繞過(guò)。
下面是dvwa中進(jìn)行的錯(cuò)誤的過(guò)濾方法浪箭,一一提供繞過(guò)方式穗椅。
第一種
源碼中的黑名單只有四個(gè),而對(duì)于str_replace()這個(gè)函數(shù)來(lái)說(shuō)奶栖,它是區(qū)分大小寫(xiě)的進(jìn)行替換匹表。因此,若你想包含遠(yuǎn)程文件宣鄙,比如你自己的服務(wù)器上的釣魚(yú)網(wǎng)頁(yè)袍镀,那么只需要將http進(jìn)行大小寫(xiě)轉(zhuǎn)換即可。亦或是其他的能讓電腦認(rèn)識(shí)你的輸入是http冻晤,而卻不屬于這個(gè)黑名單之中的寫(xiě)法都可以苇羡。
很多人都喜歡../../../../../etc/password這樣的包含linux系統(tǒng)本地文件的方法。亦或者是..\..\..\..\..\..\..\windows\win.ini包含windows系統(tǒng)文件的方法鼻弧。但是设江,這里卻對(duì)這種方法進(jìn)行了過(guò)濾。繞過(guò)的方法也非常簡(jiǎn)單温数,只需要變成/etc/password這類格式即可绣硝。原理就是前者是不知道目錄格式的情況下為了到達(dá)跟目錄。后者是直接猜測(cè)網(wǎng)站目錄撑刺。如果知道真實(shí)目錄路徑鹉胖,那是最好的情況了。
第二種
源碼中依舊使用了黑名單策略。當(dāng)然也可以理解為范圍比較廣泛的白名單策略甫菠。他的代碼邏輯就是挠铲,只要傳入的參數(shù)值是以file開(kāi)頭,那么便可以直接包含寂诱。若不是以file開(kāi)頭拂苹,并且不是include.php文件,那么就報(bào)錯(cuò)痰洒。
這樣咋一看是無(wú)法繞過(guò)瓢棒,但是,實(shí)驗(yàn)中發(fā)現(xiàn)若是參數(shù)值為"file1.php../../../../../etc/password"或者"file1.php..\..\..\..\..\..\..\windows\win.ini"那么便滿足了過(guò)濾條件丘喻。直接執(zhí)行邏輯包含該文件脯宿。這就是我說(shuō)的“計(jì)算機(jī)能認(rèn)識(shí)你的輸入,但是過(guò)濾機(jī)制卻能繞過(guò)”的思路泉粉。
正確的白名單機(jī)制:
可以看到连霉,對(duì)傳入的參數(shù)值限定的非常死,只能是提前規(guī)定好的值才能傳入嗡靡、包含該文件跺撼。否則,一律報(bào)錯(cuò)讨彼。
總結(jié):防止各種繞過(guò)的重點(diǎn)就一句話——白名單歉井!而繞過(guò)各種過(guò)濾的重點(diǎn)也只有一句話——思路一定要騷!