46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性

2024-03-02 20:12

本文主要是介绍46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 几种常用的魔术方法
      • 1、__destruct()
      • 2、__tostring()
      • 3、__call()
      • 4、__get()
      • 5、__set()
      • 6、__sleep()
      • 7、__wakeup()
      • 8、__isset()
      • 9、__unset()
      • 9、__invoke()
    • 三种变量属性
    • 极客2019 PHP
    • php原生类

几种常用的魔术方法

1、__destruct()

当删除一个对象或对象操作终止时被调用,其最主要的作用是拿来做垃圾回收机制。当对象销毁时会调用此方法,对象销毁:1.用户主动销毁对象,使用unset()函数;2.当程序结束时由引擎自动销毁。
在这里插入图片描述

2、__tostring()

在对象当作字符串的时候会被调用。但是需要注意的是,执行完__toString()之后,会有返回值。
在这里插入图片描述

3、__call()

调用某个方法,若方法存在,则直接调用;若不存在,则会调用__call()方法。
在这里插入图片描述

4、__get()

读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get()魔术方法。
在这里插入图片描述

5、__set()

设置一个对象的属性时,若属性存在,则直接赋值;若属性不存在或者无法访问(私有)的属性时,则会调用__set()函数。

__set($name, $value)

  • 用来为私有成员属性设置属性值;
  • 第一个参数为需要设置值多的属性名,第二个参数为需要设置的属性值,__set方法没有返回值。

在这里插入图片描述

6、__sleep()

serialize()之前被调用,可以指定要序列化的对象属性。
在这里插入图片描述

7、__wakeup()

反序列化恢复对象之前调用该方法,也就是使用unserialize()之前会先调用__wakeup()
在这里插入图片描述

var_dump会输出反序列化内容。

8、__isset()

检测对象的某个属性是否存在时执行该函数,当对不可访问属性调用isset()empty()时,触发__isset()
在这里插入图片描述

9、__unset()

在不可访问的属性上使用unset()时触发, 或销毁对象的某个属性时执行此函数。
在这里插入图片描述

  • unset()函数不仅触发__unset(),而且会触发__destruct()
  • 三种对象变量属性:
    • public:在本类内部、外部类、子类中都可以访问;
    • protected:只在本类或子类或父类中可以访问;
    • private:在本类内部可以访问。
  • 序列化数据显示:
    • private属性序列的时候格式是%00类名%00成员名
    • protected属性序列的时候格式是%00*%00成员名
  • 使用new是创建外部类(测试类),子类是通过继承extends父类得到的。

9、__invoke()

当调用函数的方式调用一个对象时触发。
在这里插入图片描述

三种变量属性

  • 三种对象变量属性:
    • public:在本类内部、外部类、子类中都可以访问;
    • protected:只在本类或子类或父类中可以访问;
    • private:在本类内部可以访问。
  • 序列化数据显示:
    • private属性序列的时候格式是%00类名%00成员名
    • protected属性序列的时候格式是%00*%00成员名

在这里插入图片描述

极客2019 PHP

反序列化利用大概分为三类:

  • 魔术方法的调用逻辑,如触发条件;
  • 语言原生类的调用逻辑,如SoapClient
  • 语言自身的安全缺陷,如CVE-2016-7124.

首先,通过目录扫描可以发现网站源码保存在www.zip中(这里就不作叙述);
index.php中包含flag.php,并且接收select传参,并且对传参内容进行反序列化。

在这里插入图片描述
flag.php中存在一个className,而且flag在__destruct()魔术方法中,有两种方式触发__destruct()魔术方法:1.用户主动销毁对象,使用unset()函数;2.当程序结束时由引擎自动销毁。也就是说,当程序执行完,必定会触发__destruct()魔术方法。因此,我们只需要满足__destruct()魔术方法中的两个条件:username=admin&password=100。由于__wakeup()的存在,使得index.php中的unserialize执行之前,就会自动触发__wakeup()
故获取flag的关键在于:绕过__wakeup()。这里可以使用CVE-2016-7124进行绕过__wakeup()CVE-2016-7124:对象中的属性个数超过实际属性个数会绕过__wakeup()

class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die(); }}
}

2改为3,即可获取flag。
在这里插入图片描述

php原生类

php原生类
在这里插入图片描述

  1. PHP有哪些原生类

    //查找PHP所有原生类
    <?php
    $classes = get_declared_classes();
    foreach ($classes as $class) {$methods = get_class_methods($class);foreach ($methods as $method) {if (in_array($method, array('__destruct','__toString','__wakeup','__call','__callStatic','__get','__set','__isset','__unset','__invoke','__set_state'))) {print $class . '::' . $method . "\n";}}
    } 
    
  2. 常见使用的原生类
    浅析PHP原生类

  3. 配合官方文档利用php原生类

  4. 反序列化字符逃逸
    [安恒月赛]反序列化字符逃逸

这篇关于46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767296

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)