当前位置:人工智能 > PHP反序列化-(web_php_unserialize)

PHP反序列化-(web_php_unserialize)

  • 发布:2023-10-10 21:48

问题内容

代码分析

可以明显看出这是一个PHP反序列化问题。首先判断当前GET参数“var”是否存在。如果存在,则经过Base64解码后
存储 $var 变量 .。如果不存在,则输出当前页面的源代码。对 $var 执行常规过滤。如果它通过了常规过滤器,则将其反转。序列化操作,
否则,响应提示消息

1。问题中给出了一个Demo类。三个魔法方法需要注意

  • __wakeup() 该方法是PHP反序列化时执行的第一个方法。 unserialize() 会首先检查 __wakeup() 方法是否存在。如果存在,就会先调用这个方法,提前准备好对象需要的东西。资源(如重新建立数据库连接,执行其他初始化操作等)
  • __construct() 与其他OOP(面向对象)语言类似,PHP中也有构造函数,带有构造函数的类会创建新对象每次之前都会调用这个方法。该方法常用于完成一些初始化工作
  • __destruct()析构函数方法。当对象的所有引用被删除或者对象被显式销毁时,析构函数将被执行。

2。 preg_match() 函数

解决问题的思路

本题中__wakeup()函数的作用是强制$file变量到index.php,而题目提示flag在fl4g.php中,所以这就涉及到另一个问题:如何绕过__wakeup( ) ?

我们知道,在unserialize执行之前,会调用wakeup函数。我们需要绕过它。 __wakeup() 中有一个缺陷。 __wakeup 在调用 unserilize() 之前触发,但如果对字符串进行反序列化,则对应当对象的属性个数发生变化时,反序列化会失败,__wakeup 会失效

后面对$var进行正则匹配,所以需要绕过正则表达式。先去掉正则匹配代码,实例化一个Demo对象,看看序列化后的字符串是什么样的

总结一下:

将 O:4 更改为 O:+4 以绕过正则表达式,将 :1: 更改为 :2: 以绕过 __wakeup 函数(只需大于 1)

构造Exp并获得flag

总结

基本功能

serialize():用于序列化对象或数组并返回字符串返回具有变量类型和值的字符串unserialize( )  :反序列化通过serialize()函数序列化的对象或数组,并返回原始对象结构

php中有一些函数不需要调用就可以执行。这个方法堪称神法

__construct(),类的构造函数 __destruct(),类的析构函数__打电话),在静态模式下调用不可访问的方法时调用 __callStatic(),调用__get (),获取类成员变量时调用 __set(),设置类成员变量时调用 __isset ( ) ,呼叫 isset()时(时呼叫  __取消设置() ,当对不可访问的属性调用 unset() 时调用。 __sleep(),执行serialize()时会首先调用此函数 功能 __唤醒( ),执行反序列化()时,这个函数__toString(),当类被视为字符串时响应方法 __invoke(),通过调用函数__set_state()调用对象时的响应方法,调用  var_export ()导出类时将调用此静态方法。 __clone(),对象复制完成时调用__autoload() ,尝试加载未定义的类__debugInfo(),打印所需的调试信息

相关文章