1. Мы продолжаем публиковать интересные статьи на тему SocialEngine 4. Одна из статей посвящена правильному выбору сервера для вашей социальной сети, а другая содержит советы по увеличению производительности платформы. Также мы добавили большую статью о пользовательских уровнях. Ознакомиться со статьями вы можете в разделе Вопросы и Ответы SocialEngine 4.
  2. Вам кажется, что ваша версия SocialEngine 4, работает медленно?

    Голосуйте. Пишите свою версию системы, железо на чем работает и количество пользователей. Будем увеличивать производительность :-) Подробнее

  3. В связи с участившимися случаями попыток продажи пользователями форума различных "сборок" коммерческих социальных платформ, обычно основанных на SocialEngine 3, вводится новое правило для форума. Запрещается создание тем или размещение в уже созданных предложений о продаже или размещение ссылок на сайты, где происходит продажа "сборок". Пользователи, которые продолжат свою коммерческую деятельность в данном направлении, будут заблокированы. Подробнее.

SQL-инъекции (в подробностях)

Discussion in 'PHP' started by J.O.K.E.R., Dec 17, 2010.

  1. J.O.K.E.R. Thread starter User


    Offline
    Message Count:
    152
    Likes Received:
    27
    SQL-инъекции — встраивание вредоносного кода в запросы к базе данных — наиболее опасный вид атак. С использованием SQL-инъекций злоумышленник может не только получить закрытую информацию из базы данных, но и, при определенных условиях, внести туда изменения.

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


    Code:
    <?php
    // подключение к базе данных
    $sql = "SELECT username, realname FROM users WHERE cityid=" . $_GET['cityid'];
    $result = mysql_query($sql) or die(mysql_error());
    // обработка результата и отображение списка пользователей
    ?>
    SQL-запрос получится таким:

    Code:
    SELECT username, realname FROM users WHERE cityid=20; DELETE * FROM users
    Запрос к БД будет иметь вид:

    Code:
    SELECT username, realname FROM users WHERE cityid=20 UNION SELECT username, password AS realname FROM users
    Давайте заключим пользователькую информацию в одинарные кавычки. Поможет ли это?
    Code:
    $sql = "SELECT username, realname FROM users WHERE cityid='" . $_GET['cityid'] . "'";
    Code:
    SELECT username, realname FROM users WHERE cityid='20' UNION SELECT username, password AS realname FROM users WHERE '1'
    Рассмотрим код:
    Code:
    $sql = "SELECT username, realname FROM users WHERE cityid='" . mysql_real_escape_string($_GET['cityid']) . "'";
    В случае использования mysql_real_escape_string() действия злоумышленника приведут к формированию запроса, который не является опасным, так как весь текст теперь внутри кавычек:
    Code:
    SELECT username, realname FROM users WHERE cityid='20\' UNION SELECT username, password AS realname FROM users WHERE \'1'
    Итак, чтобы защититься от SQL-инъекций, все внешние параметры, которые могут содержать текст, должны быть перед включением в SQL-запрос обработаны с помощью mysql_real_escape_string() и заключены в одиночные кавычки.

    Если известно, что параметр должен принимать числовое значение числовым, его можно привести к числовому виду явно с помощью функции intval() или floatval(). В данном примере мы могли бы использовать:
    Code:
    $sql = "SELECT username, realname FROM users WHERE cityid='" . intval($_GET['cityid']) . "'";
    Отличия mysql_real_escape_string() и mysql_escape_string()
    Мы рассмотрели наиболее простой пример, но на практике уязвимый запрос может быть более сложным и не отображать свои результаты пользователю. Далее рассмотрим примеры SQL-инъекций в некоторых более сложных случаях, не претендуя на полноту.
    Инъекция в сложных запросах

    В простейшем примере была возможность встроить код в конец SQL-запроса. На практике в конце SQL-запроса могут быть дополнительные условия, операторы сортировки, группировки и другие SQL-конструкции. В каждом конкретном случае, злоумышленник постарается встроить вредоносный кусок таким образом, чтобы запрос в целом остался синтаксически корректным, но выболнял другую функцию. Здесь мы рассмотрим простейший пример уязвимого запроса с дополнительным условием.
    Code:
    $sql = "SELECT username, realname FROM users WHERE cityid='" . $_GET['cityid'] . "' AND age<'35'";
    В этом случае, злоумышленник может нейтрализовать дополнительное условия, передав в качестве параметра cityid 20' UNION SELECT username, password AS realname FROM users WHERE 1 OR '1, что приведет с формированию следующего запроса:

    Code:
    SELECT username, realname FROM users WHERE cityid='20' UNION SELECT username, password AS realname FROM users WHERE 1 OR '1' AND age<'35'
    В результате условие age<35 не будет влиять на выборку, т.к. оператор OR имеет более низкий приоритет, чем AND, и WHERE из приведённого выше запроса по-другому можно записать в виде WHERE (cityid='20' AND 1) OR ('1' AND
    age<'35') (напомним, что выражение WHERE 1 истинно всегда). В результате под условие подойдут и те строки, у которых cityid='20', и те, у которых age<35, причем наличие последних не обязательно.

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

    Может оказаться, что уязвимым является запрос, результаты которого не отображаются пользователю. Это может быть, например, вспомогательный запрос:
    Code:
    $sql = "SELECT count(*) FROM users WHERE userid='" . $_GET['userid'] . "'";
    Запрос выше всего лишь проверяет наличие пользователя с данным userid: если он возвращает любую отличную от нуля величину — показывается профиль пользователя с соответствующим userid, если же возвращён 0 (то есть, нет пользователей, удовлетворяющих критерию запроса) — сообщение "пользователь не найден".

    В этом случае определение пароля (или другой информации) производится перебором. Взломщик передает в качестве параметра userid строку 2' AND password LIKE 'a%. Итоговый запрос:
    Code:
    SELECT count(*) FROM users WHERE userid='2' AND password LIKE 'a%'
    Взломщик получит "пользователь не найден", если пароль не начинается на букву 'a', или стандартную страницу с профилем пользователя, в противном случае. Перебором определяется первая буква пароля, затем вторая и.т.д.
    .
    Выводы
    Все запросы, использующие внешние данные, требуется защитить от SQL-инъекций. Внешние данные могут быть переданы не только в качестве GET-параметров, но и методом POST, взяты из COOKIE, со сторонних сайтов или из базы данных, в которую пользователь имел возможность занести информацию.
    Все числовые параметры следует явно преобразовывать в числовой вид с помощью функций intval() и floatval()
    Все строковые параметры следует экранировать с помощью mysql_real_escape_string() и заключать в кавычки.
    Если построить SQL-инъекцию сложно, не следует ожидать, что злоумышленник не догадается как это сделать. Особенно это относится к движкам, исходный код которых является публичным.

    Удачи в построении безопасных приложений!
  2. galstuk Famous member


    Offline
    • Знаменитый
    Message Count:
    398
    Likes Received:
    151
    Не в обиду топикстартеру будет сказано, НО зачем же, ребят, просто копировать такие статьи на форум из других источников? При том без ссылки на автора данной статьи и даже самому не имея представления о том, как конкретно работает инъекция. Просто кому нужно, то тот и так найдет эти статьи.
    Другое дело, если бы вы выкладавыли чисто то,что сами делали... А так, простой копипастинг,никому не нужен. ИМХО. ;)
  3. dream User


    Offline
    Message Count:
    144
    Likes Received:
    32
    да...надо хотябы сортировать материал...что надо а что нет... ;)

    ---------- Сообщение добавлено в 23:37 ---------- Предыдущее сообщение было в 23:27 ----------

    помойму так удобнее всего.TUT..ИМХИО и новичкам особенно проще будет ;)

    ---------- Сообщение добавлено в 23:39 ---------- Предыдущее сообщение было в 23:37 ----------

    галстук, еммм а когда вы статейку допишете ;)
  4. SpartakuS User


    Offline
    • Знаменитый
    Message Count:
    797
    Likes Received:
    82
    Ужасный вывод. Вывод из статьи, которую я не читал.
    1) Все значения надо заключать в кавычки и экранировать там эти самые кавычки. Да, да и в цифровых тоже.
    2) Частный случай с оператором LIKE и REGEXP. В первую очередь LIKE ибо очень распространен. Тут уже решать вам. Обычно такие операторы в поисках простых юзают, да алфавитных списках. Особой угрозы не представляют, если применять их только там, где они действительно нужны.
  5. ExTRANE Active member


    Offline
    Message Count:
    278
    Likes Received:
    62
    В стандартных плагинах SE возможны SQL-инъекции ?!
  6. SpartakuS User


    Offline
    • Знаменитый
    Message Count:
    797
    Likes Received:
    82
    ExTRANE, защита хоть и дурацкая в се, но от sql-inj защищает достаточно надежно.
    Сам се в самом начале добавляет ко всем кавычкам в гет, пост, кукис слеши. То есть от тупой подстановки кавычки ничего не изменится. Остается лишь один выход. Искать в плагинах дыры через цифровые значения не находящиеся в интвале (кстати, именно такая была на с.....су, только в дле)
    Если найдете - пишите прадо или гусу в личку (моя закрыта), я поправлю уязвимость и выложу заплатку.
  7. shuranov Novice member


    Offline
    Message Count:
    6
    Likes Received:
    0
    Хорошая, действительно раскрывающая суть темы подборка расположена здесь: http://injection.rulezz.ru/ Особо внимание рекомендую обратить на статью Посимвольный перебор, можно узнать гораздо больше нюансов о SQL Injection, чем обычно описывают в статьях.

    [offtop]Матвей, здесь все сообщения проходят обязательную премодерацию? Или это только для новых участников?[/offtop]
  8. SpartakuS User


    Offline
    • Знаменитый
    Message Count:
    797
    Likes Received:
    82
    3 поста, Слав
  9. shuranov Novice member


    Offline
    Message Count:
    6
    Likes Received:
    0
    У меня их уже четыре, а посты все модерации требуют :)

Share This Page

All rights reserved SocEngine.ru ©