小迪
参考:
https://www.bilibili.com/video/BV1JZ4y1c7ro?p=36&spm_id_from=333.880.my_history.page.click
https://blog.csdn.net/Hardworking666/article/details/122373938
https://blog.csdn.net/Hardworking666/article/details/112725423
补充:
PHP访问控制修饰符不同,序列化后的属性的长度和属性值会有所不同:
publick(公有):属性被序列化的时候属性值会变成 :属性名
protected(受保护):属性被序列化的时候属性值会变成: \x00*\x00属性名
private: 属性被序列化的时候属性值会变成:\x00类名\x00属性名
PHP反序列化
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化的过程,从而导致代码执行,SQL注入,目录遍历登不可控后果。在反序列化的过程中自动触发了某些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
无类的情况
a - array 数组型
b - boolean 布尔型
d - double 浮点型
i - integer 整数型
o - common object 共同对象
r - objec reference 对象引用
s - non-escaped binary string 非转义的二进制字符串
S - escaped binary string 转义的二进制字符串
C - custom object 自定义对象
O - class 对象
N - null 空
R - pointer reference 指针引用
U - unicode string Unicode 编码的字符串
案例-无类问题-ctf
https://ctf.bugku.com/challenges/detail/id/109.html
题目点登录没有反应
右键查看源代码,有一个admin.css
第一行提示传参?29524
对cookie进行反序列化等于key就可以flag
对key序列化
注意是if elseif,如果GET传参是29524的话就不执行flag了
抓包修改
案例-有类魔术方法触发
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),serialize() 函数会检查类中是否存在一个魔术方法。如果存在,该方法会先被调用,然后才执行序列化操作。
** __construct()// 构造函数,创建对象时触发 **
** __destruct() //对象被销毁时触发 **
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
** __sleep() //执行serialize()时,先会调用这个方法 **
** __wakeup() //执行unserialize()时,先会调用这个方法 **
** __toString() //转换成字符串的时候 **
案例-网鼎杯
https://www.ctfhub.com/#/challenge
不是很懂,这里记得在看一遍