Введение
Я уверен, что тебе не раз приходилось тратить довольно много времени на такое нудное и малоинтересное занятие, как определение количества столбцов между SELECT и WHERE, перебор названий таблиц, посимвольный брутфорс при атаках вида SQL Injection. Не удивлюсь, если ты скажешь, что тебе уже порядком надоело делать это вручную, каждый раз встречая эту уязвимость. Данная статья рассчитана на человека, знакомого со SQL инъекциями – в ней мы рассмотрим методы их автоматизированной эксплуатации на примере использования PHP скрипта SQLBruter 0.2, созданного мною специально для этих целей.
Изучение работы скрипта
Прежде всего давай проанализируем все возможности, а также обязательные параметры для запуска скрипта. Итак, программа предоставляет четыре способа перебора:
- перебор количества выбираемых полей;
- названий таблиц;
- названий столбцов;
- посимвольный перебор;
Кроме того, в скрипте предусмотрен вывод результатов в лог-файл и использование прокси для твоей анонимности. В качестве обязательных параметров тебе необходимо указать хост для подключения, путь к скрипту с уязвимым параметром и, конечно же, тип перебора. Таким образом, запуск программы осуществляется по следующей схеме: php sqlbruter.php HOST PATH MODE ADDITIONAL_PARAMS OPTIONS, где MODE – порядковый номер метода перебора. Что касается дополнительных параметров, то они зависят от конкретного способа брута. Весь принцип работы скрипта основывается на поиске строки, указанной пользователем через параметр <string>, в возвращенном ответе сервера на неверный запрос. Если она найдена, то программа будет продолжать перебор до тех пор, пока сервер не вернет совершенно иной ответ, то есть при выполнении условия. Думаю, здесь все просто и понятно, однако для правильной работы прежде всего нужно точно определить параметр <string>. Для этого необходимо выяснить реакцию web-приложения на запрос, содержащего кавычку в конце уязвимого параметра. В некоторых случаях в ответе сервера мы можем увидеть такую фразу:
MySQL error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘…’ at line.
Это означает, что разработчик скрипта позаботился о выводе ошибок, и при попытке подстановки неверного количества столбцов сервер всегда возвратит строку:
The used SELECT statements have a different number of columns.
Однако в большинстве случаев выводится стандартная ошибка PHP:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in z:\home\localhost\www\hackme.php on line 2
Стоит отметить, что тебе нужно передать скрипту строку, которая действительно содержится в ответе. Например, просто указав Warning: mysql_fetch_array() ты не получишь корректного результата, потому что в исходнике присутствуют HTML-тэги. Поэтому верным решением было бы – <b>Warning</b>: mysql_fetch_array(). Теперь давай рассмотрим каждый из методов перебора более детально.
Перебор количества выбираемых полей
Для этого способа тебе потребуется указать всего один параметр – <string>. Как его определить, ты уже знаешь. Кроме него есть еще один, необязательный аргумент ( -n) , отвечающий за максимальное количество столбцов. Скрипт будет проводить перебор, пока не достигнет этого значения. По умолчанию параметр –n равен пятнадцати. Пример запуска программы для брута количества выбираемых полей: php sqlbruter.php localhost “/index.php?id=1” 1 “The used SELECT statements have a different number of columns” –n=25
Перебор названий таблиц
Обычно, определив количество столбцов, хакер пытается вывести системную информацию с помощью SQL-функций user(), version(), database(). На основании полученных данных, он продумывает свои дальнейшее действия: если версия MySQL пятая, то ему не составит труда узнать названия всех таблиц благодаря системной базе данных information_schema, в которой также находятся и названия столбцов. Однако в четвертой версии и ниже подобной БД нет, поэтому остается лишь одно средство– брутфорс. Для перебора названий таблиц скрипту необходимо передать три обязательных параметра:
- <rows> – количество столбцов между SELECT и WHERE
- <string> – строка, которую вернул сервер в ответ на неправильный запрос. Обычно при попытке перебора названия таблицы сервер возвращает ошибку “Table ‘название_таблицы’ doesn’t exist”.
- <dic> – путь к словарю, содержащему предполагаемые названия таблиц.
Обрати внимание на то, что если твой словарь содержит выражения языка SQL (например union, outer, select и т.д.), то ты не получишь желаемого результата, так как сервером будет возвращена другая строка и, следовательно, программа будет считать ее удовлетворяющей условию. Кроме того, у тебя есть возможность указать префикс, который будет подставляться к каждому имени таблицы из словаря, с помощью необязательного параметра –pref. Пример запуска: php sqlbruter.php www.host.ru “/index.php?id=1” 2 13 “doesn’t exist” “/home/root/words.dic” –pref=phpbb
Перебор названий столбцов
Допустим, ты нашел таблицу users, названия столбцов которой тебе неизвестны. В этом случае тебе снова не обойтись без перебора. Для запуска скрипта тебе потребуется указать почти все те же параметры, что и при переборе таблиц, за исключением аргумента <table> – название таблицы, столбцы которой мы будем брутить. Таким образом, запускать программу будем так: php sqlbruter.php 127.0.0.1 “/index.php?id=1” 3 13 “users” “Unknown column” “/home/root/words.dic”
Посимвольный перебор
Я уверен, что ты слышал про такой вид атак, как blind SQL injection. Как известно, это обычная SQL инъекция, однако не выводятся сообщения об ошибках. Использовать этот способ уместно в случаях, когда версия MySQL третья и ниже, а также, когда мы не имеем возможности непосредственно изменить выводимые данные. Использование скриптов для успешной эксплуатации подобных уязвимостей просто необходимо. В интернете существует множество программ для этих целей, однако я рекомендую применять именно мой скрипт, так как он универсален. Для его запуска в режиме посимвольного перебора нужно указать два обязательных параметра:
- <query> – запрос, результат выполнения которого мы будем перебирать (например, user(), version(), database()). Если ты указал в качестве параметра <query> запрос типа “SELECT password FROM users WHERE username=’admin’”, то его необходимо заключить в скобки.
- <string> – строка, которая должна присутствовать в выведенном ответе web-сервера при выполнении условия.
Также необходимо уделить особое внимание диапазону перебираемых символов. Его можно указать через параметр –r, разделив двоеточием минимальное и максимальное значения порядковых номеров ASCII-символов. Например, аргумент -r равный 48:57 будет соответствовать поиску всех чисел. По умолчанию скрипт перебирает диапазон символов a…z, что соответствует кодам 97…122. Итак, запускаем следующим образом: php sqlbruter.php 127.0.0.1 /index.php?id=1 4 “version()” “Hacked!” -r=48:122
Необязательные параметры
Как уже упоминалось выше, в скрипте предусмотрены необязательные параметры, общие для каждого из способов перебора. • -o =[file] – вывод результатов в лог-файл (например, -o=”/home/root/result.txt”); • -p=[port] – порт (по умолчанию 80); • -P=[ip:port] – использование прокси (например, -P=127.0.0.1:8080). Необязательные параметры необходимо указывать только после определения всех остальных.
Заключение
Надеюсь, в данной статье ты нашел для себя что-то новое и теперь тебе не придется часами гадать названия таблиц. Напоследок стоит сказать, что немаловажную роль в быстродействии работы скрипта играют пропускная способность канала, а также версии PHP и MySQL, установленных на удаленной машине. Например, при раскладе PHP 5.1.2 + MySQL 5.0.18 скорость брута на 35% выше, чем при PHP 4.4.2 + MySQL 4.1.16. Также хочу отметить, что на данный момент существуют аналоги этой программы, например Injection Analyzer от Kuzya.
Leave a Reply