利用Thinkphp 5缓存漏洞实现Getshell前端代码注入
0×00背景
为了加快访问速度,网站对用户访问的页面进行缓存,以减少搜索数据库的成本。 Thinkphp5 框架中的缓存漏洞允许代码注入缓存。 (漏洞详情请参见参考资料)
本文将详细讲解:
1。如何评估缓存漏洞的可能性
2。如何利用Thinkphp5框架漏洞结合一些网站配置实现gethell前端
希望能给读者一些利用漏洞的启发。 ?
(github上用python编写的网站路径扫描工具)
0×02实现
确定缓存漏洞的可能性
1.检查网站的cookie,看到thinkphp_show_page_trace字段存在,确认该网站是基于thinkphp框架的。
![]()
2。使用dirsearch扫描目标网页。 python3 dirsearch.py -u site_ip_here -e php 发现缓存目录可访问,说明可能存在缓存漏洞。
![]()
攻击的实现
1.由于这是一个论坛类型的网站,请尝试通过发帖方式添加缓存。
![]()
2。这是最难的一步,猜测缓存中php文件的名称。根据框架的实现,md5文件名是一个唯一的字符串代码(这里md5需要通过PHP函数计算,测试发现计算结果与网上一些平台不同)。由于论坛网站有大量的帖子,因此必须将它们存储在数据库中,并且帖子索引很可能应该是id。
结合URL路径名,假设为article_id
echo(md5(“article_52″));
12a51218427a2df64c1b09成功访问缓存
![]()
0 ×03原理分析: 框架
在 thinkphp 中,缓存实现定义在 /thinkphp/library/think/cache/driver/ 中。其中,getCacheKey($name)函数实现了缓存文件路径的计算,使得获取缓存文件的名称成为可能。
![]()
set() 和 get() 函数以序列化对象的形式从缓冲区写入和读取数据,而不进行过滤,这允许将代码插入到缓冲区中。
![]()
![]()
测试表明帖子内容可以直接写入缓冲区。
![]()
由于缓存文件是php文件,因此可以嵌入代码。在代码前添加回车符,使该行代码独立于前面的注释行。然后在末尾添加注释符号//,将剩余内容注释掉。
网站实现
在后处理代码中,阅读帖子首先查询缓存文件,这是通过调用thinkphp5内部的缓存接口来实现的。
![]()
0×04 防御:
1。从框架开始,过滤/thinkphp/library/think/cache/driver/中set()函数中的$value参数,去除换行符号。 (具体代码参见参考资料) 缺点:可能会导致缓存文件文本布局在显示时发生变化。
2。从网页实现开始,读取缓存时使用的唯一索引可以做得更复杂,让攻击者无法猜测。例如:3ae282ad69314d68_article_id
3。从服务器配置开始,并禁止从外部直接访问缓存文件夹。
4。从 PHP 配置开始并禁用 eval 等危险函数。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
