EMLOG Pro 2.6.11 CSRF 漏洞CVE-2026-42286
Emlog Pro 是国内老牌轻量化PHP博客/CMS系统,由原版emlog升级重构而来,专为个人博客、资源站、资讯站、小型个人站点打造。
一、基本情况
Emlog Pro 技术栈是基于 PHP + MySQL发布,其体积极小、部署简单、占用服务器资源极低,低配云服务器、虚拟主机都能流畅跑。

EMLOG Pro 2.6.11 版本发布于2026年04月13日,该版本将后台首页用户总数改为读取统计缓存、资源类型字段长度扩展至 512 字符。
栋科技漏洞库关注到 EMLOG Pro 2.6.11 及之前版本中存在的 CSRF 漏洞,该漏洞现已追踪为CVE-2026-42286,CVSS 4.0评分8.8。
二、漏洞分析
CVE-2026-42286漏洞是位于 EMLOG Pro 受影响版本中的一个 CSRF 漏洞,漏洞代码位置:/admin/auth.php 与 /admin/plugin.php。
该高危漏洞源于核心后台功能缺少跨站请求伪造防护,攻击者可诱导已登录管理员执行系统注册、插件管理、配置修改等未授权操作。
具体来说,受影响版本中,由于admin/auth.php 的 action===auth 代码块和 admin/plugin.php 的多个管理函数缺少 CSRF token 验证。
由于关键功能未做 CSRF 令牌校验,通过构造恶意页面可诱骗已登录管理员访问,利用其会话执行系统注册、插件管理等未授权操作。
(一)漏洞代码位置:
/admin/auth.php 与 /admin/plugin.php
(二)关键功能未做 CSRF 令牌校验:
// auth.php - System registration without CSRF protection
if ($action === 'auth') {
$emkey = Input::postStrVar('emkey');
$r = Register::doReg($emkey); // Critical system change
Option::updateOption("emkey", $emkey);
}
// plugin.php - Plugin activation without CSRF protection
if ($action == 'active') {
$Plugin_Model = new Plugin_Model();
if ($Plugin_Model->activePlugin($plugin)) { // No validation
// Plugin activated
}
}
攻击者可通过恶意网站,诱导已登录的管理员执行非预期操作。
三、POC概念验证
(一)攻击向量
利用恶意网站诱导管理员访问
(二)恶意网页代码
管理员已设置登录后刷新可查看(三)修复建议
1、针对 /include/lib/login_auth.php —— 添加 CSRF 功能:
class LoginAuth
{
// ... existing code ...
public static function generateToken()
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
return $_SESSION['csrf_token'];
}
public static function checkToken()
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$token = $_POST['csrf_token'] ?? $_GET['csrf_token'] ?? '';
if (empty($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $token)) {
emMsg('CSRF validation failed. Please refresh the page.');
}
}
}
2、针对 /admin/auth.php —— 添加CSRF防护:
if ($action === 'auth') {
LoginAuth::checkToken(); // ADD THIS LINE
$emkey = Input::postStrVar('emkey');
if (empty($emkey)) {
emDirect("./auth.php?error_b=1");
}
$r = Register::doReg($emkey);
if ($r === false) {
emDirect("./auth.php?error_b=1");
}
if (isset($r['type'])) {
Option::updateOption("emkey_type", $r['type']);
}
Option::updateOption("emkey", $emkey);
$CACHE->updateCache('options');
emDirect("./auth.php");
}
3、针对 /admin/plugin.php —— 为关键功能添加CSRF防护:
// Plugin activation - ADD line 42
if ($action == 'active') {
LoginAuth::checkToken(); // ADD THIS LINE
$Plugin_Model = new Plugin_Model();
if ($Plugin_Model->activePlugin($plugin)) {
$CACHE->updateCache('options');
header('Content-Type: application/json; charset=UTF-8');
Output::ok(_lang('plugin_active_success'));
} else {
Output::error(_lang('plugin_enable_failed'));
}
}
// Plugin deactivation - ADD line 55
if ($action == 'inactive') {
LoginAuth::checkToken(); // ADD THIS LINE
if (strpos($plugin, 'tpl_options') !== false) {
Output::error(_lang('system_plugin_disable_error'));
return;
}
$Plugin_Model = new Plugin_Model();
$Plugin_Model->inactivePlugin($plugin);
$CACHE->updateCache('options');
header('Content-Type: application/json; charset=UTF-8');
Output::ok(_lang('plugin_inactive_success'));
}
// Plugin settings - ADD line 101
if ($action == 'setting') {
LoginAuth::checkToken(); // ADD THIS LINE
if (!checkPlugin($plugin)) {
return;
}
if (!empty($_POST)) {
require_once "../content/plugins/$plugin/{$plugin}_setting.php";
if (false === plugin_setting()) {
emDirect("./plugin.php?plugin={$plugin}&error=1");
} else {
emDirect("./plugin.php?plugin={$plugin}&setting=1");
}
} else {
emDirect("./plugin.php?plugin={$plugin}&error=1");
}
}
// Plugin deletion - ADD line 126
if ($action == 'del') {
LoginAuth::checkToken(); // ADD THIS LINE
$Plugin_Model = new Plugin_Model();
$Plugin_Model->inactivePlugin($plugin);
$Plugin_Model->rmCallback($plugin);
$path = preg_replace("/^([\w-]+)\/[\w-]+\.php$/i", "$1", $plugin);
if ($path === 'tpl_options') {
emDirect("./plugin.php?error_sys=1");
}
if ($path && true === emDeleteFile('../content/plugins/' . $path)) {
$CACHE->updateCache('options');
emDirect("./plugin.php?activate_del=1");
} else {
emDirect("./plugin.php?error_a=1");
}
}
4、对所有后台表单 —— 添加CSRF令牌:
<input type="hidden" name="csrf_token" value="<?php echo LoginAuth::generateToken(); ?>">
(四)修复建议
修复版本中通过在 LoginAuth 类中调用 checkToken() 方法对关键 admin 操作进行 CSRF 令牌校验,防止跨站请求伪造攻击。
四、影响范围
EMLOG Pro ≤ 2.6.11
五、修复建议
EMLOG Pro ≥ 2.6.12
六、参考链接
管理员已设置登录后刷新可查看