cltphp漏洞

 人参与 | 时间:2026-10-17 07:08:40

CLTPHP 的漏洞漏洞不是某一个孤立的 bug,而是漏洞一类反复出现的开发习惯问题。我最早接触这个框架是漏洞在一个外包项目里,客户指定用 CLTPHP 搭建后台管理系统,漏洞版本是漏洞 5.0。当时没太在意,漏洞觉得国产框架嘛,漏洞能跑就行。漏洞直到有天晚上测试登录接口,漏洞随手在用户名框里打了个单引号,漏洞页面直接抛出了数据库错误堆栈——SQL 注入,漏洞实打实的漏洞。

这个注入点出现在 app/admin/controller/Login.php 的漏洞 checkLogin 方法里。框架自带的漏洞查询构造器在某些场景下没有强制参数绑定,开发者如果直接拼接 I('post.username') 这类输入,漏洞就很容易出事。我翻了下源码,发现 I() 函数本身做了过滤,但过滤规则依赖 config.php 里的 DEFAULT_FILTER 配置。问题在于,很多开发者会把这个配置改成空字符串,理由是“性能优化”——结果就是输入完全裸奔。

文件上传那块更离谱

CLTPHP 默认的文件上传类在 extend/upload/Upload.php,检查逻辑大概是这样的:先判断 MIME 类型,再检查后缀名。但 MIME 判断用的是 $_FILES['file']['type'],这玩意儿是客户端传的,改包就能绕过。后缀检查更搞笑,黑名单里只写了 php 和 php5,没写 phtml、php7、phps。我试过传一个 shell.phtml,内容是一句话木马,直接就能访问执行。

更早的 3.x 版本还有个经典问题:Upload 类在保存文件时,文件名取自 $_FILES['file']['name'] 的原始值,只做了 trim 和 str_replace 替换几个特殊字符。攻击者可以构造 test.php%00.jpg 这种名字(PHP 5.3 以下版本),或者利用 Windows 的文件名特性搞出 test.php:.jpg 之类的绕过。虽然现在 PHP 版本高了,这类技巧基本失效,但当时确实能打。

后台任意文件删除

有个接口 admin/index/delFile,参数是 path,直接传给 unlink()。没做路径白名单,也没校验是否在允许目录内。我构造了 path=../../../../etc/passwd,虽然删不掉(权限问题),但换成 path=../../application/config.php 就能把配置文件干掉。站点直接白屏。这个漏洞在官方论坛被提过,但修复补丁只加了 str_replace('../', '', $path),用 ....// 就能绕过。典型的补丁写一半。

我觉得 CLTPHP 的问题不在于技术多难,而是开发团队对安全的态度。框架里有个 helper.php,里面有个 safe_replace 函数,注释写着“过滤危险字符”。实际代码是:

function safe_replace($string) {  $string = str_replace('%20','',$string); $string = str_replace('%27','',$string); $string = str_replace('%2527','',$string); $string = str_replace('*','',$string); $string = str_replace('"','"',$string); $string = str_replace("'",'',$string); $string = str_replace('"','',$string); $string = str_replace(';','',$string); $string = str_replace('<','<',$string); $string = str_replace('>','>',$string); $string = str_replace("{ ",'',$string); $string = str_replace('}','',$string); $string = str_replace('\\','',$string); return $string; }

这函数看着挺长,实际上对 SQL 注入的防御基本为零。因为注入不一定需要引号、分号、尖括号。数字型注入直接 1 or 1=1 就完事,这个函数根本不拦。而且它把 %27 替换掉,但 urldecode 是在更早阶段做的,顺序错了。

写这些不是要全盘否定 CLTPHP

它在快速开发上确实省事,模板引擎、权限控制、菜单管理都封装好了。但用这个框架,你得自己把安全层补上。我的做法是:所有输入统一走 intval 或 addslashes,文件上传重写一遍白名单逻辑,后台删除接口加 realpath 校验。官方更新太慢,社区版基本停更了,指望官方修不如自己动手。

如果你现在还在维护 CLTPHP 项目,第一件事就是 grep 一下 unlink、file_put_contents、I('post. 这几个关键词,大概率能挖出几个洞。别问我是怎么知道的。

顶: 34踩: 381