В очередной раз перечитывая HackTricks в поисках способов пересмотреть процесс пентеста веб-приложения, я наткнулся на необычный концепт эксфильтрации данных через заголовок Etag при использовании сервером заголовка Range.
Заголовок Etag используется CDN для управления версионностью JS и CSS файлов. В Apache модуль включен по умолчанию (этот нюанс можно использовать для фингерпринтинга). При запросе этих ресурсов впервые браузер сохраняет Etag документа и включает его при повторном запросе в заголовке If-None-Match. Если Etag текущей версии документа совпадает, сервер может ответить клиенту кодом 304 и он воспользуется документом из своего кэша. Как правило, Etag представляет собой SHA-1 хэш от размера контента, времени последнего обновления и, иногда, используемой айноды.
Концепт заключается в том, что используя заголовок Range, мы можем указать серверу, что хотим получить в ответ всего один байт, а перебрать значения SHA-1 для одного байта, даже если в нем используется соль, намного проще, чем от целого документа, особенно, если мы ожидаем найти мультимедиа контент с заранее определенным заголовком
magic bytes. Таким образом возможно побайтово перебрать значения страниц, доступ к которым был ограничен.
Не смотря на то, что концепт интересен, его реализация in-the-wild мне показалась сомнительной, уж для очень многих неизвестных должны "сойтись звезды". Багбаунти репортов действительно не нашлось, только таска
ImageHub c Hackquest 2018. А если поискать райтапы по заголовку Range, то можно найти
Less Secure Secrets с ASIS CTF Finals 2020, где Etag не используется, но представлен другой интересный способ получения неавторизованного доступа к страницам, фильтруемым Apache при помощи mod_substitute:
AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
Substitute s|(.*)|Protected|i
В данной конфигурации, если запросить такой Range, что тэг не будет отображаться в ответе, то он не попадет под регулярку и мы сможем прочитать его значение. В любови сисадминов к костылянию логики в конфигах Apache я сомневаюсь уже меньше, чем в переборе SHA-1 хэшей, так что данный метод может быть интересен в реальных проектах.