最近调试检测一个CMS,底层框架是ThinkPHP,发现Core/ThinkPHP.php任意PHP代码执行Webshell漏洞,很久分享CMS安全方面的知识,CMSYOU在此与大家分享ThinkPHP常见的Webshell漏洞。
程序部署后,马上检测出“检测模型在您的服务器上发现了一个可疑的Webshell文件,可能是攻击者成功入侵网站后为维持权限植入的后门文件。”,具体文件指向Core/ThinkPHP.php,经过排查,发现这一核心文件被篡改过,加入了eval代码。问题出在ThinkPHP版本过低,存在Webshell漏洞。
ThinkPHP核心文件Core/ThinkPHP.php被篡改
ThinkPHP,简称“TP”,诞生于2006年,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。 属于在帝国CMS、DedeCMS、Phpcms这三大CMS之外的又一PHP的CMS开发框架,自定义高、用户众多。早一两年前,ThinkPHP 2、ThinkPHP 3系列已经停止维护,而ThinkPHP 3正是CMS爆发期,期间出现了很多基于ThinkPHP开发的CMS,积累了较多的历史用户,历史版本多少存在一些漏洞。
在此,CMSYOU列举一些常见的Webshell漏洞,一起分析。
1、ThinkPHP 2.x 任意代码执行漏洞
Thinkphp 2.x版本中,使用preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
影响版本:
ThinkPHP 2.x,3.0 Lite模式
2、Thinkphp 5.x 远程代码执行漏洞
由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况),对传入的路由参数过滤不严格,导致攻击者可以执行任意方法,从而导致远程命令执行漏洞。
影响版本:
ThinkPHP 5.0.5 ~ 5.0.22
ThinkPHP 5.1.0 ~ 5.1.30
3、ThinkPHP5 SQL注入漏洞和敏感信息泄露漏洞
传入的某个参数在绑定编译指令的时候又没有安全处理,预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码。
影响版本:
ThinkPHP < 5.1.23 ,该漏洞关键点是需要开启debug模式。
4、ThinkPHP 6 任意文件创建漏洞
漏洞成因:
session 文件默认存储在 /var/www/html/tp60/runtime/session 下,其文件名格式类似 sess_PHPSESSID 。而当我们在 PHPSESSID 中插入特殊字符时,程序还是能正常生成对应文件。因此,这里存在任意文件创建漏洞,且通过插入路径穿越符,还存在文件覆盖和getshell的可能。
5、ThinkPHP6.X 反序列化命令执行漏洞
漏洞成因:
Model类中的checkAllowFields() 方法存在可控变量拼接的问题,可以调用 __toString(),融合 5 版本的 rce pop 链 即可构造此版本的 rce。
漏洞利用:
1)phpggc上有集成的exp,使用如下命令即可生成
./phpggc -u ThinkPHP/RCE2 'phpinfo();'
2)POC
漏洞修复:使用PHP7新增的unserialize的过滤器
最后,感谢大家一直来对CMSYOU的关注,继续PHP,继续二次开发CMS!
点击加载更多