漏洞介绍
缓存写入功能调用了think\cache\driver\File
类的Set
方法,将获取的变量值写入runtime下的php文件,文件名为md5值,由于一般thinkphp将目录设置在public目录下,因此该漏洞需要配合文件包含或者错误安全配置导致php文件可直接访问到
漏洞演示
1 | http://localhost/?username=mochazz123%0d%0a@eval($_GET[_]);// |
漏洞分析
漏洞入口
通过thinkphp/helper.php
的input读取username变量,比如input(“get.username”)的话就是使用get方法读取username变量
然后在thinkphp/library/think/Cache.php
中实现think\cache\driver\File
类的实现和缓存,这里跟进set方法看看。
文件名和路径通过getCacheKey
方法获取runtime下的存储目录名(通过name生成的md5的前2位作为目录名),然后php缓存文件的文件名是md5值,如果$options['prefix']
有值的话,目录还要多一层。
回到set方法,获取到username的值之后就判断$options['data_compress']
是否为true,默认为false,因此数据直接就写入到前面生成的php缓存文件中了
攻击总结图
漏洞修复
在php标签中添加exit()执行php代码前退出。