利用Thinkphp 5缓存漏洞实现前台Getshell
0×00 背景
网站为了实现加速访问,会将用户访问过的页面存入缓存来减小数据库查询的开销。而Thinkphp5框架的缓存漏洞使得在缓存中注入代码成为可能。(漏洞详情见参考资料)
本文将会详细讲解:
1. 如何判断缓存漏洞存在的可能性
2. 如何利用Thinkphp5的框架漏洞结合网站的一些配置实现前台getshell
希望可以给予读者一些关于漏洞应用的启发。
0×01 环境
测试环境
1.某基于Thinkphp5.0.10搭建的论坛类测试网站
2.apache2
3.php5.6及以上版本,相关php组件
4.mysql
工具
1.dirsearch (github上的一个用python编写的网站路径扫描工具)
0×02 实现
判断缓存漏洞存在的可能性
1.查看网页的cookie,发现存在thinkphp_show_page_trace字段,确定网页基于thinkphp框架。
2.使用 dirsearch 扫描目标网站。python3 dirsearch.py -u site_ip_here -e php
发现可以访问 cache目录,说明可能存在缓存漏洞。
实施攻击
1.考虑到这是一个论坛类网站,尝试发帖注入缓存。
2.这是最困难的一步,猜解缓存中的php文件名。根据框架实现,文件名是一个唯一字符串的md5码(此处的md5要用php的函数计算,测试发现和网上的一些在线平台计算结果不同)。考虑到论坛类网站有大量的帖子,需要用数据库存储,而帖子的索引应该为很有可能为id 。
再结合url的路径名,猜测为article_id
echo(md5(“article_52″));
12a51218427a2df68e54e8f4c8b10109
通过访问缓存成功getshell
0×03 原理分析:
框架
在thinkphp框架中,/thinkphp/library/think/cache/driver/File.php中定义了缓存的实现。其中,getCacheKey($name)函数实现了cache文件路径的计算,为获得缓存文件名称提供了可能。
而set()与get()函数以序列化对象的方式无过滤地实现了缓存数据的写入与读出,为代码注入缓存提供可能。
通过测试,可以发现帖子中的内容可以直接写入缓存文件。
由于缓存文件是一个php文件,可以进行代码注入。在代码前加一个回车,使代码行独立于前面的注释行。再在末尾加上注释符号//,注释剩余内容。
网页实现
在处理帖子的代码中,读取帖子首先查询cache文件,通过调用thinkphp5框架中的cache接口实现。
0×04 防御:
1. 从框架入手,在/thinkphp/library/think/cache/driver/File.php 中的set()函数中对于$value参数进行过滤,去除换行符号。(具体代码见参考资料)缺点: 可能会导致缓存文件在展示时文本布局的改变。
2. 从网页实现入手,读取缓存时的使用的唯一索引可以设置的比较复杂,让攻击者无法猜到。如: 3ae282ad69314d68_article_id
3. 从服务器的配置入手,关闭从外部对于cache文件夹的直接访问。
4. 从php的配置入手,关闭eval等危险函数。
0×05 参考资料:
利用Thinkphp 5缓存漏洞实现前台Getshell的更多相关文章
- ThinkPhp3.2.3缓存漏洞复现以及修复建议
小编作为一个php(拍黄片)的程序员,今天早上无意间看到thinkphp的缓存漏洞,小编在实际开发过程中用thinkphp3.2.3挺多的. 我们这里来复现一下漏洞 后面我会提出修复建议 首先我们下载 ...
- Typecho反序列化导致前台 getshell 漏洞复现
Typecho反序列化导致前台 getshell 漏洞复现 漏洞描述: Typecho是一款快速建博客的程序,外观简洁,应用广泛.这次的漏洞通过install.php安装程序页面的反序列化函数,造成了 ...
- PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)
PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在 ...
- phpcms2008网站漏洞如何修复 远程代码写入缓存漏洞利用
SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客 ...
- 网站安全检测 漏洞检测 对thinkphp通杀漏洞利用与修复建议
thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站,为什么会这么深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于开发php架构,很多第三方的插件以及第三 ...
- ShopEX 4.8.5.81822 前台Getshell
ShopEX 4.8.5.81822 前台Getshell 作者:unhonker 发布:2014-06-23 00:12 分类:漏洞公布 被撸:8,179次 抢沙发 利用方式 ...
- PHP7CMS 无条件前台GETSHELL
PHP7CMS 无条件前台GETSHELL Version:2018-10-09 //最新版中以修复此漏洞 这个漏洞很简单,如果作者在写代码的时候考虑到一点点安全方面,其实都可以避免的. 01 0 ...
- ThinkPHP的缓存技术
原文:ThinkPHP的缓存技术 如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷.假如我们 把读取数据的过程分为三个层,第一个 ...
- thinkphp远程执行漏洞的本地复现
thinkphp远程执行漏洞的本地复现 0X00漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以 ...
随机推荐
- virtual 三种用法
virtual用法一 #include using namespace std;class A{public: virtual void display(){ cout<<& ...
- PHP smarty模版引擎基本安装
环境: PHP5.2 以上版本 先去官网下载smarty模版引擎的库文件到你的电脑或服务器上 smarty官方网站库文件下载地址: https://www.smarty.net/download 下 ...
- Leetcode 475.供暖气
供暖气 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径. 所以,你的输入将会是房屋和供暖器 ...
- /mnt/sdcard 是什么东西
关于/mnt/sdcard和sdcard的区别,可以这样理解:其实,安卓系统是从Linux而衍生出来的,而mnt是unix/Linux传统系统下挂载外部设备的专用目录,Linux默认挂载外部设备都会挂 ...
- 【转】Linux多命令顺序执行连接符(; || && |)
当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果.下面我们总结一下,加以区分. (1) ; 分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的 ...
- C#发送邮件异常,返回信息乱码
发邮件时出现了异常: 在 System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response) 在 ...
- iOS学习笔记32-iCloud入门
一.iCloud云服务 iCloud是苹果提供的云端服务,用户可以将通讯录.备忘录.邮件.照片.音乐.视频等备份到云服务器并在各个苹果设备间直接进行共享而无需关心数据同步问题,甚至即使你的设备丢失后在 ...
- HDU-3315 My Brute
先对于每种可能的PK情况进行判断胜负,然后求最小改动最大匹配. #include <cstdlib> #include <cstdio> #include <cstrin ...
- 解决v-for产生的警告的办法
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略.如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且 ...
- BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)
LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Orig ...