前言
本篇文章专门用于记录做反序列化类题目的做题姿势,会不断更新。
反序列化考点
字符串逃逸
POP构造链
反序列化做题姿势
首先 正常创建类 有方法调用方法 总之要得到想要的内容
其次 对创建的类进行序列化 并打印出序列化的内容 需要绕过就更改里面的内容
最后 把序列化后的内容 进行提交 有需要编码 就进行编码
pop链构造做题姿势
phar反序列化的三个前提条件> 可以上传phar文件
有可以利用的魔术方法
文件操作函数的参数可控
1、找到可利用的地方,比如,文件包含,命令执行等地方
2、从可以利用地方回溯到可控制的地方,找到一个链条。
3、更改属性内容,先进行序列化,看看能不能达到目的。
4、能够达到目的,才进行反序列化,进行提交 有需要编码 就进行编码
魔法方法
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:
1. __construct(),类的构造函数
2. __destruct(),类的析构函数
3. __call(),在对象中调用一个不可访问方法时调用
4. __callStatic(),用静态方式中调用一个不可访问方法时调用
5. __get(),获得一个类的成员变量时调用
6. __set(),设置一个类的成员变量时调用
7. __isset(),当对不可访问属性调用isset()或empty()时调用
8. __unset(),当对不可访问属性调用unset()时被调用。
9. __sleep(),执行serialize()时,先会调用这个函数
10. __wakeup(),执行unserialize()时,先会调用这个函数
11. __toString(),类被当成字符串时的回应方法
12. __invoke(),调用函数的方式调用一个对象时的回应方法
13. __set_state(),调用var_export()导出类时,此静态方法会被调用。
14. __clone(),当对象复制完成时调用
15. __autoload(),尝试加载未定义的类
16. __debugInfo(),打印所需调试信息
phar反序列化利用
可以代替unserialize 进行反序列化操作的函数
1 | fileatime |
注意:生成phar文件//生成phar文件前需要配置php.ini
1 | [Phar] |
创建对象 exp.phar 是文件名
1 | $phar = new Phar('exp.phar'); |
特性
在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞
绕过_wakeup魔法方法绕过方法:只需要将对象属性数量设置比原本的要大即可
利用php>7.1版本对类属性的检测不严格(对属性类型不敏感)
意味着 序列化的时候可以将portected属性换成public属性
1 | Private 权限 |
绕过字符过滤
s 换成 S 属性值就可以为十六进制