目录
- PHP反序列化
- 演示案例:
- 先搞一把PHP反序列化热身题稳住-无类问题-本地
- 在撸一把CTF反序列化小真题压压惊-无类执行-实例
- 最后顶一把网鼎杯2020青龙大真题舒服下-有类魔术方法触发-实例
https://www.cnblogs.com/zhengna/p/15661109.html
代码在线测试平台:https://c.runoob.com/compile/1/
序列化和反序列化其实就是数据格式相互转化的一种形式
PHP反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
序列化函数参考文章:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct() //创建对象时触发
__destruct() //对象被销毁时触发!
__call() //在对象上下文中调用不可访问的方法时触发
__callstatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
演示案例:
先搞一把PHP反序列化热身题稳住-无类问题-本地
基本上很多程序里面都是用class来代表类,有class就是有类,有类的话,就需要学习里面的函数方法
在撸一把CTF反序列化小真题压压惊-无类执行-实例
反序列化和代码基础没有什么关系,知道序列化执行的情况就完事了,当我们创建一个方法,就会调用里面的东西
当代码中有这些魔术方法的时候,你就按照特定的条件去触发方法,里面的代码就会被加载执行
最后顶一把网鼎杯2020青龙大真题舒服下-有类魔术方法触发-实例
涉及:反序列化魔术方法调用,弱类型绕过,ascii绕过
使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。__destruct函数对$this->op进行了===判断并内容在2字符串时会赋值为1,process函数中使用==对$this->op进行判断(为2的情况下才能读取内容),因此这里存在弱类型比较,可以使用数字2或字符串' 2'绕过判断。is_valid函数还对序列化宇符串进行了校验,因为成员被protected修饰,因此序列化字符串中会出现ascii为0的字符。经过测试,在PHP7.2+的环境中,使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。
==仅验证数值,===验证值和类型