本文内容:
~什么是序列化
~魔术方法和反序列化利用
~实战注意
每日一句:
希望大家学习了相关技术
多为我国的网络安全做贡献
不要做违法乱纪的事请!!!
一、什么是序列化
1,定义
简单的说:将php中对象、类、数组、变量、匿名函数等,转化为字符串,
方便保存到数据库或者文件中
//将状态信息保存为字符串
2,什么是反序列化
//将字符串保存为状态信息
3,类与对象
~类与对象
在次说一下,
类就是代表一种物体的总称,比如猫类,狗类,鱼类等等
对象就是类的具体体现,比如狗类的拉布拉多犬
举例:
人这个“类”,张三是类具体的人,即对象
这里的类就是“人”,张三就是“对象”
~类得初始化,即要给“类”赋予第一个对象的过程
~销毁对象,即干掉“张三”
~类的序列化
人“类”有什么特征呢: 年龄,性别,姓名等
具体到对象:
姓名:张三
性别:男
年龄:20
但将这些信息保存很多的话,这个“年龄,性别,姓名”就会重复多次
于是,最后存储的就是“张三,男,20”
这就是序列化
~反序列化
就是将信息还原具体
“张三,男,20” ==> “姓名:张三,性别:男,年龄:20”
~注意,有一定难度的是,万一取出信息是:160,165
这个160和165 到底哪个是代表的身高,
哪个是代表的体重???
~注意,还原的时候,用对“类”
不能还原“张三,男,20”,用“鱼”类等
4,php的序列化函数
当在php中创建了一个对象后,可以通过serialize()这个函数
把对象转变成一个字符串,保存对象的值方便之后的传递与使用。
例子:
<?php
show_source(__FILE__);
class chybeta{
var $test = '123';
}
$class1 = new chybeta; //实例化对象
$class1_ser = serialize($class1); //序列化
echo "<hr>";
print_r($class1_ser);
?>
输出结果:O:7:"chybeta":1:{s:4:"test";s:3:"123";}
// O代表 object对象
// 7代表 对象名称有7个字符
// s代表 字符串
// 4代表 test的长度
// test 类得属性名称
// 123 属性长度
5,php反序列化函数
unserialize()函数,可以将状态还原
例如:
<?php
show_source(__FILE__);
class chybeta{
var $test = '123';
}
$class2 = 'O:7:"chybeta":1:{s:4:"test";s:3:"124";}';
//假设$class2 变量可控
echo "<hr>";
echo "</br>";
$class2_unser = unserialize($class2); //序列化
print_r($class2_unser);
?>
输出结果:chybeta Object([test] => 124)
//看到这,大家应该明白了。假如我们能控制反序列化的传参
//就可以注入精心构造的payload。当进行反序列化的时候
//就有可能会触发对象中的一些魔术方法,
//造成意想不到的危害
总结: 实际上,开发肯定在这肯定是为了实现某些功能,但是
没有对传参进行过滤,导致出现问题
二、魔术方法和反序列化利用
1,魔术方法的定义
魔术:自动触发
方法:在类里面的方法 = 函数
===》核心===》 自动触发的函数
//比如,放一个老鼠夹子,老鼠经过,直接“啪”
2,常用函数(魔术方法)
~__construct():当对象创建(new)时会自动调用。
但在unserialize()时是不会自动调用的。(构造函数)
~__destruct():当对象被销毁时会自动调用。(析构函数)
~__wakeup() :如前所提,unserialize()时会自动调用。
三、实战注意
1,这主要就是多注意细节
2,多练习代码功底
3,在cookie中传参的话,假如有特殊字符要注意,cookie会进行一次
url解码。所以,传参cookie要进行一次url编码
4,工作之中的话,反序列化
直接百度:“phar 反序列化” //建议自学
5,这个工作之中,比较难于遇到
6,面试之中遇到有问的
百度:WebLogic 反序列化 //将这个了解透,和hr聊就行
//因为正常的 渗透测试人员用不到这,提到就是加分项了已经
转载:https://blog.csdn.net/weixin_43970718/article/details/104503535
查看评论