Наверняка многие заметили, что в публикуемых тасках, преобладает сервер-сайд. И это не совсем честно по отношению к любителям другой стороны. Тем более, что античат является одним из первооткрывателей атак типа Cross Site Scripting и HTML Injection. А некоторые участники форума, заслуженно, получают респекты от ведущих мировых экспертов по безопасности в сфере клиент-сайда (!) Но правда в том, что CSS-ки уже давно не активные/пассивные, толерантный запад навязал нам свои Reflected и Stored, а эксплуатация стала довольно-таки нетривиальной. Поэтому, предлагаю показать здесь свои знания и умения в программировании на HTML, в нестандартных условиях, и немного понастальгировать css.ctf.antichat.com Правила просты: Для того чтобы проявить знание, нужно сконструировать XSS пейлод для текущих версий Chromium/Firefox, выводящий в алерте document.domain, и отправить мне в ЛС. Вектор может быть как с пользовательским взаимодействием (onmouseover, onclick и т.п.), так и без него. Пример: Code: http://css.ctf.antichat.com/?q=<script>alert(document.domain);</script> Spoiler: alert Умение, проявить проще, нужно сделать оригинальный дефейс и выложить его в этой теме. Пример: Code: http://css.ctf.antichat.com/?q=<h1>HACKED+BY+VASYA+PUPKIN</h1> Spoiler: screenshot Скриншоты желательны, но не обязателены Знающие: НЕТ / РЕШЕНИЕ! Умеющие: @ex0dus, @alexzir - Хостинг для таска предоставлен модной и молодёжной площадкой - ctf.antichat.com
http://css.ctf.antichat.com/index.php?i=<a href="https://antichat.com/" target="_blank" onclick=""><img src="https://i.ibb.co/H4FmFhP/123123123123.png"></a> Spoiler: Да пжалста)
круто) Только забыл <!-- чтобы тело спрятать http://css.ctf.antichat.com/index.p...//i.ibb.co/H4FmFhP/123123123123.png"></a><!--
http://css.ctf.antichat.com/?i=<mar...uee onstart=alert(document.domain) </marquee> Тело прятать не стал, без него эффект не тот
http://css.ctf.antichat.com/?i=<style>.hacked{position:absolute;width:1000px;height:1000px;margin-left:300px;}</style><img/class="hacked"/src=https://i.imgur.com/jKz7mmc.png> Spoiler: Click ^^
Окай, что-то негусто у нас с умеющими, а тем более со знающими, будем хинтить С самого старта задания присутствует бекап исходников - http://css.ctf.antichat.com/index.php~ В случае с XSS, атакующий контролирует первые байты документа (?) console.log(), в сорцах HTML, криво намекает, что пейлоды отлаживать следует именно так С этого момента, в CSP добавлен более широкий скоуп, что даёт большее количство вариантов эксплуатации в обоих случаях. Пример для "дефейса": Code: # Открывать в десктопном FireFox, хром какашка :( http://css.ctf.antichat.com/?i=%3Cimg/class=%27i%27/src=%27https://cdn.pixabay.com/photo/2015/10/08/16/14/click-978023_640.png%27/%3E%3Cstyle%3Ebody{cursor:pointer;color:yellow;transform:perspective(300px)%20rotateX(20deg);%20position:absolute;%20top:-200;%20bottom:200px;left:50px;right:50px;}marquee{width:100%;height:100%}.o{animation:blinker%203s%20linear%20infinite;}@keyframes%20blinker{50%%20{opacity:%200;}}.i{position:absolute;width:10%;top:10%;right:0%}.a{width:100%;height:100%;opacity:0;position:absolute;z-index:99}%3C/style%3E%3Caudio%20class=%22a%22%20controls%3E%3Csource%20src=%22https://antichat.com/attachments/10457/%22/type=%22audio/mpeg%22%3E%3C/audio%3E%3C/marquee%3E%3Cmarquee%20class=o%20direction=up%3E
https://www.w3.org/International/questions/qa-byte-order-mark Code: http://css.ctf.antichat.com/?i=%fe%ff%00
Доброго времени суток, уважаемые форумчане! @iBigBear был прав, стоило опубликовать решение давно. Тянул, забыл, прошу понять и простить Неожидано, но, к сожалению, решение вызвало трудности и нет ни одного решившего (по секрету: трудности возникли и у ребят парой уровней выше). Дефейсы так же протекали вяло, что уж тут говорить. Видимо не формат, мыж тут все тру, оставим это скрип-киддисам из лихих 90х Лично от себя хочу выразить жирный респектос @ex0dus и @alexzir, за то что поучавствовали в движухе ;-) Задание состояло из двух задач, которые участники должны были решить поочерёдно. Забайпасить фильтр опасных тегов/атрибутов и обойти ограничение CSP, соответственно. Были даны подсказки, после которых, дело должно было ускориться, но что-то пошло не так. Давайте вместе пройдёмся по решению и разберём некоторые подсказки. Итак, у нас в наличии ретро-страница портала "Античат", с возможностью внедрения произвольного контента, вида: http://css.ctf.antichat.com/?i=<marquee><h1>Привет! Ломай меня полностью!</h1></marquee> Доверчивый и неискушенный участник, скорее всего, первым делом, начнёт вставлять тег <script>: http://css.ctf.antichat.com/?i=<script>alert()</script> Но вместо требуемого алерта, получит такой ответ: <sc_с00lhax0r_ript>alert()</sc_с00lhax0r_ript> - это определённо не то, что нужно. Попробовав сотню другую нагрузок, можно убедиться, что фильтр непробиваемый и влоб его прошибить не получится. Тем более, что позднее последовала серия подсказок. Из которых, в том числе, можно было получить исходный код скрипта и убедиться, что простые методы здесь не работают. Хотя решение по кейсу, как раз таки входит в число таковых и ему сто лет в обед. Название задания и возраст странички для дефейса, честно об этом намекали. Поэтому, чтоб никого не обижать, отнесём его к числу "хитрых" байпасов и продолжим дальше. Следущая подсказка гласит: - В случае с XSS, атакующий контролирует первые байты документа (?) А значить это может то, что сначала идёт заголовок, а дальше тело ответа и первые его символы под контролем атакующего. Позднее был дан готовый ответ. Оставалось либо загуглить, либо вчитаться внимательно: Что же там вообще написано и как это применить, можно попробовать почитать в одном из вариантов описания, к примеру на русском - https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов Из всего прочитанного нужно понять, что при определённых последовательностях байт в потоке данных, мы можем переключать UTF кодировку символов, точнее стандарты и приложения это могут и делают прозрачно. Но самое главное для нас, вот этот момент: Проще говоря, даже намеренно упрощая, не погружаясь во всякие endian-ы, так как сам пока полностью не въезжаю во все эти стандарты, следует понимать, что если в заголовке явно задана кодировка, типа как у нас и ещё на миллионе других сайтов: То это, в ничего ещё не значит, если в начале документа/потока идёт маркер последовательности байтов aka BOM. Воспользовавшись подсказкой выше, посмотрим ещё раз как это выглядит: А вот в какую абракадабру при этом браузер превращает ответ: Можно даже попробовать перевести это чудо, возможно там есть ещё одна подсказка: Хммм, подсказки нет... но всё равно забавно, особенно про суп из баранины, часто повторяется. Интересно какой набор из исходника даёт такую последовательность? Оставлю это для исследования тебе, читатель Особенно внимательные, скорее всего уже заметили, что в маркере, которы приведён в пример, есть один лишний нулевой символ. И поэтому хочу сразу оговориться, чтобы не вводить в заблуждение. К последовательности BOM он не имеет никакого отношения. А всего лишь является очередной завуалированной подсказкой, которая даёт понять, что нужно использовать начало диапазона символов UTF. К примеру <script>, набор из U+003C U+0073 U+0063 U+0072 U+0069 U+0070 U+0074 U+003E или в URL кодировке %00%3C%00s%00c%00r%00i%00p%00t%00%00%3E. Поэтому пробуем: Бинго! Теги остались без изменений, браузер спокойно обработал эту "кашу из кодировок", а злой XSS фильтр нет. А теперь рука-лицо, если всё это вдруг показалось чем-то сложным, то в очень известной методичке PayloadsAllTheThings, был готовый вариант, стоило просто перебрать: Теперь же мы подошли ко второй части головоломки и заветного алерта мы всё ещё не видим, так как следущая подсказка гласит: - console.log(), в сорцах HTML, криво намекает, что пейлоды отлаживать следует именно так И действительно, видим, что CSP блокирует выполнение нашего пейлода: Поэтому, если не в курсе, то самое время почитать, что это такое https://en.wikipedia.org/wiki/Content_Security_Policy, ведь оно используется практически повсеместно, а гигантами IT уже давно. Вкратце, это такая злая штука которая блокирует возможность выполнение левых скриптов на странице, стилей, подгрузки картинок, которые могут быть внедрены в том числе и через отражённую XSS. Но, к счастью, в большинстве случаев это обходится, а некоторые компании даже платят исследователям за методы байпасса их конфигурации CSP для некоторых эндпоинтов и доменов (https://portswigger.net/research/bypassing-csp-with-policy-injection). После небольшого экскурса, давайте взглянем на тот, который нужно побороть нам: Очень хорошо, что для особо ленивых, гулаг сделал хороший чекер для этого дела https://csp-evaluator.withgoogle.com/. И мы имеем следущее: object-src был оставлен в надежде, что кто-то запалит или найдет зиродей Поэтому сосредоточимся на script-src. Описание директив, даёт лишь поверхностные варианты атаки, их гораздо больше и в текущем кейсе стоит понимать, что nonce нам точно не обойти, так как он генерится по спекам, т.е. всегда разный. Но есть возможность и очень большая вероятность, подключить что-то из разрешённого скоупа ( antichat.com *.antichat.com ) через атрибут src. Именно для этого и было сделано послабление: - С этого момента, в CSP добавлен более широкий скоуп, что даёт большее количество вариантов эксплуатации в обоих случаях. Так как первоначальный вариант был сильно ограничен и мне тогда показалось, что кто-то мог застрять на нём. Вайлдкард в свою очередь, мог позволить найти что-то на сабах античата, тот же ангуляр или какой-то скрипт, где нас ждёт eval с распростёртыми объятиями Но ближе к делу. Так как в конечном варианте решений уже может быть множество, расссмотрим первоначальный, который история для наблюдательного ресёрчера. Поэтому вернёмся в начало повествования, где говорится, что мы имеем произвольный вывод на страницу. А если он не один? Нет? А если найду? Чтоб не напрягать чёткого пацыка, т.е. меня (нет), идём ещё раз по линку и крутим страницу до конца: http://css.ctf.antichat.com/?i=<marquee><h1>Привет! Ломай меня полностью!</h1></marquee> Да и в том же исходнике, видно, что вывода два: PHP: <?php...print header("Content-Security-Policy: default-src 'self' ".$host." *.".$host."; frame-src 'self' ".$host." *.".$host."; script-src 'nonce-".$nonce."' 'self' ".$host." *.".$host." 'unsafe-eval'; img-src 'self' ".$scheme."s:; font-src 'self' ".$host." *.".$host."; style-src 'self' ".$host." *.".$host." 'unsafe-inline' 'unsafe-eval'; connect-src 'self' ".$host." *.".$host." 'unsafe-inline'; form-action 'self' ".$host." *.".$host."; base-uri 'self' ".$host." *.".$host."; report-uri ".$host."/").$filtered;?>...</body></html><?=$filtered?> Но что это даёт? Спросит уже порядком подуставший читатель. Поэтому, спешу обрадовать, осталось совсем немного. Вернувшись ранее в начало нашего повествования, не будем далеко уходить и вспомним, что мы всё ещё контролируем первые байты тела ответа. И должны непременно этим воспользоваться, реюзнуть так сказать. Путём внедрения JavaScript кода и его посдедующим подключением через <script src>: . . . Как видно, из-за наличия двойного отражения в теле, используя бектики (или строковые литералы, спасибо ECMAScript 6), можем получить выражение вида alert(document.domain)-`__HTML_CONTENT__alert(document.domain)-`-alert(document.domain)-`__HTML_CONTENT__alert(document.domain)-`, тем самым завернув мешающий нам контент в строки. Ну и далее, дело техники, комбайним это дело с полученными ранее разработками и крафтим урл вида: http://css.ctf.antichat.com/?i=%fe%...00%3E%00%3C%00/%00s%00c%00r%00i%00p%00t%00%3E Вуаля, XSS