首页 网络安全 正文

EMLOG Pro 2.6.11 CSRF 漏洞CVE-2026-42286

摘要

栋科技漏洞库关注到 EMLOG Pro 2.6.11 及之前版本中存在的 CSRF 漏洞,该漏洞现已追踪为CVE-2026-42286,CVSS 4.0评分8.8。

Emlog Pro 是国内老牌轻量化PHP博客/CMS系统,由原版emlog升级重构而来,专为个人博客、资源站、资讯站、小型个人站点打造。

一、基本情况

Emlog Pro 技术栈是基于 PHP + MySQL发布,其体积极小、部署简单、占用服务器资源极低,低配云服务器、虚拟主机都能流畅跑。

Starlet HTTP请求走私漏洞CVE-2026-40561

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

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接