狗哥说要五个案例证明。。
谷歌下






问题出现在thinkphp的默认缓存方式S()是以File方式,在/Runtime/Temp 下生成缓存文件。


并且,文件缓存的名字是不会变的,也就是一套系统只要开源就有可能是被shell,例如onethink的文件缓存名:865e8245bc0c525aa4a48bfb433d7c3e.php,2bb202459c30a1628513f40ab22fa01a.php,所以不用担心找不到缓存文件位置。
了解了tp缓存方式和过滤之后我们来看一个demo,demo就是一个用户注册和一个用户登录,并且缓存用户登录信息。不管是strip_tags或者I函数默认过滤对下面不造成影响,我就不写了,管理自己测试吧。


模拟post:**.**.**.**/index.php/Home/Index/reg注册一个账号
来看看数据库里面的内容

继续往下看,我们登录这个账号并缓存登录的用户名(访问**.**.**.**/index.php/Home/Index/login/id/12)。

Application\Runtime\Temp 生成了缓存文件onethink_8d777f385d3dfec8815d20f7496026dc.php。

由于没有过滤换行符,导致


漏洞证明: 如果你不信我写的demo,那么来看看官方的onethink框架,下载地址http://**.**.**.**/Uploads/Editor/2014-11-03/5456e829d55eb.zip,没有修过一行代码,文件缓存名:865e8245bc0c525aa4a48bfb433d7c3e.php,2bb202459c30a1628513f40ab22fa01a.php,这里缓存名字是不会改变的,所以不用担心找不到缓存文件位置。
由于onethink的用户名字段限制了长度,那么我们注册两个账户。



注册好了两个账户,我们来登陆。




成功了。

我们来执行以下命令。

修复方案: