|

Базы данных: мегабайты удовольствия
Как ломается SQL
Xakep, номер #040, стр. 040-066-2
Microsoft OLE DB Provider for ODBC Drivers (0x8004CC14)
[Microdoft][ODBC SQL Server Driver][SQL Server][Unclosed
quotation mark before the character string ")'.
/default.asp, line 239
или что-нибудь очень похожее, то мы на верном пути и флаг нам в руки.
Теперь представим, как идет обмен данными между SQL-сервером и нашим глючным приложением. Вот тебе уязвимый кусочек asp-кода, не запрещающий sql injection:
var sql = "select * from users where
username = '" + username + "' and password = '" + password + "'";
Таким образом, если username=vasya и password=pupkin, то все сработает корректно и без ошибок и asp-скрипт передаст SQL-серверу команду
select * from users where username='vasya' and password='pupkin'
Но ежели мы наглым образом сделаем своим именем пользователя vasya', то команда станет такой:
select * from users where username='vasya'' and password='pupkin'
После этого запроса SQL глюканет и выдаст нам ошибку, мол мы кавычек слишком много насажали. Теперь будем думать логически: нам нужно обойти проверку имени и пароля в этом скрипте, т.е. отбросить кусок запроса "and password='pupkin'". Разработчики SQL все уже придумали до нас, и нам всего лишь остается закомментировать этот хвост. В языке SQL все комментарии начинаются с двух минусов (--), и все, что идет после них, сервер в расчет не берет; т.е. чтобы заставить рассмотренный выше кусочек asp'a пустить нас без пароля вместо юзернейма "vasya", надо будет вписать вот такую байду:
"vasya'; -- " (без кавычек, естественно)
Теперь разберемся, какой символ что тут означает. Кавычка после vasya закрывает поле username; точка с запятой говорит, что в данный момент у нас это конец всей команды; а два минуса показывают, что можно забить на все идущее после них.
Смотрим кишки базы
Так, без пароля нас уже пускают, но это еще не все, что можно сотворить с атакуемой машиной. Для начала нам нужно узнать, какие базы данных есть на удаленной машине. Чтобы это узнать, возвращаемся к нашему полю для ввода username'a и пишем туда такую вещь:
"vasya'; show databases; --" (опять же без кавычек)
Если после отправки такой формы на сервер тебе вывалится списочек, чем-то похожий на этот:
mysql> show databases;
+----------+
| Database |
+----------+
| MYSQL |
| TEST |
| voy |
+----------+
3 rows in set (0.00 sec)
то мы не просто на верном пути, мы лошадиными шагами движемся к получению свопа всех баз данных на сервере. Я думаю, посланную команду подробно разбирать не надо, тут все не сложно, только одна маленькая заметка: в языке SQL в одной строчке может быть несколько команд, разделенных точками с запятыми. Этим-то мы в основном пользоваться и будем.
После того как мы узнали список баз данных, нам нужно увидеть список таблиц в каждой из них. Чтобы осуществить такую задумку, в поле username пишем:
"vasya'; use mysql; show tables; -- "
Назад на стр. 040-066-1 Содержание Вперед на стр. 040-066-3
|