• 4 июля стартует курс «Python для Пентестера ©» от команды The Codeby

    Понятные и наглядные учебные материалы с информацией для выполнения ДЗ; Проверка ДЗ вручную – наставник поможет улучшить написанный вами код; Помощь преподавателей при выполнении заданий или в изучении теории; Групповой чат в Telegram с другими учениками, проходящими курс; Опытные разработчики – команда Codeby School, лидер по информационной безопасности в RU-сегменте

    Запись на курс до 15 июля. Подробнее ...

  • 11 июля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 20 июля. Подробнее ...

Статья Автоматизация эксплуатации слепой инъекции при помощи Burp Suite

Привет всем!

На написание этой статьи меня сподвигло обучение на курсах WAPT от Codeby. Получилось так, что по условиям обучения, не приветствуется использование любых сканеров уязвимостей или автоматических средств их эксплуатации (sqlmap, tplmap и др.). На экзамене это будет строжайше запрещено. Организаторы настроены научить нас эксплуатировать все уязвимости вручную (ну или почти вручную). Не возбраняется использование только программы Burp Suite или самописных скриптов на, например, Python или Bash. К моему глубочайшему сожалению, я не могу похвастаться профессиональным или хотя бы приемлемым владением данных языков.

Поэтому при решении задач по SQL-инъекциям, где они были слепые, мне приходилось рассчитывать на программу Burp Suite и собственную зад...цу (которую приходилось отсиживать в процессе извлечении информации из базы данных (БД). Все дело в том, что слепая SQL-инъекция (Blind SQL-injection) это такой вид уязвимости, при котором нельзя увидеть ответы ошибок на странице и соответственно потом вывести информацию из БД в уязвимые поля. При таком типе инъекций мы можем только наблюдать реакцию приложения на то или иное изменение в нашем запросе. Для удачной эксплуатации этой уязвимости нужно, сохраняя валидность вытягивать информацию по буковкам. Поверьте мне, это очень долго. Хорошо, если таблица одна, а в ней три колонки, и значения переменных в них не более 20 символов каждая. Тогда у вас на это уйдет всего 3-4 часа. А если нужно выудить БД, состоящую из 5 таблиц с 10 полями каждая и со значениями полей с пофиг каким числом символов? Уверяю вас, дорога в хозяйственный магазин за веревкой и мылом будет значительно короче и займет меньше времени.

Так как суицидничать мне не хотелось, пришлось изворачиваться как ужу на сковородке. Первым делом я начал гуглить и искать труд умных людей, которые пишут на Питоне и уже сталкивались с подобной трудностью и написали подходящий скрипт. А так, как я по жизни ишак и неудачник, то я не смог найти нужную мне информацию. Даже если бы я нашел подходящий скрипт, то не понял бы его предназначение. Поэтому я продолжил поиски уже в другом направлении - искал примеры автоматизированного использования Burp Suite для подобных целей. По вышеуказанным причинам, мне удалось найти только разрозненные сведения в этой области. Честно говоря, и нормального пособия то по Burp Suite в русскоязычном сегменте нет (может и есть, но смотрите выше).

Просмотрев то что нашел, я подумал, как это можно использовать для решения своей проблемы. Кое что надумал.

Итак, начнем!

В качестве примера буду использовать скрины из заданий курса WAPT. По этичным соображениям, я буду закрашивать некоторые части картинок, чтобы модераторы лишний раз не называли меня вонючим козлом и, не дай Бог, не забанили. Но думаю, даже с закрашенными полями все должно быть понятно.

1. Имеется сайт, где мы совершенно случайно нашли SQL-инъекцию. Подставив все возможные пейлоады вы поняли, что попытки вставить операторы union select или order by ни к чему не приведут. Но зато приложение своим выводом реагирует на условия 1=1 и 1=2 (Рис. 1, 2)​

1640462656385.png


1640462781459.png


Как мы видим, приложение реагирует на ложь выводом некой фразы. В случае истинного условия такого вывода нет. Сразу скажу, что подстановка других пейлоадов ни к чему не привела и все время выдавалась эта фраза (искал во всех словарях слово Wuuuut, не нашел. Плохие словари). С высокой долей вероятности мы имеем слепую sql-инъекцию и будем ориентироваться на этот вывод - если эта фраза присутствует в ответе, то мы неправильное ввели значение в запросе. В целях экономии вашего и моего времени, я не буду показывать как это будет производиться вручную. Перейду сразу к процессу автоматизации.

2. Первое, что нам нужно узнать это количество символов в названии БД. Сначала выполним следующий запрос: passwd=' and length(database())<10# submit=work​

1640463647842.png


Как видим, дурацкая фраза присутствует, значит в названии нашей БД >= 10 символов. Уточним. Пробуем другой пейлоад passwd=' and length(database())>10# submit=work



Никакого вывода нет. Вот теперь мы точно знаем, что в названии БД больше 10 символов.
3. Изменим наш запрос: passwd=' and substring(database(), 1, 1)='a'# submit=work (я просто уверен, что вы способны разобраться с функциями length и substring самостоятельно, поэтому не буду объяснять их назначение) и отправим его в Intruder. В Интрудере очистим поля для постановки пейлоадов, нажав кнопку Clear и выберем указанные на скриншоте значения (это номер по порядку символа в названии БД и собственно сам символ), нажав кнопку Add, выберем тип атаки Claster Bomb (прочитайте про этот тип атаки самостоятельно).

1640465071538.png


4. Перейдем во вкладку Intruder payloads.
Payload set 1
Payload type Numbers
Payload Options:
From 1
To 20 (количество цифр устанавливаем такое, какой длины по нашему мнению может быть название БД)
Step 1

1640467557201.png


Payload set 2
Payload type Simple list
Payload Options - Load - Загружаем предварительно созданный файл, в котором в каждой строчке буква латинского алфавита или цифра или спецсимвол.
Пример:

a
b
c
...
A
B
C
...
1
2
3
...
(
)
{
}



5. По нажатию кнопки Start attack должен пойти цикл по двум пейлоадам, вывод который мы потом отсортируем, чтобы получить название БД.
Но перед этим зайдем во вкладку Options и в поле Grep - Extract добавим ненавистное нам слово Wuuuut (кстати напишите в комментах, что оно значит). Делается это нажатием кнопки Add и выбором этого слова в коде.

1640468140285.png


1640468037497.png


Вот теперь нажимаем кнопку Start attack.

6. Получим следующий результат:

1640468234641.png


Те поля, где присутствует наше любимое слово нам неинтересны, так как оно присутствует только при срабатывании ложного утверждения. Нам следует отсортировать полученные значения. Для этого сначала отсортируем столбец с первым пейлоадом.



А потом столбец со словом Wuuuut

1640468583492.png


Если мы после этого взглянем на столбец Payload 2, то увидим название БД расположенное по вертикали

1640469370470.png


Я замазал часть этого названия, чтобы организаторы курса не отбили мне почки, потому что это действующее задание, но можете мне поверить, что если вы все сделаете правильно, то получите нормальный результат. На извлечение названия БД ушло где-то 3 секунды. Это очень хорошее время. На извлечение всех таблиц, столбцов и дампа уйдет не более 40 минут, если БД будет не слишком большой. Если же вытягивать те же самые данные по-символьно, то уйдет в разы больше времени.
7. Для извлечения названия таблиц, столбцов и их содержимого нужно использовать следующие пейлоады:
passwd=' and substring((select table_name from infirmation_schema.tables where table_schema=database() limit 0,1) 1, 1)='a'# submit=work
passwd=' and substring((select column_name from infirmation_schema.columns where table_name= НАЗВАНИЕ ТАБЛИЦЫ limit 0,1) 1, 1)='a'# submit=work
passwd=' and substring((select ПОЛЕ from НАЗВАНИЕ ТАБЛИЦЫ limit 0,1) 1, 1)='a'# submit=work

Буду надеяться, что статья хоть кому-нибудь поможет в жизни. Спасибо за внимание и понимание!
 
Последнее редактирование:

BAO

Green Team
11.09.2019
56
27
Спасибо! Пригодилась статейка!!
 

N1GGA

Red Team
16.07.2018
254
197
Пригодится. Вставлю свои 5 копеек:
не обязательно burp’у передавать текст из тела. Можно просто смотреть на размер(Length) тела и отсортировать его таким образом, чтобы показывал только успешные запросы.
 
  • Нравится
Реакции: DragonFly

Paladin

Red Team
10.10.2021
25
133
Пригодится. Вставлю свои 5 копеек:
не обязательно burp’у передавать текст из тела. Можно просто смотреть на размер(Length) тела и отсортировать его таким образом, чтобы показывал только успешные запросы.
Спасибо за отзыв. Рад, что пригодится. В принципе согласен. Но в данном случае длина ответа одинаковая для всех запросов, здесь можно было бы сортировать по коду ответа. В другом случае наоборот. Но в курсе мне попадалась задача, где и код ответа и длина одинаковые. Поэтому я сразу показал вариант фильтрации по некоторому выводу в теле ответа.
 
  • Нравится
Реакции: BAO и DragonFly

DragonFly

Green Team
01.06.2020
222
59
Пригодится. Вставлю свои 5 копеек:
не обязательно burp’у передавать текст из тела. Можно просто смотреть на размер(Length) тела и отсортировать его таким образом, чтобы показывал только успешные запросы.
да, так я кстати и делал, но из тела тоже может пригодится, вдруг одинаковое количесво символов =)
 
  • Нравится
