emlog博客系统的一次审计
字数 1205 2025-08-25 22:58:46
emlog博客系统安全审计报告
前言
本报告对emlog博客系统6.0版本进行了安全审计,发现了多个高危漏洞,包括SQL注入和文件上传漏洞。这些漏洞可能导致数据库信息泄露和服务器被完全控制。
漏洞分析
1. 后台SQL注入漏洞(一)
漏洞位置: /admin/tag.php文件中的标签删除功能
漏洞代码:
// 删除标签功能
function deleteTag() {
$tagid = isset($_POST['tagid']) ? $_POST['tagid'] : '';
$DB = Database::getInstance();
$DB->query("DELETE FROM " . DB_PREFIX . "tag WHERE tagname IN (SELECT gid FROM " . DB_PREFIX . "blog_tag WHERE tid='$tagid')");
$DB->query("DELETE FROM " . DB_PREFIX . "blog_tag WHERE tid='$tagid'");
}
漏洞原理:
$tagid变量直接拼接进SQL语句,没有使用单引号保护或预处理- 攻击者可以控制
$_POST['tagid']的值构造恶意SQL
利用方法:
- 在后台选择标签删除
- 拦截请求,修改
tagid参数为注入语句 - 示例payload:
tagid=2 and updatexml(0x3a,concat(1,(select user())),1)#
修复建议:
- 使用预处理语句
- 对输入参数进行严格过滤和类型检查
2. 后台SQL注入漏洞(二)
漏洞位置: /admin/widgets.php中的保存排序功能
漏洞代码:
// 保存排序功能
$wgNum = isset($_POST['wgnum']) ? (int)$_POST['wgnum'] : 1;
$widgets = isset($_POST['widgets']) ? serialize($_POST['widgets']) : '';
$DB = Database::getInstance();
$DB->query("UPDATE " . DB_PREFIX . "options SET option_value='$widgets' where option_name='widgets$wgNum'");
漏洞原理:
$widgets变量仅经过序列化处理,没有过滤单引号- 攻击者可以构造包含单引号的恶意序列化字符串
利用方法:
- 触发保存排序功能
- 构造恶意payload闭合单引号:
a:3:{i:0;s:62:"archive' and updatexml(0x3a,concat(1,(select user())),1) and '";i:1;s:4:"link";i:2;s:6:"search";}
修复建议:
- 使用预处理语句
- 对序列化数据进行验证和过滤
3. 文件上传漏洞(一)
漏洞位置: /admin/plugin.php的插件上传功能
漏洞代码:
// 上传zip插件
if ($action == 'upload_zip') {
$zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : '';
if (getFileSuffix($zipfile['name']) != 'zip') {
emDirect("./plugin.php?error_f=1");
}
$ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');
}
漏洞原理:
- 仅检查文件扩展名为zip,不验证文件内容
emUnZip函数解压时仅检查是否存在与文件夹同名的PHP文件
利用方法:
- 创建恶意zip文件结构:
shell/ └── shell.php (包含恶意代码) - 在后台插件上传处上传该zip文件
- 恶意文件将被解压到
/content/plugins/shell/shell.php
修复建议:
- 验证zip文件内容,禁止包含PHP文件
- 限制解压目录权限
4. 文件上传漏洞(二)
漏洞位置: /admin/template.php的模板上传功能
漏洞代码:
// 上传zip模板
if ($action == 'upload_zip') {
$zipfile = isset($_FILES['tplzip']) ? $_FILES['tplzip'] : '';
if (getFileSuffix($zipfile['name']) != 'zip') {
emDirect("./template.php?action=install&error_a=1");
}
$ret = emUnZip($zipfile['tmp_name'], '../content/templates/', 'tpl');
}
漏洞原理:
- 仅检查文件扩展名为zip
emUnZip函数解压时仅检查是否存在header.php文件
利用方法:
- 创建恶意zip文件结构:
evil_template/ └── header.php (包含phpinfo()等恶意代码) - 在后台模板上传处上传该zip文件
- 切换使用该模板后,恶意代码将在首页执行
修复建议:
- 严格验证模板文件内容
- 限制模板文件的执行权限
后记
emlog博客系统的这些漏洞具有典型性,反映了CMS开发中常见的安全问题:
- 输入验证不足:对用户输入缺乏严格验证和过滤
- SQL注入防护缺失:直接拼接SQL语句,未使用预处理
- 文件上传控制不严:仅检查扩展名,不验证内容
- 权限控制不足:后台功能缺乏二次验证
开发人员应遵循以下安全原则:
- 对所有用户输入进行严格验证和过滤
- 使用预处理语句处理数据库查询
- 对文件上传进行内容检查和类型验证
- 实施最小权限原则
- 对敏感操作增加二次验证
这些漏洞的发现和修复过程也提醒我们,即使是看似简单的功能点,也可能存在严重的安全隐患,需要在设计和实现阶段就充分考虑安全性。