文件包含漏洞原理利用方式及修復
- 2020 年 3 月 10 日
- 筆記
web安全
更新於 2月25日 約 8 分鐘
注:本文僅供學習參考
文件包含定義: 伺服器執行PHP文件時,可以通過文件包含函數載入另一個文件中的PHP程式碼,並且當PHP來執行,這會為開發者節省大量的時間。這意味著您可以創建供所有網頁引用的標準頁眉或菜單文件。當頁眉需要更新時,您只更新一個包含文件就可以了,或者當您向網站添加一張新頁面時,僅僅需要修改一下菜單文件(而不是更新所有網頁中的鏈接)。造成方便的同時,也留下了隱患。
文件包含常用函數:
require()#函數出現錯誤的時候,會直接報錯並退出程式的執行 require_once()#只包含一次 include()#在包含的過程中如果出現錯誤,會拋出一個警告,程式繼續正常運行 include_once()#只包含一次
原理: 在進行文件包含的時候,沒有對參數進行嚴格的過濾
<?php $filename = $_GET['filename']; include($filename); ?> 如上述例子 在引用filename函數時,沒有過濾,直接引用了這個函數
文件包含分類: 本地包含:可以進行一些本地的文件讀取 遠程包含:可以對外網上的文件進行讀取
實戰: 留意url,這裡我想包含當前目錄的1.txt(內容為phpinfo()),發現成功執行php語句


同理讀取其他文件可使用../../返回上級目錄,就比如我相關讀取D盤下的2.txt

思路
有時候當我們發現了一個本地的文件包含漏洞,但我們也僅僅只能去讀取一些本地的文件,沒有辦法去進行更深層次的利用,然後又在這個網站上發現了一個文件上傳漏洞,同時這個文件上傳漏洞如果單個來看是比較雞肋的,比如它做了限制,只能發送圖片,而這個圖片卻沒有做嚴格的限制,我們可以通過一些圖片木馬來繞過上傳,而這兩個漏洞結合一下的話,就能達到很大效果了 比如我們上傳了一個圖片木馬,沒法單獨去使用,但我們可以使用文件包含漏洞,去對這個文件進行包含,也就是說兩個文件互相結合進行利用
這裡提供一個思路getshell:就比如想getshell但又沒有上傳點,怎麼辦呢,我們可以把一句話包含進apache日誌里(日誌位置可以猜測一下),進行getshell。下面來看看實戰。
日誌位置於../../../../apache/logs/access.log 直接寫一句話(注意瀏覽器會編碼,通過burp請求)



這時打開菜刀嘗試連接 成功getshell


ps:%00截斷 條件:magic_quotes_gpc = Off php版本<5.3.4 比如這種
<?php $filename = $_GET['filename']; include($filename . ".html"); ?>
遠程文件包含: PHP的配置文件allow_url_fopen和allow_url_include設置為ON,include/require等包含函數可以載入遠程文件,如果遠程文件沒經過嚴格的過濾,導致了執行惡意文件的程式碼,這就是遠程文件包含漏洞。
條件
allow_url_fopen = On(是否允許打開遠程文件) allow_url_include = On(是否允許include/require遠程文件)
了解php偽協議: php偽協議本來是方便使用的,但如果存在包含漏洞,攻擊者可以充分利用讀取或寫入一些文件 這裡介紹幾個常用的
php://filter(本地磁碟文件進行讀取) php://input file://偽協議 (讀取文件內容)
php://filter用法 ?php://filter/convert.base64-encode/resource=xxx.php 通過Base64解密後


成功讀取
file://偽協議 (讀取文件內容) 通過file協議可以訪問本地文件系統,讀取到文件的內容 這裡讀取我D盤下的2.txt 2.txt的內容為phpinfo();

php://input 可以訪問請求的原始數據的只讀流。即可以直接讀取到POST上沒有經過解析的原始數據。enctype=」multipart/form-data」 的時候 php://input 是無效的。 用法:?file=php://input 數據利用POST傳過去。
php://input(寫入木馬) 條件:php配置文件中需同時開啟 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),(不開啟會報錯)就可以造成任意程式碼執行,在這可以理解成遠程文件包含漏洞(RFI),即POST過去PHP程式碼,即可執行。 如果POST的數據是執行寫入一句話木馬的PHP程式碼,就會在當前目錄下寫入一個木馬。


php://input(讀取post數據) 碰到file_get_contents()就要想到用php://input繞過,因為php偽協議也是可以利用http協議的,即可以使用POST方式傳數據,具體函數意義下一項

php://input(命令執行) 條件:php配置文件中需同時開啟 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意程式碼執行,在這可以理解成遠程文件包含漏洞(RFI),即POST過去PHP程式碼,即可執行

修復方式
過濾../ ./ 配置php.ini文件 都關閉allow_url_fopen 和 allow_url_include 設置白名單
還有很多協議如data phar zip等等等等 有興趣的夥伴可以去研究一下