Реакции: BAO

DragonFly

Green Team
01.06.2020
222
59
Я кстати делал не )='a'#
а по коду ASCII пускал цикл в берпе 0-250 и проверял, а то бывало символ какой-то упустишь, а потом через эксель удобно получалось название таблицы или пароль из конкретного поля админа
1' or ASCII(substring((SELECT column_name FROM information_schema.columns WHERE table_name='НАЗВАНИЕ ТАБЛИЦЫ' limit 0,1), §1§, 1))=§97§#

не зря Берп назвыют швейцарским ножом.. один только интрудер чего стоит
 
  • Нравится
Реакции: BAO

BAO

Green Team
11.09.2019
56
27
Я кстати делал не )='a'#
а по коду ASCII пускал цикл в берпе 0-250 и проверял, а то бывало символ какой-то упустишь, а потом через эксель удобно получалось название таблицы или пароль из конкретного поля админа
1' or ASCII(substring((SELECT column_name FROM information_schema.columns WHERE table_name='НАЗВАНИЕ ТАБЛИЦЫ' limit 0,1), §1§, 1))=§97§#

не зря Берп назвыют швейцарским ножом.. один только интрудер чего стоит
а я просто сделал свой словарь с символами, но burp одинаково реагирует на заглавные и маленькие буквы. Так что вариант с ASCII наверное более практичный.
 

