Перевод: Выигрышный 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 и выясняйте, как приложение обрабатывает вводимые пользователем данные.
Вуаля! "Иногда ХАКИНГ - это всего лишь человек, тратящий на что-то больше времени, чем можно было бы ожидать", - всегда полезно изучать то, что кажется бессмысленным.
Социальные сети:
Партнер:
Мы открыты для работы, если у вас есть какой-либо частный проект по пентестингу, пожалуйста, свяжитесь с любым из нас! Спасибо!
Если вам понравилась эта статья, поделитесь!
Спасибо!
Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.
Перевод статьи был выполнен проектом перевод энтузиаста:
- 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности
- 🔥 @Ent_Translate - Инстаграм проекта