PHP代码审计-emlog
字数 1709 2025-08-06 12:20:59
Emlog CMS 代码审计与漏洞分析报告
一、项目搭建
- 环境准备:
- 使用phpstudy + MySQL搭建环境
- 安装过程中需要输入数据库名、登录用户名和密码
- 成功后可访问后台地址
二、全局代码分析
- 全局过滤机制:
- 分析
/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注入风险
复现步骤:
- 进入插件功能模块
- 上传文件并F12查看源代码获取token
- 使用Burp Suite测试,可触发报错注入
2. 任意文件删除漏洞(1)
位置:/admin/data.php第143-144行
unlink($_POST['bak']);
漏洞详情:
- 未过滤
$_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['action']; // 可通过数组形式传入
漏洞详情:
$action通过GET方式传入,可以数组形式导致SQL注入- 数据库备份功能可写入恶意代码
复现步骤:
- 进入数据功能模块进行备份
- 在备份文件中写入
phpinfo() - 如报错则更换写入方式
- 成功访问包含
phpinfo()的文件
4. 文件上传漏洞
位置:/admin/plugin.php
漏洞详情:
- 可上传zip压缩包并在后台解压
- 跟踪
emUnZip()函数发现解压过程未充分验证文件内容
复现步骤:
- 准备包含恶意代码的zip文件
- 通过插件上传功能上传该zip文件
- 成功上传并解压恶意文件
5. 存储型XSS漏洞
位置:/admin/write_log.php和/admin/save_log.php
$content = $_POST['content']; // 未过滤
漏洞详情:
- 添加文章时未过滤HTML代码
$content变量直接存储用户输入
复现步骤:
- 在评论页面输入
<script>alert('xss')</script> - 查看评论触发XSS弹窗
6. SQL注入漏洞2
位置:/admin/navbar.php
$pages = $_POST['pages']; // 遍历调用addNavi
漏洞详情:
addNavi函数未过滤用户输入- 直接拼接SQL语句导致注入
利用方法:
- 进入自定义导航功能
- 尝试报错注入
- 使用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函数过滤部分字符 - 存在绕过可能
复现步骤:
- 进入插件功能并点击删除
- 使用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