Перевод: Выигрышный QR-код с помощью XSS на основе DOM | Bug Bounty POC

Перевод: Выигрышный QR-код с помощью XSS на основе DOM | Bug Bounty POC

@Ent_TranslateIB

Биография:

Я энтузиаст в области кибербезопасности, обладающий обширными навыками в области тестирования веб-приложений и API, в настоящее время работаю в качестве специалиста Bug Bounty в Synack Red Team (SRT), Bugcrowd и Zerocopter из Шахкота, Пенджаб, Пакистан.

В этой статье описывается, как я смог реализовать DOM-Based XSS в программе Synack Red Team и выиграть QR также известный как Quality Rule.

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

Понимание DOM:

Для того чтобы понять суть Source и sinks в отношении межсайтового скриптинга на основе DOM, мы должны вкратце понять DOM и некоторые его методы. Document Object Model - это иерархическое представление веб-браузером элементов веб-страницы. Другими словами, когда браузер получает страницу для загрузки, он разбирает или препарирует структуру страницы и разделяет различные элементы страницы на древовидные структуры, в которых каждый элемент и атрибут вложен в соответствующее место.

DOM-Based XSS: Source и Sinks

Теперь, когда мы знаем основы DOM и понимаем, что код JavaScript может вносить изменения в страницу в реальном времени, мы можем обсудить DOM-Based XSS, а также source и sinks. Отказ от ответственности: Чтобы помочь с объяснением, я буду использовать лабораторную работу из Web Academy PortSwigger, которая включает дополнительную информацию, а также множество лабораторных работ для отработки обсуждаемых концепций. Это будет небольшой спойлер к одной из лабораторных работ.

Source:

Функция source - это любое свойство или функция JS, которая принимает пользовательский ввод из какого-либо места на странице. Примером source является свойство location.search, поскольку оно считывает ввод из строки запроса. Вот некоторые распространенные source:

* document.URL

* document.documentURI

* document.URLUnencoded

* document.baseURI

* location.search

* document.cookie

* document.referrer

Sinks:

Sinks - это потенциально опасная функция JavaScript, которая может вызвать нежелательные эффекты, если ей передаются данные, контролируемые злоумышленником. В принципе, если функция возвращает вводимые данные обратно на экран в качестве вывода без проверки безопасности, она считается Sinks. Примером может служить свойство "innerHTML", использованное ранее, поскольку оно изменяет содержимое HTML-страницы на то, что ему передано.

К распространенным Sinks относятся:

* document.write()

* document.writeln()

* document.domain

* element.innerHTML

* element.outerHTML

* element.insertAdjacentHTML

* element.onevent

Анализ уязвимости:

Мое основное внимание было сосредоточено на главном домене, который является https://redacted.com, поэтому я не стал перечислять поддомены и начал искать сочные JavaScript файлы, и к счастью я нашел интересный JavaScript файл, где я обнаружил следующую JavaScript функцию:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return null;
    return decodeURIComponent(results[2].replace(/\+/g, " "))

В этой функции JavaScript getParamByName, которая получает два параметра и их значение из URL, она принимает два параметра, один из которых - name, которое является строкой, и получает имя параметра из URL, который в нашем случае является target=, а значение второго параметра будет URL, например document.URL, document.location.

В нашем случае это Source и Sink:

Source:

window.location.href

Sink:

else{cmsService.getClientConfig().then(function(result){if(angular.isDefined(result)){uaService.createAndSetDemographics(result)}$window.location.href=vm.credentials.redirect||"/"})

После получения значения из Source для успешного выполнения JavaScript необходимо, чтобы следующая функция была истинной:

$location.path("/")
            } else {
                if (result.token) {
                    window.localStorage.wptoken = result.token
                }
                if (result.status == "ACTIONREQUIRED_2FA_SETUP" && result.token) {
                    twoFactorAuthService.requireAuthSetup("login")
                } else if (result.status == "ACTIONREQUIRED_2FA_VERIFICATION" && result.token) {
                    twoFactorAuthService.requireAuthVerification("login")
                } else if (result.success != "true" && result.status.length > 0) {
                    vm.submitted = false;
                    vm.onError(result.status)
                } else {
                    cmsService.getClientConfig().then(function(result) {
                        if (angular.isDefined(result)) {
                            uaService.createAndSetDemographics(result)
                        }
                        $window.location.href = vm.credentials.redirect || "/"
                    })

В нашем случае последнее утверждение истинно и вызывает выполнение JavaScript.

После понимания кода JavaScript вы ясно увидите, что он принимает входные данные пользователя из целевого параметра и выполняет их в DOM так называемом sink.

Поэтому я использовал следующую полезную нагрузку JavaScript:

javascript:alert(document.domain)
Выполнение полезной нагрузки

Таким образом, это была программа Quality Rule на Synack Red Team, я представил лучший качественный отчет в Synack и выиграл качество с 3/3 звездами и награжден $775.00 вознаграждения.

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

Вуаля! "Иногда ХАКИНГ - это всего лишь человек, тратящий на что-то больше времени, чем можно было бы ожидать", - всегда полезно изучать то, что кажется бессмысленным.

Социальные сети:

Twitter

LinkedIN

Партнер:

Twitter

LinkedIN

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

Если вам понравилась эта статья, поделитесь!

Спасибо!

Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.


Перевод статьи был выполнен проектом перевод энтузиаста:

  • 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности
  • 🔥 @Ent_Translate - Инстаграм проекта

Report Page