POP 链分析 - 魔术方法
例题(NewStar_2025_小羊走迷宫):
源码+分析:
1 | <?php |
魔术方法
| 魔术方法 | 触发方法 |
|---|---|
| __construct(): | 当对象创建(new)时会自动调用。但在 unserialize() 时是不会自动调用的。(构造函数) |
| __destruct():1 | 当对象被销毁时会自动调用。(析构函数) |
| __wakeup(): | 使用unserialize时触发 |
| __sleep(): | 使用serialize时触发 |
| __call():1 | 在对象上下文中调用不可访问的方法时触发(不存在的方法) |
| __callStatic(): | 在静态上下文中调用不可访问的方法时触发 |
| __get(): | 用于从不可访问的属性读取数据 |
| __set():1 | 用于将数据写入不可访问的属性 |
| __isset(): | 在不可访问的属性上调用isset()或empty()触发 |
| __unset(): | 在不可访问的属性上使用unset()时触发 |
| __toString():1 | 把属性当作字符串使用时触发 |
| __invoke():1 | 当脚本尝试将对象调用为函数时触发 |
其中的
__toString触发的条件较多:
- echo (
$obj) / print($obj) 打印时会触发- 反序列化对象与字符串连接时
- 反序列化对象参与格式化字符串时
- 反序列化对象与字符串进行==比较时(PHP进行==比较的时候会转换参数类型)
- 反序列化对象参与格式化SQL语句,绑定参数时
- 反序列化对象在经过php字符串函数,如
strlen()、addslashes()时- 在in_array()方法中,第一个参数是反序列化对象,第二个参数的数组中有
toString返回的字符串的时候toString会被调用- 反序列化的对象作为class_exists()的参数的时候
1 | <?php |
payload:
1 | ?ma[ze.path=TzoxMDoic3RhcnRQb2ludCI6MTp7czo5OiJkaXJlY3Rpb24iO086MTI6IlNheVNvbWV0aGluZyI6MTp7czozOiJzdGgiO086ODoiVHJlYXN1cmUiOjI6e3M6NzoiACoAZG9vciI7TjtzOjg6IgAqAGNoZXN0IjtPOjg6IlRyZWFzdXJlIjoyOntzOjc6IgAqAGRvb3IiO086ODoiZW5kUG9pbnQiOjE6e3M6MTQ6IgBlbmRQb2ludABwYXRoIjtzOjMwOiJwaHA6Ly9maWx0ZXIvcmVzb3VyY2U9ZmxhZy5waHAiO31zOjg6IgAqAGNoZXN0IjtOO319fX0= |
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Echoin 的博客!