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编码

img

img

__call

触发时机 -> 调用类的实例化对象中的不存在的方法时,会自行触发

作用 -> 方便进行多个类和实例之间的方法调用

__tostring

触发时机 –> 将类的实例化对象当作字符串调用的时候,就会自行触发

作用 —> 将对象当作字符串处理,有时候利于代码复写

除了echo 还有一种配合着die 用的方法 也可以调用_tostring

__invoke

触发时机 : 将类的实例化对象 当作方法调用时 ,就会自行触发

和上面差不多

1
2
3
4
public __set(string $name, mixed $value): void 	,在给不可访问(protected 或 private)或不存在的属性赋值时,__set()会被调用。
public __get(string `$name`): mixed,读取不可访问(protected 或 private)或不存在的属性的值时,__get()会被调用。
public __isset(string $name): bool,当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset()会被调用。
public __unset(string $name): void,当对不可访问(protected 或 private)或不存在的属性调用 unset() 时,__unset()会被调用。

__wakeup 问题

漏洞影响版本 : php5<5.6.25 php7<7.0.10

漏洞原理 : __wakeup 触发unserilize()调用之前 , 但是如果被反序列化 的字符串其中对应的对象的属性个数发生变化时,就会导致反序列化失败而同时让 __wakeup 失效

5514badce742dff273d130bb0ca51d3

​ 返回 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

本题的几个考点

  1. pop链子 ezpop
  2. md5 绕过 — array数组 或者0e绕
  3. wakeup绕过 可以在用 str_replace 改值 在这变量多的 要注意定位精准点 不然改到其他的就可能导致错误
  4. 本题目 lt类中的destruct 的echo $this 触发了 tostring
  5. 对属性的修改 可以在 类中修改 再new 也可以 new了 再改属性

9.[UUCTF 2022 新生赛]ezpop !!

详细看 笔记!