emlog旧版本代码审计
字数 1377 2025-08-07 08:22:00
emlog旧版本代码审计与漏洞分析报告
1. 文件删除漏洞分析
漏洞位置
admin/plugin.php 后台插件管理处的文件删除功能
漏洞原理
- 首先进行Token校验防止CSRF攻击
- 调用
Plugin_Model类的inactivePlugin方法 inactivePlugin方法中:- 调用
Option类的get方法获取active_plugins值 - 当返回为空时,直接跳过检查
- 通过正则替换后,
$pludir变量直接使用用户传入的文件路径 - 调用
emDeleteFile方法删除文件或目录
- 调用
漏洞利用
- POC:
/admin/plugin.php?action=del&plugin=filepath&token=valid_token - 攻击者可利用此漏洞删除服务器上的任意文件
2. 文件上传GetShell漏洞分析
漏洞位置
后台插件管理处的插件安装功能 admin/plugin.php#87
漏洞原理
-
对上传的ZIP文件进行基本检查:
- 检查文件名
- 检查错误码
- 检查临时文件名
- 限制文件后缀为ZIP
-
调用
emUnZip方法解压:- 使用PHP原生
ZipArchive类处理压缩包 - 通过
explode分割获取文件名 - 使用
getFromName方法检查指定路径下的文件 - 如果压缩包中的文件名与压缩包本身文件名一致,即可成功上传并解压
- 使用PHP原生
漏洞利用
- 构造恶意ZIP压缩包,其中包含与压缩包同名的PHP Webshell文件
- 通过插件上传功能上传该压缩包
- 系统解压后会在服务器上留下Webshell
3. SQL注入漏洞分析
漏洞位置
admin/widgets.php#133
漏洞原理
wgnum参数不赋值时默认为1widgets参数完全可控- 对传入值进行序列化处理
- 调用
Option类的updateOption方法:- 实例化
Database类 $isSyntax默认为false$value直接使用POST传入的参数值
- 实例化
- 在
query方法中:- 输出报错信息
- 查询语句完全可控
漏洞利用
- POC: 构造报错注入语句
- 示例注入语句:
' or updatexml(0x3a,concat(1,(select user())),1)and' - 注意需要处理序列化数据的引号闭合问题
4. 漏洞修复建议
-
文件删除漏洞修复:
- 严格校验文件路径
- 限制删除操作只能在插件目录内进行
- 增加路径合法性检查
-
文件上传漏洞修复:
- 增加文件内容检查
- 限制解压目录
- 检查压缩包内文件类型
- 增加文件名过滤
-
SQL注入漏洞修复:
- 使用预处理语句
- 对输入参数进行严格过滤
- 关闭错误信息显示
5. 审计经验总结
- 后台漏洞虽然利用条件较高,但仍需重视
- 审计时应重点关注:
- 用户输入的直接使用
- 文件操作相关函数
- 数据库查询构造
- 建议扩展审计范围:
- 前台功能审计
- Java等其他语言CMS审计
- 寻找无需认证的漏洞点
6. 参考信息
- 漏洞发现时间:2021-12-29
- 漏洞状态:官方已修复
- 影响版本:emlog旧版本(具体版本号未提及)
- 修复版本:最新Pro版本已修复这些问题
本报告详细分析了emlog旧版本中存在的三个高危漏洞,包括漏洞原理、利用方式和修复建议,可作为代码审计和安全研究的参考材料。