刚刚发布的漏洞利用:https : //www.drupal.org/sa-core-2018-002 --- Drupal核心-高度关键-远程执行代码-SA-CORE-2018-002
- 我如何知道是否有人利用此漏洞来入侵我的网站?
- 如果执行得当,他们将如何利用此漏洞?
- 我现在不能更新我的Drupal网站,有什么好的方法可以轻松地修补此漏洞?
To our knowledge the issue is not currently being exploited.
机会极低。
刚刚发布的漏洞利用:https : //www.drupal.org/sa-core-2018-002 --- Drupal核心-高度关键-远程执行代码-SA-CORE-2018-002
To our knowledge the issue is not currently being exploited.
机会极低。
Answers:
会发生什么
我在Drupalgeddon期间入侵了一个个人的Drupal网站,这是一个类似严重程度的漏洞利用程序(尽管类型不同)。就“可能发生的事情”而言,在这种情况下,黑客将几个“后门”文件放入我的代码库中(当时我对开发工作知之甚少,并且没有Git存储库),从中他可以发送垃圾邮件。所涉及的域在垃圾邮件过滤器中已被列入黑名单,而在此后的几个月中,我仍然无法从该域发送电子邮件,这真是一团糟。
由于此漏洞允许远程执行代码,因此攻击者可能会安装模块来进行网络钓鱼攻击,使用php exec()在命令行上执行命令,窃取密码,从而损害服务器的大部分性能。损害的范围可能很简单,例如将您的计算机招募为垃圾邮件引擎或僵尸网络节点,或者如果您拥有敏感信息,攻击者可能会根据信息和攻击者的动机将其窃取并转售或勒索给您。
如何判断您是否被黑客入侵
在大多数情况下,您的网站不会受到污损。当两组14岁的脚本小子互相走动时,您可能会看到一个站点被山羊图像(NSFW)污损,但是除非黑客个人对您不利,否则他不会这样做。黑客的目标是金钱或使用他人计算机进行犯罪的能力。
现在记住这一点,您将看到的常见事物是正在创建新用户(特别是管理员用户),并且在日志中,您可能会看到特定IP仅发送一种(异常)请求。在Drupalgeddon的情况下,我可以通过查看访问日志中对php文件的POST请求来弄清楚。
如果您无法立即修补网站
如果您现在不能修补该站点,我建议您切断apache / nginx服务器,以便没人能进入您的站点。或者,让服务器将所有流量定向到HTML页面,以解释您需要维护(又称为“硬维护模式”)。在所有情况下,除非您获得适当的升级或补丁,否则您都不希望访客在引导Drupal时有任何机会。
回想一下我的网站遭到黑客攻击时,请记住,第一次Drupalgeddon攻击是在该版本发布7 小时后开始的,它以脚本的形式自动入侵了数千个站点。动作快点!
如果您被黑
希望您有一个备份,在这种情况下,最好的选择是“从轨道上删除整个站点”并从新服务器开始。我曾经进行过一次手动的数据库和文件审核,因为我没有Git和常规备份-这需要很长时间,但是如果发生了,请深呼吸,学习Git并学习如何设置适当的备份环境。如果您有一家公司及其客户站点,请提前告诉他们真相。您可能会失去他们,但是失去客户(您可以赢得新客户)比声誉更好。
我如何知道是否有人利用此漏洞来入侵我的网站?
您的Drupal 7或8网站可能会遭受数据丢失或盗窃的侵害,可以删除,删除或更改数据,从而以多种方式对网站造成破坏。
有关检查您的网站是否被黑客入侵的一般信息,请参见此Stack Exchange帖子。
如果执行得当,他们将如何利用此漏洞?
该漏洞利用是一个远程执行代码漏洞,这意味着任何数据都可能受到影响。
此漏洞利用的风险评分为21/25,几乎是它的最高分数。此风险评分还定义了以下漏洞,其中包括:
我现在不能更新我的Drupal网站,有什么好的方法可以轻松地修补此漏洞?
如果您无法立即更新核心,则有一个可用的补丁。从Drupal.org:
如果您正在运行7.x,请升级到Drupal 7.58。(如果无法立即更新,则可以尝试应用此修补程序来修复漏洞,直到能够完全更新为止。)
如果您正在运行8.5.x,请升级到Drupal 8.5.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();
救。
放松。
这是一个简单的1-2-3流程:
如果您没有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;
+ }
+
+}