OKLite 1.2.25 几处getshell审计分析
字数 1649 2025-08-26 22:11:22
OKLite 1.2.25 多处Getshell漏洞审计分析报告
系统概述
OKLite是一套极简企业站系统,主要面向展示型企业网站用户。该系统最初是从PHPOK程序精简而来,在同等配置下,OKLite速度优于PHPOK达30%以上。需要注意的是,此版本在2018年已停止维护。
系统链接:https://www.phpok.com/oklite.html
系统架构分析
路由机制
- 系统有三个入口(前端、接口、后台),都是通过
action()方法进行初始化 - 不同入口传入指定方法中执行动作
- 示例:访问
http://127.0.0.1/admin.php?c=upload&f=save会调用framework\admin\upload_control.php中的save_f方法
输入过滤机制
- 获取GET、POST和COOKIE数据都通过
get()方法进行过滤处理 - 主要过滤逻辑:
- 对所有内容进行
addslashes()处理 - 调用
format()方法对\ ' " < >进行实体化转换 - 使用
stripslashes()和xss_clean()进行XSS防护
- 对所有内容进行
漏洞分析
1. 后台任意文件上传漏洞(module_control.php)
漏洞验证步骤
- 在模块管理处导入模块,上传包含恶意文件的ZIP压缩包
- 上传后访问另一个地址完成解压
- 恶意文件会被解压到
data\cache目录
漏洞分析
- 处理文件:
framework\admin\upload_control.php - 关键方法:
zip_f()调用zipfile()方法 - 默认解压路径:
data/cache/ - 漏洞点:
- 上传ZIP文件时未对压缩包内容进行安全检查
- 解压操作直接使用
ZipArchive或zip_open,未过滤恶意文件
相关代码
public function zip_f() {
$rs = $this->lib('upload')->zipfile('upfile');
if($rs['status'] != 'ok'){
$this->json($rs['error']);
}
$this->json($rs['filename'],true);
}
2. 后台任意文件上传漏洞(plugin_control.php)
与module_control.php的区别
- ZIP压缩包必须包含一个文件夹,文件夹中再包含恶意文件
- 解压路径为
WWW\plugins
漏洞验证步骤
- 在插件中心上传符合格式的ZIP文件
- 上传后访问另一个地址完成解压
漏洞分析
- 处理文件:
framework\admin\plugin_control.php - 关键方法:
unzip_f() - 漏洞点:
- 虽然检查了ZIP包结构,但仍未对文件内容进行安全检查
- 解压操作同样直接使用系统函数
相关代码
public function unzip_f() {
// 检查ZIP文件结构
if(!$info[1]){
$this->json(P_Lang('插件打包模式有问题'));
}
// 直接解压到plugins目录
$this->lib('phpzip')->unzip($this->dir_root.$rs['filename'],$this->dir_root.'plugins/');
}
3. 前台SQL注入导致Getshell
漏洞验证步骤
- 在在线留言处上传图片并抓包
- 修改文件名为注入payload:
1','pf3qm0js3gb2s5f33r7lf14vl3','30'),('1',0x7265732f3230313931302f30342f,'shell.jpg','jpg',0x7265732f3230313931302f30352f7368656c6c2e706870,'1570161575','abc - 上传成功后获取图片ID和路径
- 再次上传图片,使用
replace功能替换指定ID的文件 - 恶意PHP文件会被写入
res\201910\05目录
漏洞分析
- 处理文件:
framework\www\upload_control.php - 关键方法:
save_f()和replace_f() - 漏洞点:
- 文件名未经过滤直接用于SQL语句,导致INSERT型注入
- 通过注入可以控制数据库中的文件路径和名称
replace_f()方法信任数据库中的文件路径,导致任意文件写入
相关代码
// 文件名直接用于SQL
$tmpname = $_FILES[$input]["name"];
$title = str_replace(".".$ext,'',$tmpname);
// replace_f方法信任数据库记录
$this->lib('file')->mv($rs["filename"],$old_rs["filename"]);
漏洞修复建议
-
文件上传漏洞修复:
- 对ZIP压缩包内容进行严格检查
- 限制解压文件类型,禁止解压PHP等可执行文件
- 使用白名单机制限制解压路径
-
SQL注入漏洞修复:
- 对文件名进行严格过滤
- 使用参数化查询替代字符串拼接
- 对数据库中的文件路径进行二次验证
-
通用建议:
- 更新到最新版本或更换其他维护中的系统
- 实施严格的文件上传策略
- 对后台操作进行权限强化
总结
OKLite 1.2.25存在多处严重安全漏洞,攻击者可通过:
- 后台模块/插件管理功能上传恶意ZIP文件getshell
- 前台留言板结合SQL注入和文件替换功能getshell
这些漏洞都源于对用户输入过度信任和缺乏必要的安全检查,建议用户立即采取防护措施。