如何判断我的Drupal网站是否包含于SA-CORE-2018-002 — 2018年3月漏洞利用中?


9

刚刚发布的漏洞利用:https : //www.drupal.org/sa-core-2018-002 --- Drupal核心-高度关键-远程执行代码-SA-CORE-2018-002

  • 我如何知道是否有人利用此漏洞来入侵我的网站?
  • 如果执行得当,他们将如何利用此漏洞?
  • 我现在不能更新我的Drupal网站,有什么好的方法可以轻松地修补此漏洞?

1
我想将其链接到您的文章,这是关于最后一次重大利用的信息,以防对任何人有帮助:drupal.stackexchange.com/questions/133996/…–
Christia

2
在您的访问日志中可追溯。远程执行代码使这一点变得至关重要。任何PHP代码都可以执行!尽快应用补丁-参见
克里斯蒂亚

1
To our knowledge the issue is not currently being exploited.机会极低。
No Sssweat

1
在安全公告发布之前,它已经被利用的可能性非常低,但是并不是所有这些都不会很快被利用的。
rooby

4
这很琐碎。不要等它是否被利用了,就修补它。
凯文(Kevin)

Answers:


8

会发生什么

我在Drupalgeddon期间入侵了一个个人的Drupal网站,这是一个类似严重程度的漏洞利用程序(尽管类型不同)。就“可能发生的事情”而言,在这种情况下,黑客将几个“后门”文件放入我的代码库中(当时我对开发工作知之甚少,并且没有Git存储库),从中他可以发送垃圾邮件。所涉及的域在垃圾邮件过滤器中已被列入黑名单,而在此后的几个月中,我仍然无法从该域发送电子邮件,这真是一团糟。

由于此漏洞允许远程执行代码,因此攻击者可能会安装模块来进行网络钓鱼攻击,使用php exec()在命令行上执行命令,窃取密码,从而损害服务器的大部分性能。损害的范围可能很简单,例如将您的计算机招募为垃圾邮件引擎或僵尸网络节点,或者如果您拥有敏感信息,攻击者可能会根据信息和攻击者的动机将其窃取并转售或勒索给您。

如何判断您是否被黑客入侵

在大多数情况下,您的网站不会受到污损。当两组14岁的脚本小子互相走动时,您可能会看到一个站点被山羊图像(NSFW)污损,但是除非黑客个人对您不利,否则他不会这样做。黑客的目标是金钱或使用他人计算机进行犯罪的能力。

现在记住这一点,您将看到的常见事物是正在创建新用户(特别是管理员用户),并且在日志中,您可能会看到特定IP仅发送一种(异常)请求。在Drupalgeddon的情况下,我可以通过查看访问日志中对php文件的POST请求来弄清楚。

如果您无法立即修补网站

如果您现在不能修补该站点,我建议您切断apache / nginx服务器,以便没人能进入您的站点。或者,让服务器将所有流量定向到HTML页面,以解释您需要维护(又称为“硬维护模式”)。在所有情况下,除非您获得适当的升级或补丁,否则您都不希望访客在引导Drupal时有任何机会。

回想一下我的网站遭到黑客攻击时,请记住,第一次Drupalgeddon攻击是在该版本发布7 小时后开始的,它以脚本的形式自动入侵了数千个站点。动作快点!

如果您被黑

希望您有一个备份,在这种情况下,最好的选择是“从轨道上删除整个站点”并从新服务器开始。我曾经进行过一次手动的数据库和文件审核,因为我没有Git和常规备份-这需要长时间,但是如果发生了,请深呼吸,学习Git并学习如何设置适当的备份环境。如果您有一家公司及其客户站点,请提前告诉他们真相。您可能会失去他们,但是失去客户(您可以赢得新客户)比声誉更好。


10

我如何知道是否有人利用此漏洞来入侵我的网站?

您的Drupal 7或8网站可能会遭受数据丢失或盗窃的侵害,可以删除,删除或更改数据,从而以多种方式对网站造成破坏。

有关检查您的网站是否被黑客入侵的一般信息,请参见此Stack Exchange帖子

如果执行得当,他们将如何利用此漏洞?

该漏洞利用是一个远程执行代码漏洞,这意味着任何数据都可能受到影响。

此漏洞利用的风险评分为21/25,几乎是它的最高分数。此风险评分还定义了以下漏洞,其中包括:

  • AC(访问复杂度):易于(没有技能)访问和利用
  • A(身份验证):无需特殊身份验证
  • Cl(机密性影响):可访问所有非公开数据
  • II(完整性影响):可以修改或删除所有数据

在此处阅读有关风险评分和定义的更多信息

我现在不能更新我的Drupal网站,有什么好的方法可以轻松地修补此漏洞?

如果您无法立即更新核心,则有一个可用的补丁。从Drupal.org:

如果您正在运行7.x,请升级到Drupal 7.58。(如果无法立即更新,则可以尝试应用此修补程序来修复漏洞,直到能够完全更新为止。)

如果您正在运行8.5.x,请升级到Drupal 8.5.1。(如果无法立即更新,则可以尝试应用此修补程序来修复漏洞,直到能够完全更新为止。)

要了解更多信息,请参阅以下有关该漏洞利用的常见问题解答


2
我也想添加指向此3月21日公共服务公告的链接。可能会在几小时或几天内利用这些漏洞。因此,请尽快更新。
Neograph734 '18

如果有人需要,这里是Drupal黑客网站指南:drupal.org/drupal-security-team/…–
Christia

1
我想说的最好的做法是立即应用补丁,然后将您的站点更新为最新版本。原因是,除非您的站点始终保持最新状态,否则一轮模块安全更新将需要更多时间来进行适当的测试,并且还可能需要更多的部署工作。因此,最好的方法是尽快找到最重要的修复程序。
rooby

1

如何针对Drupal核心手动修补Drupal 7.x-高度关键-远程执行代码-SA-CORE-2018-00

如果您使用的是Drupal 7.x,并且无法将实时站点更新到7.58,不熟悉应用补丁程序,或者您使用的Drupal版本补丁程序失败,请执行以下操作:

1>下载并解压缩Drupal 7.58。

2>将7.58发行版中的/includes/request-sanitizer.inc文件复制到您网站的/ includes目录中(最简单的方法是通过FTP或托管控制面板文件管理器)。

3>在实时网站上编辑/includes/bootstrap.inc的版本(先备份!)。找到函数_drupal_bootstrap_configuration()。在语句drupal_settings_initialize()之后添加以下3行::

// Sanitize unsafe keys from the request.
require_once DRUPAL_ROOT . '/includes/request-sanitizer.inc';
DrupalRequestSanitizer::sanitize();

救。

放松。


0

这是一个简单的1-2-3流程:

  1. 从此处https://cgit.drupalcode.org/drupal/rawdiff/?h=7.x&id=2266d2a83db50e2f97682d9a0fb8a18e2722cba5或下面引用的代码复制到剪贴板。
  2. 在您的drupal目录的根文件夹中创建一个名为2018march.patch文件的空白文件。
  3. 将代码粘贴到文件中
  4. 在终端中运行命令:patch -p1 <2018march.patch

如果您没有SSH或终端访问权限。您需要使用用户的@elb解决方案手动进行此操作。

diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 655db6d..880557e 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2632,6 +2632,10 @@ function _drupal_bootstrap_configuration() {
   timer_start('page');
   // Initialize the configuration, including variables from settings.php.
   drupal_settings_initialize();
+
+  // Sanitize unsafe keys from the request.
+  require_once DRUPAL_ROOT . '/includes/request-sanitizer.inc';
+  DrupalRequestSanitizer::sanitize();
 }

 /**
diff --git a/includes/request-sanitizer.inc b/includes/request-sanitizer.inc
new file mode 100644
index 0000000..1daa6b5
--- /dev/null
+++ b/includes/request-sanitizer.inc
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains code for sanitizing user input from the request.
+ */
+
+/**
+ * Sanitizes user input from the request.
+ */
+class DrupalRequestSanitizer {
+
+  /**
+   * Tracks whether the request was already sanitized.
+   */
+  protected static $sanitized = FALSE;
+
+  /**
+   * Modifies the request to strip dangerous keys from user input.
+   */
+  public static function sanitize() {
+    if (!self::$sanitized) {
+      $whitelist = variable_get('sanitize_input_whitelist', array());
+      $log_sanitized_keys = variable_get('sanitize_input_logging', FALSE);
+
+      // Process query string parameters.
+      $get_sanitized_keys = array();
+      $_GET = self::stripDangerousValues($_GET, $whitelist, $get_sanitized_keys);
+      if ($log_sanitized_keys && $get_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from query string parameters (GET): @keys', array('@keys' => implode(', ', $get_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      // Process request body parameters.
+      $post_sanitized_keys = array();
+      $_POST = self::stripDangerousValues($_POST, $whitelist, $post_sanitized_keys);
+      if ($log_sanitized_keys && $post_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from request body parameters (POST): @keys', array('@keys' => implode(', ', $post_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      // Process cookie parameters.
+      $cookie_sanitized_keys = array();
+      $_COOKIE = self::stripDangerousValues($_COOKIE, $whitelist, $cookie_sanitized_keys);
+      if ($log_sanitized_keys && $cookie_sanitized_keys) {
+        _drupal_trigger_error_with_delayed_logging(format_string('Potentially unsafe keys removed from cookie parameters (COOKIE): @keys', array('@keys' => implode(', ', $cookie_sanitized_keys))), E_USER_NOTICE);
+      }
+
+      $request_sanitized_keys = array();
+      $_REQUEST = self::stripDangerousValues($_REQUEST, $whitelist, $request_sanitized_keys);
+
+      self::$sanitized = TRUE;
+    }
+  }
+
+  /**
+   * Strips dangerous keys from the provided input.
+   *
+   * @param mixed $input
+   *   The input to sanitize.
+   * @param string[] $whitelist
+   *   An array of keys to whitelist as safe.
+   * @param string[] $sanitized_keys
+   *   An array of keys that have been removed.
+   *
+   * @return mixed
+   *   The sanitized input.
+   */
+  protected static function stripDangerousValues($input, array $whitelist, array &$sanitized_keys) {
+    if (is_array($input)) {
+      foreach ($input as $key => $value) {
+        if ($key !== '' && $key[0] === '#' && !in_array($key, $whitelist, TRUE)) {
+          unset($input[$key]);
+          $sanitized_keys[] = $key;
+        }
+        else {
+          $input[$key] = self::stripDangerousValues($input[$key], $whitelist, $sanitized_keys);
+        }
+      }
+    }
+    return $input;
+  }
+
+}

您需要安装git才能执行此操作。
user2924019
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.