upload-labs 21關解析

目錄

一、代碼審計

二、實踐

三、總結


一、代碼審計

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){//檢查MIME$allow_type = array('image/jpeg','image/png','image/gif');if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上傳該類型文件!";}else{//檢查文件名$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {$file = explode('.', strtolower($file));}$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上傳該后綴文件!";}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上傳成功!";$is_upload = true;} else {$msg = "文件上傳失敗!";}}}
}else{$msg = "請選擇要上傳的文件!";
}

對源代碼進行分析

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

這是個三元運算符,判斷 'save_name' 是否為空?

(A ? B : C? ,如果A成立,則運行B,否則運行C)

如果用戶提交的'save_name'為空,則使用上傳文件的原始文件名,若不為空則使用該參數值作為文件名

 if (!is_array($file)) {$file = explode('.', strtolower($file));}

判斷 $file 是不是數組,如果不是數組,則使用 . 進行切分變為數組

比如 cooper.php.jpg,切分為 cooper php jpg 分別對應數組三個元素

 $ext = end($file);

從數組中獲取最后一個元素作為擴展名

經過這兩條分析,想想為什么要判斷 'save_name' 參數是否為數組呢?

難道POST提交的不都是字符串嗎?

那么就進行測試

發現請求參數可以直接以數組的方式提交

那么我們能否去構造一個POST請求的save_name參數,將文件后綴名改為jpg,但文件本身還是cooper.php

問題保留一下,接著分析

$file_name = reset($file) . '.' . $file[count($file) - 1];

reset函數為調用第一個元素

拼接文件名:數組第一個元素 + . + 數組最后一個元素

比如文件名為cooper.php,則 $file_name = cooper + . + php

那么如果直接上傳的不是字符串,而是數組會怎么樣?

比如save_name[0] = cooper.php , save_name[2] = jpg

按照拼接方法那我們構造的文件最后的方式為:

$file_name = cooper.php . $file[1]? ?==> cooper.php.空

理論可行,實踐開始!

二、實踐

首先上傳一個帶有木馬的php文件,使用burp抓包

.

將其修改為以下格式

提示上傳成功,那么就來測試一下

試驗成功!

三、總結

復盤一下:先進行代碼審計,然后看到分割數組,思考為什么要進行分割,難道POST可以上傳數組嗎?然后進行實驗,實驗驗證確實可以上傳數組形式。接著代碼審計,發現文件拼接時具有漏洞,那么構造payload進行嘗試,最后成功!

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

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

相關文章

一個程序員的牢獄生涯(38)答案

星期一 答 案 我被這個不知道什么時候無聲無息的出現在身后的人嚇出了一身的冷汗。 看到我發現了他,這個人慢慢地抬起了頭……“他X的,是小X州!” 此時的小X州臉上并沒有著急等待上廁所的表情,反而是用一種狡黠的眼神看著我。一直充滿的敵意,現在又多了一絲威脅的神情,讓…

Quartus Cyclone I II III IVE 器件型號

玩耍了一個 EP2 型號的開發板,發現 安裝的quartus13 沒有Cyclone II 型號,經過探索發現了是版本不對。 https://www.intel.com/content/www/us/en/software-kit/711920/intel-quartus-ii-subscription-edition-design-software-version-13-0sp1-for-win…

行業分析---造車新勢力之蔚來汽車

1 前言 在之前的博客中,筆者分析了蘋果《行業分析---我眼中的Apple Inc.》,蘋果已經成為世界級的公司。隨后也分析了電動汽車公司特斯拉《行業分析---馬斯克的Tesla》,特斯拉也在不斷成長。目前能分析的新能源汽車公司不多,小米汽…

Minecraft服務器如何搭建

Minecraft這是原版英文名稱,在中國大陸被譯為《我的世界》,這款游戲很火爆。臺灣的很多小伙伴也在玩,其譯名為《我的創世神》。現在這款游戲在國內已經被網易代理了。因為這款游戲開源,所以任何人都可以搭建服務器端,如…

機器人支持回調接口配置(詳細教程)

大家伙,我是雄雄,歡迎關注微信公眾號:雄雄的小課堂。 一、前言 今天,給大家介紹一下,如何在機器人中配置回調地址和接口編寫。很多時候我們可能有這樣的場景,收到消息后,想自己處理一下消息的內…

【Linux】Linux的基本指令_2

文章目錄 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待續 二、基本指令 8. man Linux的命令有很多參數&#xff0c;我們不可能全記住&#xff0c;我們可以通過查看聯機手冊獲取幫助。訪問…

基于門控的循環神經網絡:GRU

門控循環單元&#xff08;GatedRecurrentUnit&#xff0c;GRU&#xff09;網絡&#xff0c;也是一種基于門控的循環神經網絡&#xff0c;但是名氣不如LSTM大&#xff0c;GRU是對LSTM的一種改版&#xff0c;可以理解為是LSTM的簡化版。LSTM有三個門&#xff0c;輸入門&#xff0…

