笔记里直接复制出来的
 
1 composer直接获取框架代码
 
➜  composer create-project --prefer-dist topthink/think tp5137
➜  cd tp5137
➜  vim composer.json # 把"topthink/framework": "5.1.*"改成"topthink/framework": "5.1.37"
➜  composer update
 
2 反序列化的利用点
  • 有一个内容完全可控的反序列化点,例如: unserialize(可控变量)
  • 存在文件上传、文件名完全可控、使用了文件操作函数,例如: file_exists('phar://恶意文件')
 
 
3 反序列化链
3.0 存在反序列化的点,寻找有__desctruct方法的类,在对象析构时会自动执行其中的代码
 
3.1 在 think\process\pipes\Windows 类的 __destruct 方法中调用了$this->removeFiles();
 
3.2 在$this->removeFiles() 中调用了file_exists($filename)
 
3.3 file_exists()需要字符串类型参数,在执行file_exists($filename)时会触发类的__toString()
 
3.4 全局搜索__toString(),寻找可利用的__toString(),找到think\model\concern\Conversion
__toString 内调用了$this->toJson(),toJson()内调用了json_encode($this->toArray(), $options);
 
3.5 Conversion类内,在$this->toArray()中,存在$relation->visible($name),$relation 和 $name来自$this,可控
 
3.6 寻找有visible方法和__call方法的类,找到了think\Request 类,其中有__call,会执行array_unishift($args, $this);
call_user_func_array($this->hook[$method], $args);
 
同时 think\Request 类的 input 方法经常是链中一个非常棒的 Gadget ,相当于 call_user_func($filter,$data) ,但是由于array_unishift在参数数组开头插入了一个对象,需要找一个调用input方法,并且第一个参数可控的函数传入Request对象
 
3.7 找到$this->param 调用了input方法,找到isAjax 和 isPjax 方法调用了$this->param 并且第一个参数可控,构造完成
 
 
 
 
 
 
 
 
 
 
 
 

ThinkPHP5.1 反序列化利用链的更多相关文章

  1. Apache Common-collection 反序列化利用链解析--TransformedMap链

    Apache Common-collection 反序列化利用链解析 TransformedMap链 参考Java反序列化漏洞分析 - ssooking - 博客园 (cnblogs.com) poc ...

  2. JDK原生反序列化利用链7u21

    前言 JDK 7u21以前只粗略的扫过一眼,一看使用了AnnotationInvocationHandler,就以为还是和 CC1 一样差不多的利用方式,但最近仔细看了下利用链发现事情并不简单- 7u ...

  3. commons-collections利用链学习总结

    目录 1 基础 ConstantTransformer InvokeTransformer ChainedTransformer LazyMap TiedMapEntry TransformingCo ...

  4. FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链

    0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...

  5. fastjson反序列化-JdbcRowSetImpl利用链

    fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...

  6. CommonsCollections1 反序列化利用链分析

    InvokerTransformer 首先来看 commons-collections-3.1-sources.jar!\org\apache\commons\collections\functors ...

  7. TemplatesImpl利用链

    FastJson利用链 Fastjson的版本在1.2.22-1.2.24主要有两条链利用TemplatsImpl和JdbcRowSetImpl利用链先来学习TemplatsImpl利用链,这个与前面 ...

  8. Fastjson JdbcRowSetImpl利用链学习

    JdbcRowSetImpl 接着继续学习fastjson的第二条链JdbcRowSetImpl,主要是利用jndi注入达到的攻击,而且没有什么利用限制,而且其原理就是setter的自动调用,具体se ...

  9. 深入剖析CVE-2021-40444-Cabless利用链

    背景 CVE-2021-40444为微软MHTML远程命令执行漏洞,攻击者可通过传播Microsoft Office文档,诱导目标点击文档从而在目标机器上执行任意代码.该漏洞最初的利用思路是使用下载c ...

随机推荐

  1. kubernetes垃圾回收器GarbageCollector Controller源码分析(二)

    kubernetes版本:1.13.2 接上一节:kubernetes垃圾回收器GarbageCollector Controller源码分析(一) 主要步骤 GarbageCollector Con ...

  2. 【Java】获取当前操作系统桌面路径

    //当前用户桌面 File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory(); String desktopPat ...

  3. Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别

    XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...

  4. 从0开始学FreeRTOS-(消息队列)-5

    ## 问题解答 曾经有人问我,FreeRTOS那么多API,到底怎么记住呢? 我想说,其实API不难记,就是有点难找,因为FreeRTOS的API很多都是带参宏,所以跳来跳去的比较麻烦,而且注释也很多 ...

  5. 自学导航页(待续ing)

    1 博客导航1.1 linuxlinux全线教程–提供了linux教程,服务器管理教程,BSD教程,还有编程语言(C/Java/Python/Perl),以及网络等全栈学习教程 1.2 存储技术NoS ...

  6. parse_args(argsparse):python和命令行之间的交互

    初始化 假设我们创建一个“argp.py”的文件. import argparse # 引入模块 # 建立解析对象 parser = argparse.ArgumentParser() parser. ...

  7. 合并果子(STL优先队列)

    STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...

  8. R-plotly|交互式甘特图(Gantt chart)-项目管理/学习计划

    本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/CGz51qOjFSJ4Wx_qOMzjiw 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号 ...

  9. 机器学习:IB1算法的weka源码详细解析(1NN)

    机器学习的1NN最近邻算法,在weka里叫IB1,是因为Instance Base  1 ,也就是只基于一个最近邻的实例的惰性学习算法. 下面总结一下,weka中对IB1源码的学习总结. 首先需要把 ...

  10. spring源码系列7:Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别

    概念 Bean创建过程中的"实例化"与"初始化"名词 实例化(Instantiation): 要生成对象, 对象还未生成. 初始化(Initialization ...