PHP代码审计-emlog
字数 1709 2025-08-06 12:20:59

Emlog CMS 代码审计与漏洞分析报告

一、项目搭建

  1. 环境准备
    • 使用phpstudy + MySQL搭建环境
    • 安装过程中需要输入数据库名、登录用户名和密码
    • 成功后可访问后台地址

二、全局代码分析

  1. 全局过滤机制
    • 分析/index.php包含的/init.php文件
    • 发现仅在第21行调用了doStripslashes()函数处理GET/POST数据
    • 该函数仅去除转义字符,实际上未对用户输入进行有效过滤

三、漏洞分析与复现

1. SQL注入漏洞1

位置/admin/comment.php第46行

$ip = isset($_GET['ip']) ? $_GET['ip'] : '';

漏洞详情

  • 未对ip参数进行过滤
  • 跟踪delCommentByIp()函数,在/include/model/comment_model.php第152行中直接拼接SQL语句
  • 参数由单引号包裹,存在SQL注入风险

复现步骤

  1. 进入插件功能模块
  2. 上传文件并F12查看源代码获取token
  3. 使用Burp Suite测试,可触发报错注入

2. 任意文件删除漏洞(1)

位置/admin/data.php第143-144行

unlink($_POST['bak']);

漏洞详情

  • 未过滤$_POST['bak']直接传入unlink()
  • 同时在/admin/blogger.php中存在危险函数unlink()
  • 变量$icon_1来自SQL查询结果,而$photo通过POST传入

复现步骤

  1. 通过POST将构造的任意路径变量$photo更新到数据库($action=update)
  2. 通过$action=delicon触发unlink($icon_1)
  3. 使用Burp Suite抓包,成功删除指定文件

3. 数据库备份上传getshell

位置/emlog/init.php

$action = $_GET['action']; // 可通过数组形式传入

漏洞详情

  • $action通过GET方式传入,可以数组形式导致SQL注入
  • 数据库备份功能可写入恶意代码

复现步骤

  1. 进入数据功能模块进行备份
  2. 在备份文件中写入phpinfo()
  3. 如报错则更换写入方式
  4. 成功访问包含phpinfo()的文件

4. 文件上传漏洞

位置/admin/plugin.php

漏洞详情

  • 可上传zip压缩包并在后台解压
  • 跟踪emUnZip()函数发现解压过程未充分验证文件内容

复现步骤

  1. 准备包含恶意代码的zip文件
  2. 通过插件上传功能上传该zip文件
  3. 成功上传并解压恶意文件

5. 存储型XSS漏洞

位置/admin/write_log.php/admin/save_log.php

$content = $_POST['content']; // 未过滤

漏洞详情

  • 添加文章时未过滤HTML代码
  • $content变量直接存储用户输入

复现步骤

  1. 在评论页面输入<script>alert('xss')</script>
  2. 查看评论触发XSS弹窗

6. SQL注入漏洞2

位置/admin/navbar.php

$pages = $_POST['pages']; // 遍历调用addNavi

漏洞详情

  • addNavi函数未过滤用户输入
  • 直接拼接SQL语句导致注入

利用方法

  1. 进入自定义导航功能
  2. 尝试报错注入
  3. 使用sqlmap验证漏洞

7. SQL注入漏洞3

位置/admin/data.php

$bakstart = $_POST['bakstart']; // 未过滤

复现步骤

  • 构造恶意POST请求:
POST /admin/data.php?action=bakstart
...
table_box[]=emlog_attachment'

8. 任意文件删除漏洞(2)

位置:插件删除功能

漏洞详情

  • 使用preg_replace函数过滤部分字符
  • 存在绕过可能

复现步骤

  1. 进入插件功能并点击删除
  2. 使用Burp Suite抓包修改
  3. 成功删除指定测试文件

四、防御建议

  1. 对所有用户输入进行严格过滤和转义
  2. 使用预处理语句替代直接SQL拼接
  3. 对文件操作进行路径检查和权限控制
  4. 上传文件时验证内容而不仅是扩展名
  5. 对输出内容进行HTML实体编码防止XSS
  6. 限制数据库备份文件的访问权限