Paladin

Red Team
10.10.2021
25
133
Я кстати делал не )='a'#
а по коду ASCII пускал цикл в берпе 0-250 и проверял, а то бывало символ какой-то упустишь, а потом через эксель удобно получалось название таблицы или пароль из конкретного поля админа
1' or ASCII(substring((SELECT column_name FROM information_schema.columns WHERE table_name='НАЗВАНИЕ ТАБЛИЦЫ' limit 0,1), §1§, 1))=§97§#

не зря Берп назвыют швейцарским ножом.. один только интрудер чего стоит
Спасибо. Мне казалось, что способ со словарём практичнее, а попалось то, о чем ты говоришь, в пароле были пропущены 2 символа, я весь извелся, пока не нашёл ошибку.
 
  • Нравится
Реакции: BAO

Paladin

Red Team
10.10.2021
25
133
а я просто сделал свой словарь с символами, но burp одинаково реагирует на заглавные и маленькие буквы. Так что вариант с ASCII наверное более практичный.
И с таким вариантом тоже попался. Пароль оказался разносимвольным, помучиться пришлось.
 
Последнее редактирование:

BAO

Green Team
11.09.2019
56
27
Я кстати делал не )='a'#
а по коду ASCII пускал цикл в берпе 0-250 и проверял, а то бывало символ какой-то упустишь, а потом через эксель удобно получалось название таблицы или пароль из конкретного поля админа
1' or ASCII(substring((SELECT column_name FROM information_schema.columns WHERE table_name='НАЗВАНИЕ ТАБЛИЦЫ' limit 0,1), §1§, 1))=§97§#

не зря Берп назвыют швейцарским ножом.. один только интрудер чего стоит
оптимальным вариантом считаю набор символов от 32 до 126
 
  • Нравится
Реакции: N1GGA

digw33d

Green Team
23.01.2018
194
112
Спасибо, полезная инфа. Люблю такие кратенькие, понятные и юзабельные tricks & tips

Кстати, wut - намеренно искаженное написание слова what, сленг иначе говоря. Из серии cuppa = cup of..
 
Мы в соцсетях: