upload-labs通關筆記-第8關 文件上傳之點繞過

目錄

一、點繞過原理

二、deldot()函數

三、源碼分析

四、滲透實戰

1、構建腳本test8.php

?2、打開靶場

3、bp開啟攔截

4、點擊上傳

5、bp攔截

6、后綴名增加點

7、發包并獲取腳本地址

8、訪問腳本


本文通過《upload-labs靶場通關筆記系列》來進行upload-labs靶場的滲透實戰,本文講解upload-labs靶場第8關文件點繞過滲透實戰。

一、點繞過原理

"點繞過"是文件上傳攻擊中一種常見的繞過技術,攻擊者通過在文件名中特殊位置插入點(.)來繞過服務器的安全校驗機制。以下是詳細的原理分析:

由于Windows系統有如下特點:

  • 自動去除文件名末尾的點:“test8.php.”?→ “test8.php”

  • 自動去除空格:“test8.php ”→ “test8.php”

  • 忽略大小寫:“test.PHP” → “test.php”

正是因為如上第一個特點,可以構建如下攻擊流程

  • 攻擊者上傳類似的文件“test8.php.”

  • 由于某些系統(如Windows)會自動去除末尾的點,最終存儲為 “test.php”

二、deldot()函數

deldot() 是一個用于處理文件上傳安全的自定義函數,主要功能是刪除文件名末尾的點(.),防止攻擊者利用文件命名規則繞過安全檢測。它的作用是從字符串尾部開始,從后向前刪除點(.) ,直到末尾字符不是點為止。比如文件名 test...php 經該函數處理后可能變為 test.php 。

在upload-labs靶場中,deldot()是一個自定義的函數,在common.h中,具體如下所示。

?接下來對這段代碼進行詳細注釋,具體如下所示。

<?php
/*** 此函數用于去除字符串末尾連續的點(.)* 如果字符串末尾沒有連續的點,則直接返回原字符串* * @param string $s 要處理的字符串* @return string 處理后的字符串*/
function deldot($s) {// 從字符串的最后一個字符開始遍歷,通過 strlen($s) - 1 獲取最后一個字符的索引for ($i = strlen($s) - 1; $i > 0; $i--) {// 使用 substr 函數截取字符串中索引為 $i 的單個字符,存儲到變量 $c 中$c = substr($s, $i, 1);// 檢查當前字符是否是字符串的最后一個字符,并且這個字符不是點(.)if ($i == strlen($s) - 1 && $c != '.') {// 如果滿足條件,說明字符串末尾沒有連續的點,直接返回原字符串return $s;}// 檢查當前字符是否不是點(.)if ($c != '.') {// 如果當前字符不是點,使用 substr 函數截取從字符串開頭到當前字符(包含當前字符)的子字符串并返回return substr($s, 0, $i + 1);}}// 如果函數執行到這里,說明整個字符串可能都是點或者循環結束都沒有找到非點字符return $s;
}
?>

三、源碼分析

接下來對upload-labs 第8 關的源碼進行審計,很明顯這一關卡又是黑名單過濾,與第6關卡一樣,相對于第四關和第五關,將“.htacess和.ini”后綴均過濾了,故而無法用第四關和第五關的方法進行滲透。然而相對于第六關卡和第七關卡,缺少了一個deldot函數的處理。經過詳細注釋的代碼如下所示。

<?php
// 初始化文件上傳狀態標志,默認設置為 false,表示文件未成功上傳
$is_upload = false;
// 初始化消息變量,用于存儲上傳過程中產生的提示信息,初始值為 null
$msg = null;// 檢查是否通過 POST 方式提交了名為 'submit' 的表單元素
// 當用戶點擊提交按鈕時,會觸發此邏輯
if (isset($_POST['submit'])) {// 檢查常量 UPLOAD_PATH 所代表的上傳目錄是否存在// 只有上傳目錄存在,才能進行文件上傳操作if (file_exists(UPLOAD_PATH)) {// 定義一個數組,包含所有不允許上傳的文件擴展名// 這里涵蓋了常見的腳本文件擴展名(如 PHP、JSP、ASP 等)、網頁文件擴展名(如 HTML、HTM)以及一些特殊配置文件擴展名(如 .htaccess、.ini)$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");// 從 $_FILES 超全局數組中獲取上傳文件的原始文件名,并去除文件名首尾的空白字符$file_name = trim($_FILES['upload_file']['name']);// 使用 strrchr 函數從文件名中提取文件擴展名// strrchr 會返回從最后一個點(.)開始到字符串末尾的部分$file_ext = strrchr($file_name, '.');// 將提取的文件擴展名轉換為小寫// 這樣做是為了實現大小寫不敏感的擴展名檢查$file_ext = strtolower($file_ext); // 去除文件擴展名中可能包含的 '::$DATA' 字符串// 在 Windows 系統中,'::$DATA' 是一種特殊的文件流標識,攻擊者可能會利用它來繞過文件類型檢查$file_ext = str_ireplace('::$DATA', '', $file_ext);// 再次去除文件擴展名首尾的空白字符$file_ext = trim($file_ext); // 檢查提取并處理后的文件擴展名是否不在禁止上傳的擴展名數組中if (!in_array($file_ext, $deny_ext)) {// 從 $_FILES 超全局數組中獲取上傳文件在服務器臨時存儲的路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 拼接上傳文件的最終存儲路徑// 將上傳目錄(UPLOAD_PATH)和文件名組合成完整的路徑$img_path = UPLOAD_PATH.'/'.$file_name;// 使用 move_uploaded_file 函數將臨時存儲的文件移動到指定的上傳路徑// 此函數確保文件是通過 HTTP POST 上傳的,防止惡意文件上傳if (move_uploaded_file($temp_file, $img_path)) {// 如果文件移動成功,將文件上傳狀態標志設置為 true,表示文件上傳成功$is_upload = true;} else {// 如果文件移動失敗,將錯誤信息存儲到 $msg 變量中$msg = '上傳出錯!';}} else {// 如果文件擴展名在禁止上傳的數組中,將錯誤信息存儲到 $msg 變量中$msg = '此文件類型不允許上傳!';}} else {// 如果上傳目錄不存在,將錯誤信息存儲到 $msg 變量中,并提示用戶手工創建該目錄$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';}
}
?>

從上圖可知,源碼中沒有$file_name = deldot($file_ext);服務器無法實現將文件后的.過濾,所以可以在文件末尾添加一個“.”,這樣就可以繞過黑名單的限制

例如:上傳"test.php"文件,抓包后在文件名后添加一個點變為"test8.php.",上傳到服務器的時候,得到的后綴就是"test8.php.",從而繞過黑名單的限制。當"test8.php."文件上傳到windows服務器后,會被windows系統自動去掉不符合規則符號后面的內容(也就是將".php."中最尾部的點去掉),文件末尾就變回了".php", 這樣文件名又恢復成為"test.php",可以成功滲透。

四、滲透實戰

1、構建腳本test8.php

<?php
phpinfo();
?>

?2、打開靶場

?打開靶場第8關,瀏覽選擇該腳本,但不點擊上傳。

3、bp開啟攔截

4、點擊上傳

5、bp攔截

bp捕獲到上傳報文,下圖紅框的部分即為需要修改的文件名,需要將".php"后綴改為".php.",修改之前文件名為”test8.php“,如下所示

6、后綴名增加點

test8.php后添加一個點,變為“test8.php.”,修改后效果如下所示。

7、發包并獲取腳本地址

將bp的inception設置為off,此時修改后的報文發送成功。

回到靶場的Pass08關卡,圖片已經上傳成功,在圖片處右鍵復制圖片地址。

右鍵圖片獲取圖片地址,如下所示獲取到圖片URL。

http://127.0.0.1/upload-labs/upload/test8.php.

8、訪問腳本

?如下所示訪問test8.php腳本獲取到服務器的php信息,證明文件上傳成功。

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

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

