缓存函数F设计缺陷可导致Getshell--ThinkPHP3.2.3代码审计分析

漏洞原理

漏洞利用



漏洞分析

整个APP中,入口文件,全局安全过滤函数safereplace,对GET、POST参数过滤,
然后通过/Core/core.php文件加载核心类,通过URL路由进入相对应的控制器。
xlb函数中F(‘xlb
‘.$_POST[“orderNo”],$_POST);语句,两个参数未做安全过滤(除了入口文件的全局过滤),定位到\Core\Common\functions.php中的F函数,

由Think\Storage::put($filename,serialize($value),’F’);定位到:
/Core/Library/Think/Storage/Driver/File.class.php的put函数

其中直接使用file_put_contents函数将payload存入文件中,造成getshell。
payload构造:orderNo参数为文件名的一部分,重点在第二个参数,键值被入口文件的safe_replace函数过滤,字符替换,根据php代码的格式,<?php?>等字符中尖括号被替换过滤,所以恶意代码放在键名中,PHP变量中不允许出现[、]、空格等特殊字符,并被替换为下划线【PHP将自动将传入变量名中的任何chr(32)()(空格)chr(46)(.)(点)chr(91)( [)(开放方括号)chr(128)-chr(159)(各种) 替换为下划线】,所以采用<?=>、file_put_contents写入一句话木马、base64编码等绕过操作,并将payload进行URLencode编码,访问即可执行代码生成一句话木马。