Понедельник, 21.07.2025, 05:04
FreZZe Zone
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории каталога
Безопастность [1]
Уязвимости [2]
Web мастеру [3]

Наш опрос
Какой у вас интернет?

Результат опроса Результаты
Все опросы нашего сайта Архив опросов
Всего ответов: 100
Всего голосовало: 100
Обсудить на форуме

Главная » Статьи » Уязвимости

Взлом SQL
В заметке рассматривается уязвимость SQL, связанная с проникновением в тело запроса.
 

Суть уязвимости

Рассмотрим работу простейшей системы с WEB-интерфейсом, позволяющей пользователям хранить и менять информацию о себе. Такие системы одни из самых распространенных в сети. Это может быть и гостевая книга, и чат, и фотогаллерея, и почтовый сервис.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Генерируемый запрос к базе даных должен содержать в себе логин и пароль, введенные пользователем. По этим полям БД должна найти соответствующую запись в таблице.  После обработки запроса, БД выдает найденную информацию о пользователе, которую PHP скрипт оформляет в виде HTML и возвращает пользователю.

Расcмотрим достаточно типичный фрагмент PHP скрипта, использующий SQL запрос для доступа к базе данных:

<?php
$result = mysql_db_query("database","select * from userTable where login = '$userLogin' and password = '$userPassword' ");
while($row = mysql_fetch_array($result)) {
    echo $row["fullname"];
   
echo $row["email"];
    echo $row["password"];

}
mysql_free_result($result);
?>

Как видим, логин и пароль, введенные пользователем содержатся в переменных $userLogin и $userPassword. Содержимое этих переменных встявляется в запрос для отфильтровки информации именно об этом пользователе. Фильтр задается с помощью опции where команды select SQL. В данном случае, запрос выглядит таким образом: select * from userTable where login = '$userLogin' and password = '$userPassword' где userTable - имя таблицы, содержащей нужную информацию. Если переменые логина и пароля содержат значения vanya и vasya соответственно, то запрос, отсылаемый БД, примет такой вид: select * from userTable where login = 'vanya' and password = 'vasya'. Понятно, что если в базе данных отсутствует запись, в которой логин равен vanya а пароль - vasya, до запрос не пришлет ни одной строчки из БД, и скрипт ничего не выдаст. Таким образом, приведенная система обеспечивает доступ к информации только пользователя, обладающего правильным паролем и логином.

Казалось бы, такая система не содержит изъянов. На самом деле, это не так. Логика программиcтов, создававших приведенный выше пример, подразумевает, что введенные пользователем логин и пароль, будут содержаться внутри одинарных кавычек, которые жестко забиты в теле запроса. Однако, посмотрим, что произойдет, если сам пароль, введенный пользоваетелм содержит кавычку. Пусть он имеет значение vas'ya, тогда запрос примет вид: select * from userTable where login = 'vanya' and password = 'vas'ya'. При исполнении такого запроса, безусловно возникнет ошибка, поскольку кавычка из пароля, закрыла открывающую кавычку из запроса, и конец пароля ya' остался "висеть" вне условного выражения.

А если вставить в качестве пароля  такую строку: ' or 1=1 ' , то запрос станет таким: : select * from userTable where login = 'vanya' and password = '' or 1=1 '' и не будет содержать синтаксических ошибок. Зато логическое выражение станет тождественно истинным, и в ответ на этот запрос, SQL выдаст всю базу данных пользователей 8-).

Таким образом, используя символ апострофа, мы можем прникнуть в тело SQL запроса и сделать так, что бы  проверяемое условие было истинным. Если нас интересует конкретный пользователь vanya, то для получения информации о нем, можно воспользоваться такой строкой пароля: ' or login = 'vanya. При этом запрос станет таким: select * from userTable where login = 'vanya' and password = '' or login = 'vanya' . Как вы понимаете, в результате мы получим информацию именно о vanya.

Описанная уязвимость сервисов, основаных на SQL, не ограничивается несанкционированным получением информации. Поскольку в таких системах используется, как правило, MySQL, то имеется возможность не только модифицировать условное выражение в команде select, но и выйти за пределы этой  команды, и выполнить другую команду БД. Поскольку в MySQL допускается несколько команд в одном запросе, разделенных ; , то мы можем выполнить любую из этих команд, введя в поле пароля следующий код: ' ; <командаSQL> где в качестве <командаSQL> можно указать любую допустимую команду. Так например такой код: ' ; drop table 'userTable просто напросто уничтожит таблицу userTable из базы данных.

Практическое использование уязвимости

Несмотря на простоту, практическое использование ошибок SQL запросов весьма затруднительно.

