类与序列化及其相关函数绕过

类:

在CTF题中PHP类经常与序列化一起出现
类被实例化后叫做对象 (实例化就是 new 类名() )
类中的变量叫做属性
类中的函数叫做方法
属性和方法在类中可用$this->名称  调用

类中的属性与方法分为以下三种类型:

  • public:公开的 , 任何地方都可以访问
  • protected:受保护的 , 类内自身 , 其子类和父类可以访问
  • private:私有的 , 类内自身可访问

PHP 7.x版本中对类型不敏感

PHP中类中默认公有,C++中类中默认私有

序列化和类有关函数:

什么是序列化:

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

相关函数:

serialize()    //序列化
__wakeup()    //在反序列化之后立即被调用 (有时要绕过)
__sleep()    //在序列化前被调用
___destrust    //在对象被销毁时被调用
___construct  //在对象创建前调用(new一个对象的时候执行,反序列化的时候不执行)
unserialize()    //反序列化
unserialize函数,实际上以下面的流程执行:

 1.  根据序列化形式,进行反序列化操作,直接转换成对应类的一个临时对象。(这里是Bsides类)

注意:这里系统执行时不会认为创建了一个新对象,而是一个已有的对象,所以不会执行__construct魔术方法(该方法只有在创建了新对象的时候才会执行)
2.  如果有赋值,把这个临时对象赋给另一个变量进行管理,那么该临时对象由于被接收所以不会被销毁(应该是变量指向了这个对象的地址),然后该对象由该变量管理,并且在程序正常结束之后被销毁(此时会执行__destruct魔术方法!)

3.如果没有赋值,临时对象在产生之后被销毁(此时会执行__destruct魔术方法)

将类序列化:

不同类别的属性序列化后的区别:

  • private类型的属性序列化后,括号内变量名前要加 %00(classname)%00
  • protected类型的属性序列化后,括号内变量名前加 %00*%00

php7.x版本可忽略

例子:

<?php 
class Name{ 
   private $username = 'admin'; 
   public $password = '100'; 
}
 $a=new Name(); 
 echo serialize($a); 
?>

序列化结果为:

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

__wakeup()函数绕过:

在某些时候我们需要绕过反序列化时的_wakeup()函数,而去直接执行_destrust函数

将序列化变量数改为大于真实变量数即可绕过
例如:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

该序列化字符串里有两个变量,将2改为大于的任意数字,使它无法完成反序列化,从而绕过_wakeup

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";

注意:为什么无法反序列化,但仍可以执行对象里面的_destrust函数呢?

unserialize函数反序列化代码的过程大概如下:

  • 获取反序列化字符串–>根据类型进行反序列化—>查表找到对应的反序列化类–>根据字符串判断元素个数–>new出新实例–>迭代解析化剩下的字符串–>判断是否具有魔法函数__wakeup并标记—>释放空间并判断是否具有具有标记—>开启调用。
  • 根据上面的流程,我们可以发现,这个过程中是逐步对对象做解析的,而且解析过程中会同时去根据相应的魔法函数标记去调用魔法函数,所以说,即使完整的反序列化最终失败了,但在这个过程中涉及到的对象仍然是可以正常出发魔法函数的调用的。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
©2023 By Elite

冀公网安备 13108202000889号

| 鲁ICP备2023011162号

声明:本站中用到的所有图片图标,均来源网络,如有侵权请及时联系删除
Theme Argon