漏洞介绍
缓存写入功能调用了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代码前退出。
