PHP反序列化的一些招式总结
最近刷题我个人遇见的一些php反序列化的题型,都很有意思,也值得加深学习,可能说明的不详细不充分不清晰,有些点没点到,还请各位大佬多多指点qwq
weakup()绕过
php的特性,当序列化后对象的参数列表中成员个数和实际个数不符合时会绕过 __weakup();
如:p=O:6:“HaHaHa”:**2**:{s:5:“admin”;s:5:“admin”;s:6:“passwd”;s:4:“wllm”;}
一般做CTF题目时绕过的方法就是:先序列化字符串,然后使序列化后字符串中属性的个数大于真实对象中属性的个数,即可绕过__wakeup 。
则改为p=O:6:“HaHaHa”:**3**:{s:5:“admin”;s:5:“admin”;s:6:“passwd”;s:4:“wllm”;}
弱比较
在==弱比较中,可以用true来绕过,比如
1 | |
在判断username和passwd时使用了==的弱比较,只要让username和passwd为true即可
则反序列化中username和passwd的值应该为b:1
1 | |
还有一种弱比较,2==”2”。如
1 | |
在这之中,process判断op==”2”,而在__destruct中判断op===”2”,我们要让op进入process那个op==”2”中,不受
__destruct中将2改为1,则我们要利用强比较和弱比较,我们应该反序列化数字2来绕过
如果是
1 | |
则会调用__destruct
如果是
1 | |
则不会调用到__destruct中的if判断,来达到实现process中read()
属性比较不严谨绕过
属性序列化可以参考本文章
【PHP】反序列化漏洞(又名“PHP对象注入”)_对象注入 unserialize() 函数进行攻击-CSDN博客
PHP 7.0以上的版本对属性的类型不严格
在定义的protected属性中,如
1 | |
但是我们反序列化时可以用public属性来写入,相当于public的值赋给protected
protected反序列化后,会出现%00标记无法出现,要在’*‘两侧补上%00
1 | |
然后改为public
1 | |
private属性反序列化
例如
1 | |
我们反序列化后为
1 | |
但是private格式要在变量名前添加标记%00(classname)%00
则我们最终payload是
1 | |
- Title: PHP反序列化的一些招式总结
- Author: lzz0403
- Created at : 2024-12-05 00:00:00
- Updated at : 2026-05-03 12:19:02
- Link: https://www.cnup.top/2024/12/05/PHP反序列化的一些招式总结/
- License: This work is licensed under CC BY-NC-SA 4.0.