【C++】牛客 ——DP36 abb

?題目鏈接&#xff1a; DP36 abb ?題目描述 leafee 最近愛上了 abb 型語句&#xff0c;比如“疊詞詞”、“惡心心” leafee 拿到了一個只含有小寫字母的字符串&#xff0c;她想知道有多少個 "abb" 型的子序列&#xff1f; 定義&#xff1a; abb 型字符串滿足以下…

perl:用 Net::Server 創建簡單的流媒體服務器

這是一個使用Perl Net::Server 模塊創建的簡單流媒體服務器示例&#xff0c;它能夠播放.flv文件。 首先&#xff0c;確保安裝了Net::Server模塊&#xff0c;如果沒有安裝&#xff0c;可以使用CPAN來安裝它&#xff1a; 運行 cpan Net::Server RHANDOM/Net-Server-2.014.tar.…

力扣刷題--448. 找到所有數組中消失的數字【簡單】

題目描述 給你一個含 n 個整數的數組 nums &#xff0c;其中 nums[i] 在區間 [1, n] 內。請你找出所有在 [1, n] 范圍內但沒有出現在 nums 中的數字&#xff0c;并以數組的形式返回結果。 示例 1&#xff1a; 輸入&#xff1a;nums [4,3,2,7,8,2,3,1] 輸出&#xff1a;[5,6…

Python零基礎-中【詳細】

接上篇繼續&#xff1a; Python零基礎-上【詳細】-CSDN博客 目錄 十、函數式編程 1、匿名函數lambda表達式 &#xff08;1&#xff09;匿名函數理解 &#xff08;2&#xff09;lambda表達式的基本格式 &#xff08;3&#xff09;lambda表達式的使用場景 &#xff08;4&…

js 實現貪心算法

貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法策略。請注意&#xff0c;貪心算法并不總是能保證得到全局最優解&#xff0c;但在某些問題上&#xff0c;它可以提供足夠好的解決方案。下面是一個使用Java…

前端知識1-3:模塊化+瀏覽器詳解

script標簽兩個變量參數 - async & defer <script src"main.js" async></script>普通 - 解析到標簽&#xff0c;立刻pending&#xff0c;并且下載執行defer - 解析到標簽&#xff0c;開始異步下載&#xff0c;解析完成之后開始執行async - 解析到標簽…

內存函數詳解,包含部分字符串函數

目錄 一&#xff0c;memcpy內存函數的介紹 二memmove函數的介紹 三&#xff0c;memset的函數使用 四&#xff0c;memcmp的介紹 五&#xff0c;內存函數的模擬實現&#xff0c;以及一個字符串函數strstr的模擬實現 5.1memcpy函數的實現 5.2memmove的模擬實現 5.3memcmp的模擬…

Shell環境變量深入:自定義系統環境變量

Shell環境變量深入&#xff1a;自定義系統環境變量 目標 能夠自定義系統級環境變量 全局配置文件/etc/profile應用場景 當前用戶進入Shell環境初始化的時候會加載全局配置文件/etc/profile里面的環境變量, 供給所有Shell程序使用 以后只要是所有Shell程序或命令使用的變量…

H.機房【藍橋杯】/數組鏈式前向星建圖+堆優化版dijkstra

機房 數組鏈式前向星建圖堆優化版dijkstra #include<iostream> #include<queue> #include<cstring> #include<vector> using namespace std; typedef pair<int,int> pii; //無向圖開兩倍 int e[200005],ne[200005],v[200005],h[200005],du[1000…

STL---unordered set和unordered multiset【無序集合】

1.1 定義及初始化&#x1f357; 下面列出常用的初始化方式 #include <unordered_set> #include <iostream> using namespace std; //輸出s中的所有元素 template<typename T> void Show(const T& s) {for (auto& x : s) …

Python的pip配置、程序運行、生成exe文件

一、安裝Python 通過官網下載對應的版本&#xff0c;安裝即可。 下載地址&#xff1a;Download Python | Python.org Python標準庫查看&#xff08;Python自帶庫&#xff09; Python 標準庫文檔 安裝Python的時候&#xff0c;如果選第二個自定義安裝要記得勾選安裝pip 二、…

2024/05/25學習記錄

1、面經復習&#xff1a;前端廣度 2、代碼隨想錄刷題&#xff1a;動態規劃 3、rosebush 完成input組件基礎

閑置商標轉讓出現這些狀態時注意!

近日以前做轉讓的一個朋友的商標轉讓證明下來&#xff0c;正好是2個半月&#xff0c;普推知產老楊發現這個時間也太快&#xff0c;以前差不多四個月左右&#xff0c;有些朋友需要購買閑置商標&#xff0c;3個月內所有權就變成自己的。 在購買閑置商標時要注意有一些細節&#x…