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

利用方法:

  1. 在后台选择标签删除
  2. 拦截请求,修改tagid参数为注入语句
  3. 示例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变量仅经过序列化处理,没有过滤单引号
  • 攻击者可以构造包含单引号的恶意序列化字符串

利用方法:

  1. 触发保存排序功能
  2. 构造恶意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文件

利用方法:

  1. 创建恶意zip文件结构:
    shell/
    └── shell.php (包含恶意代码)
    
  2. 在后台插件上传处上传该zip文件
  3. 恶意文件将被解压到/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文件

利用方法:

  1. 创建恶意zip文件结构:
    evil_template/
    └── header.php (包含phpinfo()等恶意代码)
    
  2. 在后台模板上传处上传该zip文件
  3. 切换使用该模板后,恶意代码将在首页执行

修复建议:

  • 严格验证模板文件内容
  • 限制模板文件的执行权限

后记

emlog博客系统的这些漏洞具有典型性,反映了CMS开发中常见的安全问题:

  1. 输入验证不足:对用户输入缺乏严格验证和过滤
  2. SQL注入防护缺失:直接拼接SQL语句,未使用预处理
  3. 文件上传控制不严:仅检查扩展名,不验证内容
  4. 权限控制不足:后台功能缺乏二次验证

开发人员应遵循以下安全原则:

  • 对所有用户输入进行严格验证和过滤
  • 使用预处理语句处理数据库查询
  • 对文件上传进行内容检查和类型验证
  • 实施最小权限原则
  • 对敏感操作增加二次验证

这些漏洞的发现和修复过程也提醒我们,即使是看似简单的功能点,也可能存在严重的安全隐患,需要在设计和实现阶段就充分考虑安全性。

emlog博客系统安全审计报告 前言 本报告对emlog博客系统6.0版本进行了安全审计,发现了多个高危漏洞,包括SQL注入和文件上传漏洞。这些漏洞可能导致数据库信息泄露和服务器被完全控制。 漏洞分析 1. 后台SQL注入漏洞(一) 漏洞位置 : /admin/tag.php 文件中的标签删除功能 漏洞代码 : 漏洞原理 : $tagid 变量直接拼接进SQL语句,没有使用单引号保护或预处理 攻击者可以控制 $_POST['tagid'] 的值构造恶意SQL 利用方法 : 在后台选择标签删除 拦截请求,修改 tagid 参数为注入语句 示例payload: 修复建议 : 使用预处理语句 对输入参数进行严格过滤和类型检查 2. 后台SQL注入漏洞(二) 漏洞位置 : /admin/widgets.php 中的保存排序功能 漏洞代码 : 漏洞原理 : $widgets 变量仅经过序列化处理,没有过滤单引号 攻击者可以构造包含单引号的恶意序列化字符串 利用方法 : 触发保存排序功能 构造恶意payload闭合单引号: 修复建议 : 使用预处理语句 对序列化数据进行验证和过滤 3. 文件上传漏洞(一) 漏洞位置 : /admin/plugin.php 的插件上传功能 漏洞代码 : 漏洞原理 : 仅检查文件扩展名为zip,不验证文件内容 emUnZip 函数解压时仅检查是否存在与文件夹同名的PHP文件 利用方法 : 创建恶意zip文件结构: 在后台插件上传处上传该zip文件 恶意文件将被解压到 /content/plugins/shell/shell.php 修复建议 : 验证zip文件内容,禁止包含PHP文件 限制解压目录权限 4. 文件上传漏洞(二) 漏洞位置 : /admin/template.php 的模板上传功能 漏洞代码 : 漏洞原理 : 仅检查文件扩展名为zip emUnZip 函数解压时仅检查是否存在 header.php 文件 利用方法 : 创建恶意zip文件结构: 在后台模板上传处上传该zip文件 切换使用该模板后,恶意代码将在首页执行 修复建议 : 严格验证模板文件内容 限制模板文件的执行权限 后记 emlog博客系统的这些漏洞具有典型性,反映了CMS开发中常见的安全问题: 输入验证不足 :对用户输入缺乏严格验证和过滤 SQL注入防护缺失 :直接拼接SQL语句,未使用预处理 文件上传控制不严 :仅检查扩展名,不验证内容 权限控制不足 :后台功能缺乏二次验证 开发人员应遵循以下安全原则: 对所有用户输入进行严格验证和过滤 使用预处理语句处理数据库查询 对文件上传进行内容检查和类型验证 实施最小权限原则 对敏感操作增加二次验证 这些漏洞的发现和修复过程也提醒我们,即使是看似简单的功能点,也可能存在严重的安全隐患,需要在设计和实现阶段就充分考虑安全性。