Client-Side Fundamental
  • Добро пожаловать
  • Глава 1 - Начало работы с XSS
    • Браузерная модель безопасности
    • Знакомимся с уязвимостью XSS
    • Более глубокое понимание XSS
    • Опасный псевдопротокол javascript
  • Глава 2 - Защита и Обход для XSS
    • Первая линия обороны от XSS - Sanitization
    • Вторая линия обороны от XSS - CSP (Content Security Policy)
    • Третья линия обороны против XSS - сокращение области воздействия
    • Последние методы защиты от XSS - Trusted Types и встроенный Sanitizer API
    • Обход защитных мер - Обычные способы обхода CSP
    • Обход защитных мер - Mutation XSS
    • Самая опасная XSS - Universal XSS
  • Глава 3 - Атаки без JavaScript
    • Кто сказал, что для атаки обязательно выполнять JavaScript?
    • Prototype Pollution - Эксплуатация цепочки прототипов
    • Может ли HTML влиять на JavaScript - Введение в DOM clobbering
    • Template Injection in Frontend - CSTI
    • CSS Injection - Атака с использованием только CSS (Часть 1)
    • CSS Injection - Атака с использованием только CSS (Часть 2)
    • Можно ли атаковать, используя только HTML
  • Глава 4 - Межсайтовые атаки
    • Same-origin Policy и Same-Site
    • Введение в Cross-Origin Resource Sharing (CORS)
    • Проблемы Cross-Origin безопасности
    • Cross-Site Request Forgery (CSRF)
    • Спаситель от CSRF - Same-site cookie
    • От same-site до главного site
    • Интересная и практичная Cookie Bomb
  • Глава 5 - Другие интересные темы
    • То, что вы видите, это не то, что вы получаете - Clickjacking
    • Эксплуатация MIME Sniffing
    • Атаки на цепочку поставок во фронтенде - Attacking Downstream from Upstream
    • Атаки на веб-фронтенд в Web3
    • Самая интересная атака на побочные каналы фронтенда - XSLeaks (Часть 1)
    • Самая интересная атака на побочные каналы фронтенда - XSLeaks (Часть 2)
Powered by GitBook
On this page
  • Firefox's Adobe Acrobat Plugin in 2006
  • Android Chrome's UXSS in 2012
  • Chromium's UXSS via portal in 2019
  • Chromium's UXSS triggered by downloading images in 2021
  • Multiple UXSS in Brave Browser iOS App
  • Заключение
  1. Глава 2 - Защита и Обход для XSS

Самая опасная XSS - Universal XSS

PreviousОбход защитных мер - Mutation XSSNextКто сказал, что для атаки обязательно выполнять JavaScript?

Last updated 8 months ago

Все ранее упомянутые уязвимости XSS в основном вызваны плохой безопасностью сайта, позволяющим злоумышленникам выполнять код JavaScript на веб-сайте.

Однако есть еще один тип XSS, который еще опаснее, как намекает название: Universal XSS.

Причина проста: этот тип атак XSS нацелен не на сам веб-сайт, а на браузер или встроенные плагины.

Так как это уязвимость в браузере, самому сайту не нужно иметь каких-либо проблем. Даже чисто статическая веб-страница может быть уязвима для XSS. Атакуя браузер, достигается "возможность выполнения кода на любом сайте". Поэтому этот тип атаки называется универсальным XSS, или сокращенно UXSS.

Так как же создаются уязвимости UXSS? Давайте рассмотрим несколько примеров.

Firefox's Adobe Acrobat Plugin in 2006

В статье под названием , описывается UXSS, нацеленный на Firefox.

У плагина Adobe Acrobat в Firefox была уязвимость, при которой он неправильно проверял параметры. Загрузив PDF и добавив к URL параметр #FDF=javascript:alert(1), можно было выполнить XSS внутри этого PDF.

Например, https://example.com/test.pdf#FDF=javascript:alert(1). Простой просмотр этого URL-адреса приведет к выполнению кода JavaScript на источнике , что известно как UXSS.

Хотя изначальная статья не предоставляла подробной информации, я предполагаю, что основной принцип заключается в том, что плагин использует значение, переданное параметром FDF, чтобы выполнить функции вроде window.open, позволяя выполнение кода с помощью псевдо-протокола javascript:.

Android Chrome's UXSS in 2012

В 2012 году Takeshi сообщил об уязвимости: .

В мире Android есть так называемые "intentions". Например, если вы хотите открыть новый экран, вы отправляете "intentions" с сообщением "Я хочу открыть новый экран".

Если вы хотите открыть Chrome и просмотреть определенную страницу, вы можете написать соответствующий код на основе этого намерения:

// Declare a new intentIntent intent = new Intent("android.intent.action.VIEW");// The intent is for Chrome appintent.setClassName("com.android.chrome", "com.google.android.apps.chrome.Main");// Set the URLintent.setData(Uri.parse("
https://example.com
"));// Send the intentstartActivity(intent);

