在對網站進行安全測驗時,常常會通過目標站點存在的檔案包含漏洞讀取目標服務器中的重要組態檔資訊上傳木馬檔案從而達到最理想的控制目標服務器的效果,為了更好的利用該漏洞,對相關知識進行總結
0x00 常見檔案包含函式
- include、include_once、require、require_once
# 當一個檔案被包含時,語法決議器在目標檔案的開頭脫離 PHP 模式并進入 HTML 模式,到檔案結尾處恢復,由于此原因,目標檔案中需要作為 PHP 代碼執行的任何代碼都必須被包括在有效的PHP起始和結束標記之中,
- highlight_file、show_source
# 讀取目標filename的檔案內容,回傳高亮版本的代碼
- readfile
# 讀取檔案并寫入到輸出緩沖,成功時回傳從檔案中讀入的位元組數,可使用該函式通過設定header強制下載檔案
- file、file_get_contents
# 把整個檔案讀入一個陣列中,后者則是以字串形式獲取檔案的內容
- fopen
# 如果引數 filename 是 "scheme://..." 的格式,則被當成一個 URL,如果 PHP 認為 filename 指定的是一個已注冊的協議,而該協議被注冊為一個網路 URL,PHP 將檢查并確認 allow_url_fopen 已被激活,如果關閉了,PHP 將發出一個警告,而 fopen 的呼叫則失敗
PS:以上函式在一些情況下均受 safe_mode、open_basedir、allow_url_fopen、allow_url_include 限制,然而,在 PHP 5.4 中 safe_mode 被移除
0x01 進行檔案包函時的兩種情況
- 不需對被包含的檔案名進行截斷
<?php include($_GET['file']) ?>
包含方式:http://www.example.com?file=filename
- 需對被包含的檔案名進行截斷
<?php include($_GET['file'].'.php') ?>
包含方式:http://www.example.com?file=filename%00
或使用 ? 號截斷:在路徑最后輸入 ? 號:ep: "http://www.xxx.com/xxx.php?parameter=value?" ,這時服務器會將 ?號后的內容決議為GET方法傳遞的引數
或使用 #(%23)、空格(%20)繞過
PS:PHP在5.3.4中已修復了%00截斷的問題,因此%00截斷適用于<5.3.4版本
0x02 PHP常用偽協議
- 【 file:// 】協議:
說明:檔案系統 是 PHP 使用的默認封裝協議,用于讀取本地檔案系統,當指定了一個相對路徑(不以/、\、\\或 Windows 盤符開頭的路徑)提供的路徑將基于當前的作業目錄
用法:



協議概要:

- 【php://】協議:
說明:訪問各個輸入/輸出流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 記憶體中、磁盤備份的臨時檔案流以及可以操作其他讀取寫入檔案資源的過濾器
-
- 【php://input】----->訪問請求的原始資料的只讀流
說明:可以讀取到發送的請求沒有被決議的原始資料,enctype="multipart/form-data" 的時候 php://input 是無效的(可以將其認為是遠程檔案包含的一種,為什么是遠程檔案呢,以下示例做出驗證)
驗證:
# 測驗檔案 include.php
<?php inlcude('<?php phpinfo(); ?>'); ?>

# 修改測驗檔案 <?php $file = $_GET['file']; include($file); ?>

用法:
# 測驗檔案
<?php echo $postdata = file_get_contents($_GET["a"]); ?>

利用該協議寫入木馬檔案到目標服務器:(寫入位置以當前被訪問檔案位置坐參考)
# 測驗檔案 include.php <?php $file = $_GET['file']; include($file); ?>

利用該協議執行系統命令:

協議概要:allow_url_fopen:不受該項限制
allow_url_include:必須為開啟狀態
-
- 【php://filter】---->元封裝器, 設計用于資料流打開時的篩選過濾應用,
說明:這對于一體式(all-in-one)的檔案函式非常有用,類似 readfile()、 file() 和 file_get_contents(), 在資料流內容讀取之前沒有機會應用其他過濾器,此時該協議就可發揮作用,常使用該函式讀取一些關鍵檔案源代碼
引數介紹:

用法:
# 測驗檔案 include.php <?php $file = $_GET['file']; include($file); ?>
# 測驗檔案 phpinfo.php
<?php
phpinfo();
?>

協議概要:

- 【data://協議】---->允許將小的資料項作為“即時”資料包含在內
說明:將原本的include的檔案流重定向到了用戶可控制的輸入流中,簡單來說就是在進行檔案包含時包含了自定義的輸入流,通過自定義輸入payload來實作目的
用法:
# 測驗檔案 include.php <?php $file = $_GET['file']; include($file); ?>

協議概要:

經過測驗PHP版本5.2,5.3,5.5,7.0;data:// 協議是是受限于allow_url_fopen的,官方檔案上給出的是NO,所以要使用data://協議需要滿足雙on條件
- 【phar://協議】
說明:php解壓縮包的一個函式,不管后綴是什么,都會當做壓縮包來解壓;PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬檔案壓縮后,改為其他任意格式的檔案都可以正常使用
用法:可將一句話木馬檔案壓縮后,改為任意后綴名(這里依然使用指標測驗)
# 測驗檔案 include.php <?php $file = $_GET['file']; include($file); ?>

協議概要:

- 【zlib://、bzip2://、zip://協議】---->壓縮流
說明:【zlib://、bzip2://、zip://】協議可以訪問壓縮檔案中的子檔案
用法:compress.zlib://file.gz
compress.bzip2://file.bz2
zip://archive.zip#dir/file.txt //使用該方法時需在url中將 '#' 改為URL編碼形式的%23,否則使用失敗
# 測驗檔案 include.php <?php $file = $_GET['file']; include($file); ?>
zip://協議

協議概要:

宣告:本文參考:
https://www.freebuf.com/column/148886.html
https://blog.csdn.net/Vansnc/article/details/82528395
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189502.html
標籤:其他
上一篇:OSI七層參考模型