В этой главе рассмотрим следующие проблемы, возникающие при использовании описываемой уязвимости:
  • Определение факта использования SQL в системе.
  • Выявление факта наличия уязвимости. Выяснение реакции скрипта на ошибки.
  • Определение имен полей в таблице.
  • Определение имен существующих таблиц.

    Рассмотренная уязвимость присуща всем SQL запросам, независимо от скрипта или программы, откуда они вызываются. Однако мы будем рассматривать системы, основанные на PHP. Это связано с тем, что поток ошибок PHP как правило (по умолчанию) направляется конечному пользователю. В то время как Perl или Exe приложения обычно не информируют пользователя о характере ошибок.

    Определение факта использования SQL в системе.

    При исследовании конкретной системы, нужно в первую очередь выяснить использует ли она SQL.
    Этот факт можно выявить либо косвеными путями (просмотрев имена используемых файлов, ссылки на используемые средства и т.д.), либо непосредственно - заставив SQL проявить себя. Если мы рабоатем с PHP, то существует только один способ определить однозначно использование SQL - это вызвать ошибку его выполнения. Если при выполнении запроса происходит ошибка, и а PHP скрипте явно ошибки не выпонения не обрабатываются, то сообщение об ошибке PHP выдаст прямо на страницу пользователя.
    Как вызвать ошибку выполнения SQL запроса зависит от конкретного утройства рассматриваемой системы. В большинстве случаев ошибку можно вызвать введя в систему некорректные данные.

    Выявление факта наличия уязвимости. Выяснение реакции скрипта на ошибки.

    Наиболее простой способ выявления наличия уязвимости, а заодно и факта использования SQL, является следующий: В любом поле, которое предположительно участвует в формировании SQL запроса (например поле Login или Password), вводим знак одинарной кавычки. Остальные поля заполняем любыми корректными данными (либо оставляем пустыми, если это допускается системой). Отослав данные формы, смотрим на реакцию системы. Если в результате PHP скрипт выдает нам ошибку SQL, то можем себя поздравить: в системе используется SQL и скрипт не фильтрует одинарную кавычку. То есть система содержит уязвимость.
    Ошибка SQL запроса будет в таком случае выглядеть на страничке примерно так:
    Форма ввода данных: 
  •   
      
      
      
      
      
      
      
      
      
      
      
      
      
    Как результат-ошибка SQL запроса:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    Если кода ошибки SQL на странице нет, то это может означать следующее:
    1)Система содержит уязвимость, но скрипт PHP обрабатывает ошибки. В таком случае систему можно взломать, однако придется действовать "наощупь", поскольку мы не будем знать когда синтаксис SQL будет корректным, а когда нет.
    2)Скрипт фильтрует кавычку и потому ошибки не возникает. В таком случае система не содержит уязвимости.
    3)Система вообще не использует SQL.
    В двух последних случаях понятно, что дальнейшее исследование SQL не имеет смысла.

    Определение имен полей в таблице.

    Для того, что бы получить информацию из базы данных с конкретными данными, мы должны определить значения некоторых полей в запросе (например задать логин пользователя). Однако для этого нужно знать имя соответствующих полей. Напрямую узнать эти имена возможности нет. Поэтому тут придется искать эти имена методом перебора. Эти имена могут совпадать с именами полей в форме, отсылаемой на сервер,а могут и не совпадать. Благое дело, что имена полей как правило стандартны и вариантов написания их не так много. Так, например, имя поля для имени пользователя скорее всего будет login или user или nick. Аналогично для пароля: password или pwd или pass.
    Для определения существования определенного поля, предлагается простой метод: Пусть мы хотим проверить существует ли поле pwd в таблице. Введем в любом поле формы такую строку ' pwd='. Если поле pwd существует в таблице, то SQL корректно обработает запрос, если же такого поля нет, то опять возникнет ошибка выполнения SQL. Таким образом подставляя разные значения имен полей и анализируя результат обработки запроса, мы можем выяснить какие поля существуют в таблице, а какие нет.

    Определение имен существующих таблиц.

    Аналогично методике нахождения имен полей в таблицах, можно искать и имена существующих таблиц в базе данных. Пусть мы хотим выяснить существует ли в базе таблица adminList. Для этого введем в нектором поле формы такую строку ';select * from adminList. Если в результате ошибки SQL не возникает, значит таблица adminList существует. Для корректности этого теста, необходимо вводить эту строку в то поле, которое фигурирует последним в SQL запросе. Это необходимо для того, что бы не вызывалась ошибка синтаксиса из-за оставшегося "хвоста" исходного запроса, который будет присутствовать после select * from adminList. Отметим, что если форма для запроса имеет два поля Login и Password, то скорее всего именно поле пароля будет фигурировать в запросе последним.

    P.S.

    Используя данную уязвимость, был взломан сайт http://www.bigmir.net (точнее его фотогаллерея и чат). Мы собщили об уязвимости владельцам сайта. Дыра была пофиксина. Но вот сейчас я еще раз проверил регистрационную форму чата. И обнаружил все ту же уязвимость 8-).

     




    Источник: http://old.antichat.ru/sql/
    Категория: Уязвимости | Добавил: frezze (22.11.2007) | Автор: FreeZze
    Просмотров: 11990 | Комментарии: 2 | Рейтинг: 5.0/2 |
    Всего комментариев: 2
    Дата: 02.11.2012 Сообщение # 2
    http://www.sarvajal.com - viagra

    Дата: 02.03.2009 Сообщение # 1
    Неплохо написано.

    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Форма входа

    Поиск

    Друзья сайта
    каталог сайтов
    ZumeR_Portal

    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Copyright MyCorp © 2025 Создать бесплатный сайт с uCoz