Комплектный код выглядит так (код из оригинального отчёта):

package jp.mbsd.terada.attackchrome1;import android.app.Activity;import android.os.Bundle;import android.content.Intent;import 
android.net
.Uri;public class Main extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        doit();    }    public void doit() {        try {            // Firstly, force chrome app to open a target Web page            Intent intent1 = getIntentForChrome("
http://www.google.com/1
");            startActivity(intent1);            // Wait a few seconds            Thread.sleep(5000);            // JS code to inject into the target (
www.google.com
)            String jsURL = "javascript:alert('domain='+document.domain)";            Intent intent2 = getIntentForChrome(jsURL);            // Need a trick to prevent Chrome from loading the new URL in a new tab            intent2.putExtra("com.android.browser.application_id", "com.android.chrome");            startActivity(intent2);        }        catch (Exception e) {}    }    // Get intent to invoke chrome app    public Intent getIntentForChrome(String url) {        Intent intent = new Intent("android.intent.action.VIEW");        intent.setClassName("com.android.chrome", "com.google.android.apps.chrome.Main");        intent.setData(Uri.parse(url));        return intent;    }}

Chromium's UXSS via portal in 2019

Причина этой уязвимости подобна упомянутому ранее случаю с Android. Вот пример кода (из оригинального отчёта):

const p = document.createElement('portal');p.src = '
https://mail.google.com';//
 after a while:p.src = 'javascript:portalHost.postMessage(document.documentElement.outerHTML,"*")';// the code above will get executed in the context of 
https://mail.google.com

Когда вы загружаете URL внутри портала, а затем загружаете javascript:, он выполнит JavaScript на источнике предыдущего загруженного URL. Другими словами, вы можете выполнить JavaScript на любом URL, что делает его UXSS. За эту уязвимость была предложена награда в 10 000 долларов.

Chromium's UXSS triggered by downloading images in 2021

Когда вы щелкаете правой кнопкой мыши на изображении в Chromium и выбираете его для загрузки, Chromium динамически выполняет небольшой кусок кода JavaScript на заднем плане. Он вызывает внутренние функции JavaScript, вроде:

__gCrWeb.imageFetch.getImageData(id, '%s')

Здесь %s - это имя файла изображения. Однако это имя файла не было должным образом отфильтровано, поэтому, если имя файла - '+alert(1)+', код станет:

__gCrWeb.imageFetch.getImageData(id, ''+alert(1)+'')

Это выполнит alert(1). Конечно, вы можете заменить его на любой код. alert(1) - просто пример.

Кроме того, если есть домен A, который встраивает домен B с помощью iframe, когда вы загружаете изображение на домен B, этот динамически генерируемый код JavaScript будет выполнен в окне верхнего уровня, которое является окном домена A.

Другими словами, используя эту уязвимость, если я могу встроить свой URL-адрес атаки в другой домен с помощью iframe, я могу выполнить произвольный код на этом домене, что приводит к UXSS.

Multiple UXSS in Brave Browser iOS App

Brave - это браузер, ориентированный на конфиденциальность, основанный на Chromium и созданный создателем JavaScript Brendan Eich. У iOS-приложения Brave было обнаружено множество уязвимостей UXSS японским исследователем безопасности Muneaki Nishimura (он также сообщал об UXSS в Chromium, упомянутом выше).

Причина этих уязвимостей подобна тому, что было упомянуто ранее. Это связано с тем, что приложение динамически выполняет код JavaScript без должной фильтрации ввода, что приводит к генерации UXSS.

Например, код может выглядеть так:

self.tab?.webview?.evaluateJavaScript("u2f.postLowLevelRegister(\(requestId), \(true), '\(version)')")

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

Заключение

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

Для браузеров это действительно значительная уязвимость. Подумайте только, если злоумышленник успешно использует UXSS, он может прочитать вашу почту Gmail, сообщения в Facebook и забрать все ваши данные. Это действительно пугающая ситуация.

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

В 2012 году кто-то обнаружил, что, сначала открыв , а затем открыв javascript:alert(1), можно выполнить код на URL , что приводит к уязвимости UXSS.

В 2019 году Michał Bentkowski сообщил об уязвимости: . Это UXSS был выполнен через последнюю функцию <portal>.

Оригинальный отчет и PoC можно найти в отчете Muneaki Nishimura:

За более подробной информацией обратитесь к презентации Muneaki Nishimura's: )

Subverting Ajax
https://example.com
Issue 144813: Security: UXSS via com.android.browser.application_id Intent extra
https://example.com
https://example.com
Issue 962500: Security: Same Origin Policy bypass and local file disclosure via portal element
Issue 1164846: Security: ImageFetchTabHelper::GetImageDataByJs allows child frames to inject scripts into parent (UXSS)
Brave Browserの脆弱性を見つけた話(iOS編