Code前端首页关于Code前端联系我们

利用Thinkphp 5缓存漏洞实现Getshell前端代码注入

terry 2年前 (2023-09-28) 阅读数 97 #Web安全

0×00背景

为了加快访问速度,网站对用户访问的页面进行缓存,以减少搜索数据库的成本。 Thinkphp5 框架中的缓存漏洞允许代码注入缓存。 (漏洞详情请参见参考资料)

本文将详细讲解:

1。如何评估缓存漏洞的可能性

2。如何利用Thinkphp5框架漏洞结合一些网站配置实现gethell前端

希望能给读者一些利用漏洞的启发。 ?

(github上用python编写的网站路径扫描工具)

0×02实现

确定缓存漏洞的可能性

1.检查网站的cookie,看到thinkphp_show_page_trace字段存在,确认该网站是基于thinkphp框架的。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

2。使用dirsearch扫描目标网页。 python3 dirsearch.py​​ ​​​​​​​​-u site_ip_here -e php 发现缓存目录可访问,说明可能存在缓存漏洞。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

攻击的实现

1.由于这是一个论坛类型的网站,请尝试通过发帖方式添加缓存。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

2。这是最难的一步,猜测缓存中php文件的名称。根据框架的实现,md5文件名是一个唯一的字符串代码(这里md5需要通过PHP函数计算,测试发现计算结果与网上一些平台不同)。由于论坛网站有大量的帖子,因此必须将它们存储在数据库中,并且帖子索引很可能应该是id。

结合URL路径名,假设为article_id

echo(md5(“article_52″));

12a51218427a2df64c1b09成功访问缓存

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

0 ×03原理分析: 框架

在 thinkphp 中,缓存实现定义在 /thinkphp/library/think/cache/driver/ 中。其中,getCacheKey($name)函数实现了缓存文件路径的计算,使得获取缓存文件的名称成为可能。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

set() 和 get() 函数以序列化对象的形式从缓冲区写入和读取数据,而不进行过滤,这允许将代码插入到缓冲区中。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

测试表明帖子内容可以直接写入缓冲区。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

由于缓存文件是php文件,因此可以嵌入代码。在代码前添加回车符,使该行代码独立于前面的注释行。然后在末尾添加注释符号//,将剩余内容注释掉。

网站实现

在后处理代码中,阅读帖子首先查询缓存文件,这是通过调用thinkphp5内部的缓存接口来实现的。

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell

0×04 防御:

1。从框架开始,过滤/thinkphp/library/think/cache/driver/中set()函数中的$value参数,去除换行符号。 (具体代码参见参考资料) 缺点:可能会导致缓存文件文本布局在显示时发生变化。

2。从网页实现开始,读取缓存时使用的唯一索引可以做得更复杂,让攻击者无法猜测。例如:3ae282ad69314d68_article_id

3。从服务器配置开始,并禁止从外部直接访问缓存文件夹。

4。从 PHP 配置开始并禁用 eval 等危险函数。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门