相關文章

Spring Web MVC————入門(3)

今天我們來一個大練習&#xff0c;我們要實現一個登錄界面&#xff0c;登錄進去了先獲取到登錄人信息&#xff0c;可以選擇計算器和留言板兩個功能&#xff0c;另外我們是學后端的&#xff0c;對于前端我們會些基礎的就行了&#xff0c;知道ajax怎么用&#xff0c;知道怎么關聯…

PhpStudy | PhpStudy 工具安裝 —— Windows 系統安裝 PhpStudy

&#x1f31f;想了解這個工具的其它相關筆記&#xff1f;看看這個&#xff1a;[網安工具] 服務器環境配置工具 —— PhpStudy 使用手冊 筆者備注&#xff1a;Windows 中安裝 PhpStudy 屬于傻瓜式安裝&#xff0c;本文只是為了體系完善而發。 在前面的章節中&#xff0c;筆者簡…

K230 ISP:一種新的白平衡標定方法

第一次遇見需要利用光譜響應曲線進行白平衡標定的方法。很好奇是如何利用光譜響應曲線進行白平衡標定的。 參考資料參考&#xff1a;K230 ISP圖像調優指南 K230 介紹 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核異構單元加速計算架構&a…

通俗解釋Transformer在處理序列問題高效的原因(個人理解)

Transformer出現的背景 CNN 的全局關聯缺陷卷積神經網絡&#xff08;CNN&#xff09;通過多層堆疊擴大感受野&#xff0c;但在自然語言處理中存在本質局限&#xff1a; 局部操作的語義割裂&#xff1a;每個卷積核僅處理固定窗口&#xff08;如 3-5 詞&#xff09;&#xff0c;…

Java 多線程基礎:Thread 類核心用法詳解

一、線程創建 1. 繼承 Thread 類&#xff08;傳統寫法&#xff09; class MyThread extends Thread { Override public void run() { System.out.println("線程執行"); } } // 使用示例 MyThread t new MyThread(); t.start(); 缺點&#xff1a;Java 單…

Django 中時區的理解

背景 設置時區為北京時間 TIME_ZONE ‘Asia/Shanghai’ # 啟用時區支持 USE_TZ True 這樣設置的作用 前端 &#xff08;實際上前端el-date-picker 顯示的是當地時區的時間&#xff09; Element組件轉換后&#xff0c;我們是東八區&#xff0c;前端傳給后端的時間為&…

C# 深入理解類(成員常量)

成員常量 成員常量類似前一章所述的局部常量&#xff0c;只是它們被聲明在類聲明中而不是方法內&#xff0c;如下面的 示例&#xff1a; 與局部常量類似&#xff0c;用于初始化成員肯量的值在編譯時必須是可計算的&#xff0c;而且通常是一個預定 義簡單類型或由它們組成的表達…

【深度學習】#12 計算機視覺

主要參考學習資料&#xff1a; 《動手學深度學習》阿斯頓張 等 著 【動手學深度學習 PyTorch版】嗶哩嗶哩跟李沐學AI 目錄 目標檢測錨框交并比&#xff08;IoU&#xff09;錨框標注真實邊界框分配偏移量計算損失函數 非極大值抑制預測 多尺度目標檢測單發多框檢測&#xff08;S…

MCP實戰:在扣子空間用扣子工作流MCP,一句話生成兒童故事rap視頻

扣子最近迎來重要更新&#xff0c;支持將扣子工作流一鍵發布成MCP&#xff0c;在扣子空間里使用。 這個功能非常有用&#xff0c;因為我有很多業務工作流是在扣子平臺上做的&#xff0c;兩者打通之后&#xff0c;就可以在扣子空間里直接通過對話方式調用扣子工作流了&#xff0…

Redis學習打卡-Day3-分布式ID生成策略、分布式鎖