五、参考资源

  1. https://blog.51cto.com/u_15847702/5808324
  2. https://www.cnblogs.com/cHr1s/p/14262968.html
  3. https://www.geekmeta.com/article/1118334.html
Emlog CMS 代码审计与漏洞分析报告 一、项目搭建 环境准备 : 使用phpstudy + MySQL搭建环境 安装过程中需要输入数据库名、登录用户名和密码 成功后可访问后台地址 二、全局代码分析 全局过滤机制 : 分析 /index.php 包含的 /init.php 文件 发现仅在第21行调用了 doStripslashes() 函数处理GET/POST数据 该函数仅去除转义字符,实际上未对用户输入进行有效过滤 三、漏洞分析与复现 1. SQL注入漏洞1 位置 : /admin/comment.php 第46行 漏洞详情 : 未对 ip 参数进行过滤 跟踪 delCommentByIp() 函数,在 /include/model/comment_model.php 第152行中直接拼接SQL语句 参数由单引号包裹,存在SQL注入风险 复现步骤 : 进入插件功能模块 上传文件并F12查看源代码获取token 使用Burp Suite测试,可触发报错注入 2. 任意文件删除漏洞(1) 位置 : /admin/data.php 第143-144行 漏洞详情 : 未过滤 $_POST['bak'] 直接传入 unlink() 同时在 /admin/blogger.php 中存在危险函数 unlink() 变量 $icon_1 来自SQL查询结果,而 $photo 通过POST传入 复现步骤 : 通过POST将构造的任意路径变量 $photo 更新到数据库( $action=update ) 通过 $action=delicon 触发 unlink($icon_1) 使用Burp Suite抓包,成功删除指定文件 3. 数据库备份上传getshell 位置 : /emlog/init.php 漏洞详情 : $action 通过GET方式传入,可以数组形式导致SQL注入 数据库备份功能可写入恶意代码 复现步骤 : 进入数据功能模块进行备份 在备份文件中写入 phpinfo() 如报错则更换写入方式 成功访问包含 phpinfo() 的文件 4. 文件上传漏洞 位置 : /admin/plugin.php 漏洞详情 : 可上传zip压缩包并在后台解压 跟踪 emUnZip() 函数发现解压过程未充分验证文件内容 复现步骤 : 准备包含恶意代码的zip文件 通过插件上传功能上传该zip文件 成功上传并解压恶意文件 5. 存储型XSS漏洞 位置 : /admin/write_log.php 和 /admin/save_log.php 漏洞详情 : 添加文章时未过滤HTML代码 $content 变量直接存储用户输入 复现步骤 : 在评论页面输入 <script>alert('xss')</script> 查看评论触发XSS弹窗 6. SQL注入漏洞2 位置 : /admin/navbar.php 漏洞详情 : addNavi 函数未过滤用户输入 直接拼接SQL语句导致注入 利用方法 : 进入自定义导航功能 尝试报错注入 使用sqlmap验证漏洞 7. SQL注入漏洞3 位置 : /admin/data.php 复现步骤 : 构造恶意POST请求: 8. 任意文件删除漏洞(2) 位置 :插件删除功能 漏洞详情 : 使用 preg_replace 函数过滤部分字符 存在绕过可能 复现步骤 : 进入插件功能并点击删除 使用Burp Suite抓包修改 成功删除指定测试文件 四、防御建议 对所有用户输入进行严格过滤和转义 使用预处理语句替代直接SQL拼接 对文件操作进行路径检查和权限控制 上传文件时验证内容而不仅是扩展名 对输出内容进行HTML实体编码防止XSS 限制数据库备份文件的访问权限 五、参考资源 https://blog.51cto.com/u_ 15847702/5808324 https://www.cnblogs.com/cHr1s/p/14262968.html https://www.geekmeta.com/article/1118334.html