TGViewer
BlackFan BlackFan @black4fan · 1.19K subscribers
Post #20 7.75K
Интересная уязвимость, связанная с кэшированием HTTP ответов из S3, может возникнуть если немного перестараться с настройкой.

Условия:
1) Сайт хранит статику в S3 и по определенным условиям проксирует туда запросы, либо имеет отдельный поддомен, который проксирует запросы на S3 бакет
2) Чтобы не гонять 10 мегабайтные JavaScript файлы, кэшируется контент из S3 для любого HTTP ответа с кодом 200
3) Так как кэшируется только статика - не включаем в ключ кэша cookie или query-параметры

Казалось бы, все в порядке, но проблема заключается в том, что S3 умеет отвечать с кодом 200 не только возвращая контент файла, но еще и при получении другой информации об объекте.
Например, для получения списка тегов достаточно в query-параметры добавить ?tagging, что часто разрешают для неавторизованных запросов.

https://site.tld/static/somefile.js?tagging


В результате, вместо контента файла вернется следующий HTTP ответ:
<?xml version="1.0" encoding="UTF-8"?>
<Tagging xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<TagSet></TagSet>
</Tagging>


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

Если ?tagging, ?acl и подобные методы возвращают 403, можно попробовать параметры из GetObject API и, например, закэшировать некорректный Content-Type, указав в запросе ?response-content-type=text/html. Это приведет к тому, что браузер откажется выполнять JavaScript с некорректным типом, что также приведет к нарушению работы сайта (это поведение еще зависит от наличия в ответе заголовка X-Content-Type-Options: nosniff).

Как проверить уязвимость и не аффектить реальных пользователей:
1) Находим через архивы устаревшие JS на сайте
2) Так как к ним никто не обращается, следующий запрос будет с обновлением кэша, поэтому сразу запрашиваем с ?tagging или ?response-content-type=text/html
3) Проверяем, что зараженный HTTP ответ возвращается без указания query-параметров
4) Проверяем, что кэш не привязан к текущему пользователю запросив с другого устройства / IP / от имени другого пользователя

Как исправить уязвимость:
1) Убрать из проксируемого HTTP запроса query-параметры при передаче на S3
2) Добавить query-параметры в ключ кэша
  • 🔥 48
  • 👍 13
  • 🤔 1
More from @black4fan
  1. Jul 9, 2026Записали выпуск "Начинаем в багбаунти" по теме мисконфигов при использовании S3 в веб-прил…
  2. Apr 19, 2026Финал Standoff Hacks. Шанхай 🇨🇳 GG. Доиграли до конца. Топ-3: 🥇 r0hack — MVP Standoff H…
  3. Mar 13, 2026Попался интересный вариант, когда с помощью JWT секрета, извлеченного из Java приложения,…
  4. Mar 4, 2026Раскрыл один из интересных отчетов в программе Мегамаркет, опять же связанный с некорректн…
  5. Jul 16, 2025VK раскрыли пачку новых репортов, среди которых мой с XSS на ok.ru. В нем использовалась д…
  6. May 3, 2025Частично реализовал в BFScan поддержку аннотаций в аргументах конструктора класса. https:/…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →