いくつかのサイトにLogging and Alertsモジュールをインストールしています。昨日、次のデータを含む一連の通知メールに気づきました。これらはPDOException
例外を生成しましたが、私が知る限り、悪意のあることは何もできませんでした。
このサイトは、2014-Oct-15に SA-CORE-2014-005 が発表されてから数時間後にパッチされました。
私は単に、これらのタイプのSQLインジェクション攻撃がDrupalでPDOExceptionsを作成するのではなく、問題のあるキー/値をインジェクションの試行から取り除くことを確認したいと思っています。パッチの前は、そのようなエラーは発生していませんでした。
LoggingAlertsモジュールからのメールタイトル: []エラー:PDOException:SQLSTATE [42000]:構文エラーまたはアクセス... メールメッセージ本文: [email protected]月曜、2014年11月17日11:04 AM 宛先:[email protected] サイト:https://site.com 重大度:エラー(3) タイムスタンプ:20141117 11:04:35 タイプ:php IPアドレス:128.xxx.xxx.xxx リクエストURI:https://site.com/?q=user/login リファラーURI: ユーザー:匿名(0) リンク: メッセージ: PDOException:SQLSTATE [42000]:構文エラーまたはアクセス違反:1064 You SQL構文にエラーがあります;正しい MySQLサーバーバージョンに対応するマニュアルを確認してください1行目でnear '' test 'AND status = 1'を使用する構文SELECT * FROM {users} WHERE name =:name_0、:name_1 AND status = 1; Array ( [:name_0] => test3 [:name_1] => test ) in user_login_authenticate_validate()( /var/w ww/mysite/htdocs/modules/user/user.module)。 $ _ SERVER => Array ( [HTTP_Host] => site.com [ HTTP_X_REAL_IP] => 198.101.235.xxx [HTTP_X_FORWARDED_FOR] => ...メール出力の多くの行...
この回答のとおり-Drupalは、Drupal 7.32現在のSQLインジェクション試行でPDOExceptionをスローします: https://drupal.stackexchange.com/a/133820/3279
テストモジュールから:
/**
+ * 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.');
+ }
+
理論的には、そうです、特定の脆弱性により侵害されたサイトがそのような行動につながる可能性があることは私の理解です。 Drupal.orgが推奨するように、このような場合はサイトを危険にさらしたものとして扱い、次のすべてのアクションがこのケースに適しているはずです。
あなたが述べたように、あなたが発表の直後にサイトにパッチを適用したという事実は非常に重要です。私が見た限りでは、ほとんどの攻撃はスクリプトによるものであり、そのような動作を引き起こす自動化された攻撃は(もちろん私の経験では)気になりませんでした。これもまた安心できるものではなく、厄介なことが起こった可能性についての考えです。
明らかなアクション(下記のリンクを参照)とは別に、うまく動作しないコードを確実によく見ていきます。また、優れたツールは、クリーンなコードと比較して常にdiffです。私もdbをよく見てみます。最後に、寄付されたモジュールの一部に7.32または更新された可能性のあるその他の問題が発生している可能性もあります。