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

2019-03-3023:08:08WEB安全防护Comments3,281 views字数 1252阅读模式

0×00 背景

网站为了实现加速访问,会将用户访问过的页面存入缓存来减小数据库查询的开销。而Thinkphp5框架的缓存漏洞使得在缓存中注入代码成为可能。(漏洞详情见参考资料)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

本文将会详细讲解:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

1. 如何判断缓存漏洞存在的可能性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

2. 如何利用Thinkphp5的框架漏洞结合网站的一些配置实现前台getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

希望可以给予读者一些关于漏洞应用的启发。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

0×01 环境

测试环境

1.某基于搭建的论坛类测试网站文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

2.apache2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

3.php5.6及以上版本,相关php组件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

工具

 (github上的一个用python编写的网站路径扫描工具)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

0×02 实现

判断缓存漏洞存在的可能性

1.查看网页的cookie,发现存在thinkphp_show_page_trace字段,确定网页基于thinkphp框架。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

2.使用 dirsearch 扫描目标网站。python3 dirsearch.py -u site_ip_here -e php发现可以访问 cache目录,说明可能存在缓存漏洞。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

实施攻击

1.考虑到这是一个论坛类网站,尝试发帖注入缓存。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

2.这是最困难的一步,猜解缓存中的php文件名。根据框架实现,文件名是一个唯一字符串的md5码(此处的md5要用php的函数计算,测试发现和网上的一些在线平台计算结果不同)。考虑到论坛类网站有大量的帖子,需要用数据库存储,而帖子的索引应该为很有可能为id 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

再结合url的路径名,猜测为article_id文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

echo(md5(“article_52″));文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

12a51218427a2df68e54e8f4c8b10109文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

通过访问缓存成功getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

0×03 原理分析:

框架

在thinkphp框架中,/thinkphp/library/think/cache/driver/中定义了缓存的实现。其中,getCacheKey($name)函数实现了cache文件路径的计算,为获得缓存文件名称提供了可能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

而set()与get()函数以序列化对象的方式无过滤地实现了缓存数据的写入与读出,为代码注入缓存提供可能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

通过测试,可以发现帖子中的内容可以直接写入缓存文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

由于缓存文件是一个php文件,可以进行代码注入。在代码前加一个回车,使代码行独立于前面的注释行。再在末尾加上注释符号//,注释剩余内容。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

网页实现

在处理帖子的代码中,读取帖子首先查询cache文件,通过调用thinkphp5框架中的cache接口实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

利用Thinkphp 5缓存漏洞实现前台注入代码Getshell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

0×04 防御:

1. 从框架入手,在/thinkphp/library/think/cache/driver/ 中的set()函数中对于$value参数进行过滤,去除换行符号。(具体代码见参考资料)缺点: 可能会导致缓存文件在展示时文本布局的改变。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

2. 从网页实现入手,读取缓存时的使用的唯一索引可以设置的比较复杂,让攻击者无法猜到。如: 3ae282ad69314d68_article_id文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

3. 从服务器的配置入手,关闭从外部对于cache文件夹的直接访问。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

4. 从php的配置入手,关闭eval等危险函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/anquan/10947.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/anquan/10947.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定