分布式 ID 當單機 MySQL 已經無法支撐系統的數據量時&#xff0c;就需要進行分庫分表&#xff08;推薦 Sharding-JDBC&#xff09;。在分庫之后&#xff0c; 數據遍布在不同服務器上的數據庫&#xff0c;數據庫的自增主鍵已經沒辦法滿足生成的主鍵全局唯一了。這個時候就需要生…

LabVIEW光譜信號仿真與數據處理

在光譜分析領域&#xff0c;LabVIEW 憑借其圖形化編程、豐富函數庫及強大數據處理能力&#xff0c;成為高效工具。本案例將介紹如何利用 LabVIEW 仿真光譜信號&#xff0c;并對實際采集的光譜數據進行處理&#xff0c;涵蓋信號生成、數據采集、濾波、分析及顯示等環節。 ? 一…

nginx相關面試題30道

一、基礎概念與核心特性 1. 什么是 Nginx&#xff1f;它的主要用途有哪些&#xff1f; 答案&#xff1a; Nginx 是一款高性能的開源 Web 服務器、反向代理服務器及負載均衡器&#xff0c;基于事件驅動的異步非阻塞架構&#xff0c;擅長處理高并發場景。 主要用途&#xff1a;…

數據庫實驗報告 數據定義操作 3

實驗報告&#xff08;第3次&#xff09; 實驗名稱 數據定義操作 實驗時間 10月12日1-2節 一、實驗內容 1、本次實驗是用sql語句創建庫和表&#xff0c;語句是固定的&#xff0c;要求熟記這些sql語句。 二、源程序及主…

霍夫圓變換全面解析(OpenCV)

文章目錄 一、霍夫圓變換基礎1.1 霍夫圓變換概述1.2 圓的數學表達與參數化 二、霍夫圓變換算法實現2.1 標準霍夫圓變換算法流程2.2 參數空間的表示與優化 三、關鍵參數解析3.1 OpenCV中的HoughCircles參數3.2 參數調優策略 四、Python與OpenCV實現參考4.1 基本實現代碼4.2 改進…

記錄一次修改nacos安全問題導致服務調用出現404

1、nacos默認值修改 nacos.core.auth.plugin.nacos.token.secret.key**** nacos.core.auth.server.identity.key******** nacos.core.auth.server.identity.value************ 重啟nacos, 這時候微服務的token認證會立即失效&#xff0c;等待自動重連認證或者手動重啟服務 2、…

Python面試總結

hello&#xff0c;大家好&#xff0c;我是potato&#xff0c;我總結一下最近的面試遇到的問題~ 1.Python開發&#xff08;軟通動力&#xff09; 自我介紹主要問了項目(YOLOv11)項目遇到的難點和解決方法is&#xff0c;列表和元組的區別Python多線程有什么問題&#xff1f;Pyt…

5.18 day24

知識點回顧&#xff1a; 元組可迭代對象os模塊 作業&#xff1a;對自己電腦的不同文件夾利用今天學到的知識操作下&#xff0c;理解下os路徑。 元組 元組的特點&#xff1a; 有序&#xff0c;可以重復&#xff0c;這一點和列表一樣 元組中的元素不能修改&#xff0c;這一點…

Uniapp中小程序調用騰訊地圖(獲取定位地址)

1、先配置權限&#xff1a; 這是上圖的代碼&#xff1a; "permission": { "scope.userLocation": { "desc": "你的位置信息將用于小程序位置接口的效果展示" } } 第二步&#xff1a;寫代碼&#xff1a; //下面是uniapp的模版代碼 主…

寫spark程序數據計算( 數據庫的計算,求和,匯總之類的)連接mysql數據庫,寫入計算結果

1. 添加依賴 在項目的 pom.xml&#xff08;Maven&#xff09;中添加以下依賴&#xff1a; xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…

nginx服務器實驗

1.實驗要求 1&#xff09;在Nginx服務器上搭建LNMP服務&#xff0c;并且能夠對外提供Discuz論壇服務。 在Web1、Web2服務器上搭建Tomcat 服務。 2&#xff09;為nginx服務配置虛擬主機&#xff0c;新增兩個域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…