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 一下
顶: 34踩: 381unlink、file_put_contents、I('post.这几个关键词,大概率能挖出几个洞。别问我是怎么知道的。






评论专区