网站首页 > 技术文章 正文
ThinkPHP最新版6.0.13 0day利用链分析
0x01 ThinkPHP版本梳理
截止到2022年10月17日,6.0.x系列最新版是V6.0.13(2022年07月15日发布)
截止到2022年10月17日,5.1.x系列最新版是V5.1.41(2021年01月12日发布)
截止到2022年10月17日,5.0.x系列最新版是V5.0.24(2019年01月11日发布)
作者在2019年02月14日发布V5.2 RC1后,没有再发布过V5.2系列,而是在2019年04月22日发布V6.0.0 RC2,有理由怀疑V6.0系列接替了V5.2系列
thinkphp6及以上,安装需要使用composer
0x02 Mac下PHP集成环境踩坑
php集成环境,之前在windows下用phpstudy,自从换了mac,什么都要重新来。。
首选使用破解版MAMP Pro,但我这边下载后安装报错(后经查阅,安装破解版MAMP Pro可能需要关闭SIP,SIP即macOS的一种保护机制),不想关闭SIP,放弃这个方案,也试过MAMP免费版,但不支持切换php版本,这个不能忍,尝试phpstudy mac版,发现phpstudy mac版支持切换php版本,其他功能界面也和phpstudy windows版基本一致,就用它了
具体使用phpstudy mac版后发现,启动phpstudy mac版内置的php解释器报错,提示找不到redis.so库,在php.ini中注释掉redis.so库可解决此提醒,but,使用phpstudy内置的php下载composer时又报错,提示缺少openssl库,此时需要自己编译openssl库,太麻烦了,干脆换一个php集成环境吧,找来找去,发现MAMP免费版也可以切换php版本(需要一个小技巧,后面会提到),下载后尝试用内置的php下载安装composer,成功安装composer,OK,就用它了
mamp免费版切换php版本技巧,进入mamp下php安装目录,由于mamp默认显示最新的2个版本,所以可将其他版本改个名字来切换版本,如下图
0x03 Mac下ThinkPHP调试环境踩坑
php开发环境,使用phpstorm 2021.1.4,破解方式参考:https://ybdt.me/2022/01/13/如何放心的白嫖四大主流语言IDE/
安装composer,参考:https://getcomposer.org/download/
在mamp的对应php目录下安装composer后,然后创建到/usr/local/bin的软连接
|
|
创建上述软连接后,可从任意位置执行composer及php
安装指定版本的thinkphp框架
|
|
我这边composer版本是2.2.18,不是最新版2.4.3,想使用composer安装thinkphp6的最新版6.0.13会提示找不到,可是php7.1安装composer最高版本只能是2.2.18,于是改用php7.4安装composer,成功安装到composer 2.4.3,再用composer 2.4.3安装thinkphp 6.0.13,成功安装,真是一波三折,如下图
php调试环境,mac下想安装xdebug需要先通过homebrew安装php,然后通过pecl安装xdebug,可是这样只能安装php版本对应的xdebug,不能安装指定版本的xdebug,可从https://xdebug.org/wizard查询,当前php版本需要哪个版本的xdebug,结果按照指令安装的时候,发现缺少phpize,官方文档并没有讲述mac下缺少phpize该如何安装,google后发现可能需要编译安装,太麻烦了,想想别的办法,猛地发现,mamp的如下目录自带了编译好的xdebug
|
|
不得不说,集成环境真香~
修改php.ini,增加如下
|
|
Phpstorm配置过程参见:https://juejin.cn/post/6934614190548221960
配置好后,如下图启动
能看到网页访问停在了断点处
程序执行停在了断点处
0x04 PHP反序列化漏洞及POP链复习
PHP反序列化漏洞原理:服务端在处理用户传入的序列化数据时,需要调用unserialize(),php中调用unserialize()会触发魔法方法__wakekup()、__destruct(),如果魔法方法中包含了危险函数或间接包含危险函数,则攻击者可构造恶意的序列化数据,在服务端反序列化的时候造成危险函数的执行,
PHP反序列化POP链原理:由于类反序列化后只包含属性不包含方法,也就是说我们构造的序列化数据只能操纵类的属性,不能操纵方法,只能通过自动调用魔法方法来调用方法,这个时候如果魔法方法中不是直接包含危险函数,就需要向上回溯,一层一层跟踪,也就是所谓的POP链,通常是寻找包含危险函数的同名方法、或者更复杂的,触发各种魔法方法,最终调用危险函数
详细讲解可参考:
https://johnfrod.top/安全/php反序列化漏洞总结/
https://www.cnblogs.com/bmjoker/p/13742666.html
如下是一个存在反序列化漏洞的文件vuln1.php
|
|
由上述Demo可知,如果构造一个Demo类,里面实例化的是类Evil,反序列化时自动调用__destruct(),__destruct()中调用action(),action()中调用危险函数eval,则最终导致代码执行,同时不要忘记将恶意代码赋值给$test2,payload如下
|
|
将上述序列化的输出传给vuln1.php,执行结果如下图
0x05 ThinkPHP框架复习
网站搭建好后,我们会访问:http://localhost:8888/tp6.0.13/public/index.php,其实这里的index.php并不是访问的内容,而是一个类似路由的文件,会请求分发到app/controller/Index.php中的方法index,可以看到其内容也是首页中出现的内容
我们对方法index做个修改
可以看到,首页内容也发生了修改
其实访问http://localhost:8888/tp6.0.13/public/index.php相当于访问http://localhost:8888/tp6.0.13/public/index.php/Index/index,只不过不加的时候,类Index和方法index是作为默认值,如果要访问其他方法,改为其他方法即可
详细讲解可参考:
https://www.kancloud.cn/manual/thinkphp6_0/1037485
https://www.kancloud.cn/manual/thinkphp6_0/1037494
0x06 ThinkPHP最新版6.0.13 0day利用链分析
截止到2022年10月17日,thinkphp 6.0.x系列最新版是V6.0.13(2022年07月15日发布),08月14日有人提交了一个反序列化利用链,是一个目前尚未修复的0day,下面对它进行一波分析
先用如下poc打一遍
|
|
传入payload,如下图
根据poc可以看到漏洞代码出现在
这种框架向上回溯太麻烦了,采用poc+动态debug进行分析,基于之前的thinkphp框架复习,我们在vuln方法中加入漏洞代码,并在反序列化处打上断点,如下图
此处是反序列化入口__destruct(),如下图
一步一步跟进,跟进到下图所示的语句,可以看到此时autosave值为false,进入save()
继续跟踪,最终跟到触达代码执行的地方
from https://ybdt.me/
猜你喜欢
- 2024-09-14 Argo工作流可替代Cloud Composer(apache 工作流引擎)
- 2024-09-14 苹果正式为iPhone和iPad发布AR建模应用Reality Composer
- 2024-09-14 composer工作原理与实践(composer教程)
- 2024-09-14 PHP程序员必须知道的依赖管理工具Composer
- 2024-09-14 深入学习Composer原理(一)(composer教程)
- 2024-09-14 composer的主要应用(composer软件简介干嘛的)
- 2024-09-14 Ubuntu/Kali简洁高效安装最新版的docker-compose
- 2024-09-14 干货 | 如何在Avid Media Composer剪辑Cinema RAW Light素材?
- 2024-09-14 Voyager - 不容错过的 Laravel 管理后台
- 2024-09-14 深入解读PHP包管理器Composer实现原理
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 480℃启用MySQL查询缓存(mysql8.0查询缓存)
- 460℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 440℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)