Sqlmap - это кроссплатформенный сканер с открытым исходным кодом, который позволяет в автоматическом режиме тестировать веб-сервисы на наличие SQL инъекций, а затем использовать их для получения контроля над базой данных.
Установка на Windows
Для начала работы нам необходимо установить Python. Установщик Python для Windows можно найти на
официальном сайте.
На сайте две ветки - 2.x и 3.x, но скачать и установить лучше ветку 3.x. Sqlmap корректно работают с каждой из этих версий, но в дальнейшем нам потребуется версия 3.x.
Загрузить последнюю версию sqlmap можно
здесь. Распакуйте архив в любую удобную папку (чтобы было проще ее найти, можно распаковать в папку С:\Users\).
Для запуска вначале нужно открыть командную строку. Нажмите Win+R, в появившемся окне введите cmd и нажмите enter. Пример запуска:
code:
С:\Users\Admin\sqlmap>python ./sqlmap.py -u http://161.35.92.161/page.php?id=2
Установка на Mac OS X
Для начала установим Python. Для этого откройте терминал и запустите следующую команду:
code:
brew install python3
Теперь установим sqlmap:
code:
brew install sqlmap
Запуск sqlmap для Mac OS X:
code:
sqlmap -u http://161.35.92.161/page.php?id=2 --dbs -o -random-agent
Проверяем на SQL-инъекции при помощи sqlmap
Начинаем проверку
Попробуем найти уязвимости следующей командой. Параметр --dbs означает, что нам интересны имена баз данных. В случае успеха и наличия уязвимости, после определения баз данных можно перейти к поиску таблиц и получения нужных данных. Команду необходимо вводить в консоль.
code:
python sqlmap.py -u http://161.35.92.161/page.php?id=2 --dbs -o -random-agent
Через некоторое время скрипт может попросить нас уточнить некоторые данные. Выбираем "нет", чтобы скрипт прогнал все тесты.
Скрипт выводит отчет:
После продолжения анализа нас в первую очередь интересует строчка в конце:
Цитата:
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N].
Как можно видеть, скрипт определил, что параметр id уязвим и предлагает протестировать другие параметры. В нашем конкретном случае других параметров нет, но в реальных веб-приложениях таких параметров может быть десятки, так что имеет смысл проверить все.
Итоговый отчет:
В итоге скрипт не только определил, что параметр id является уязвимым, но и версию СУБД, а также получил название используемой базы данных на сервере - vc_test, в которой содержится контент сайта. Эту информацию можно найти в конце сгенерированного отчета.
В дальнейшем для злоумышленника уже, как правило, не проблема получить данные в таблицах, а, возможно, и полный контроль над всей БД, а то и всем нашим сервером, если для запросов используется пользователь с широкими правами.
Кроме того, sqlmap позволяет задавать http заголовки и параметры Cookies, что довольно удобно для тестирования, особенно когда для получения результата запроса требуется авторизации.
Пример тестирования POST-запроса. Параметры, которые передаются в теле запроса, записываются в опцию скрипта
--data. Необходимые параметры для POST-запроса можно подсмотреть в консоли браузера (Ctrl + Shift + I в Windows, затем перейти в вкладку Network, совершить нужное действие, а затем изучить каким образом формируется запрос).
code:
sqlmap.py -u http://localhost/login --data="username=alex&password=pass" --dbs -o -random-agent
После авторизации обычно необходимо передать нужные Сookie. В sqlmap за это отвечает опция
--cookie. Нужные значения cookies можно получить в инструментах разработчика вашего браузера. (в Windows ctrl+shift+i, затем найдите вкладку Network, а в ней щелкните на запрос с именем домена сайта. В окне справа пролистайте пока не увидите параметр cookie).
Пример команды sqlmap c опцией --cookie:
code:
sqlmap.py -u http://localhost/create --data="name=alex&message=hacked" --cookie="security_level=low; PHPSESSID=05aa4349068a1kkaje4kcqnr9o6" --dbs -o -random-agent
Если параметров несколько, то можно явно указать, какой параметр будем тестировать с помощью опции -p
code:
sqlmap.py -u "http://localhost/profile/?username=alex&page=2" -p username
Можно задавать http заголовки через опцию
--headers. Это крайне полезно для тестирования ваших API.
Также если get параметр передается не как get параметр, а как URI, то, в этом случае нужно явно указать с помощью *, что данная часть URI является параметром.
Пример:
code:
sqlmap.py -u "http://localhost/api/v2/news/2*" --headers="Authorization: Bearer " --dbs -o -random-agent
Таким образом можно довольно тщательно протестировать ваше веб-приложение на наличие SQL инъекций.
vc.ru