No title
2023.5.8-2023.5.12
入党b事情一堆 这周就看了四天
下周学java了玉玉
反序列化
php序列化和反序列化
1.序列化就是把本来不能直接存储的数据转成可存储或传输的数据 serialize 来实现
2.反序列化就是把序列化的数据转成我们需要的格式来使用 unserialize 来实现
对private protected 反序列化不加这些会报错
空字节 %00
直接 把他urlencode再输出
几个魔法函数
__destruct
是析构函数,在一个对象创建或者被反序列化唤醒以后结束会调用析构函数 ,销毁所有有关该对象的东西,并执行fuction__destruct()
中的代码
__wakeup()
是用在反序列化操作中。unserialize 会检查存在一个 __wakeup()
方法。 如果 存在 先调用他
两个技巧
如果对象里面的变量是private 直接在对象里面修改 __construct()代码
输出直接用 url编码
__call
触发时机 -> 调用类的实例化对象中的不存在的方法时,会自行触发
作用 -> 方便进行多个类和实例之间的方法调用
__tostring
触发时机 –> 将类的实例化对象当作字符串调用的时候,就会自行触发
作用 —> 将对象当作字符串处理,有时候利于代码复写
除了echo 还有一种配合着die 用的方法 也可以调用_tostring
__invoke
触发时机 : 将类的实例化对象 当作方法调用时 ,就会自行触发
和上面差不多
1 | public __set(string $name, mixed $value): void ,在给不可访问(protected 或 private)或不存在的属性赋值时,__set()会被调用。 |
__wakeup 问题
漏洞影响版本 : php5<5.6.25 php7<7.0.10
漏洞原理 : __wakeup 触发unserilize()调用之前 , 但是如果被反序列化 的字符串其中对应的对象的属性个数发生变化时,就会导致反序列化失败而同时让 __wakeup
失效
返回 wakeup3 返回 3
因为 wakeup方法在 destruct方法之前执行 有的题目就会让你绕过wakeup
POP链子
看week6 的pop链笔记
这两个是类似题目
[MRCTF2020]Ezpop
[NISACTF 2022]popchains
反序列化字符串逃逸
PHP在反序列化时,底层代码是 以 ; 作为字段的分隔符 以}作为结尾(字符串除外) 并且是根据长度判断内容的 如果修改反序列化时的长度就会报错
反序列化字符逃逸的核心问题就是 不正确的正则替代防御
str_replace preg_replace
字符串逃逸 就是把一个属性改成 后面的。。} 就闭合了
然后根据 正则的替换 让 长度相等 找 少 替换 多 如 ll –> lll 要长度变长
题目
[UUCTF 2022 新生赛]ezpop
这个最重要的是 传入的就是name属性 其他的类的属性的值需要你去构造 而且正好有 str_replace 这样就需要 字符串逃逸
然后再去构造 pop 链子 —》赋给 相应的属性
要注意 双引号 !!!
一些题目
都是和序列化有关的
__destruct
当作挖掘反序列化链的入口 因为他是new 一个对象一定会执行的 而其他的 比如__call
__tostring
都得配合 destruct使用
修改变了在外面修改 其实在里面 外面都行
1.[HUBUCTF 2022 新生赛]checkin
弱类型比较 true与非零非NULL变量比较 都是对
2.[SWPUCTF 2021 新生赛]ez_unserialize
3.[SWPUCTF 2022 新生赛]1z_unserialize
4.[SWPUCTF 2022 新生赛]ez_ez_unserialize
wakeup绕过
5.[MoeCTF 2021]unserialize !!
7.攻防世界Web_php_unserialize
值得注意的点
不要获得序列化编码 然后 在这个代码上面改一些量 再进行其他的编码
这样很有可能导致错误
当我们要改一些值的时候 可以用 str_replace(‘原本的’,’要改上的’,’字符串’)
privat的属性
打印出来的串是有不可见字符%00的,不要复制出来自己base,不然结果就不一样了 别的题目的话 如果不是要base64编码 我们可以给他urlencode一下 再去传入
8.[SWPUCTF 2022 新生赛]ez_1zpop
本题的几个考点
- pop链子 ezpop
- md5 绕过 — array数组 或者0e绕
- wakeup绕过 可以在用 str_replace 改值 在这变量多的 要注意定位精准点 不然改到其他的就可能导致错误
- 本题目 lt类中的destruct 的echo $this 触发了 tostring
- 对属性的修改 可以在 类中修改 再new 也可以 new了 再改属性
9.[UUCTF 2022 新生赛]ezpop !!
详细看 笔记!