file://localhost/etc/passwd что вернёт?
Да, вернётся /etc/passwd. В
RFC 8089,
верный формат протокола описан как
file://<host>/<path>, в то время как все шпоры на LFR при SSRF говорят лишь о
file:///<path>Причём, в
<host> возможно вписать
домен. Система резолвнет его, и если тот указывает на
127.0.0.1, то вернётся содержимое файла. В противном случае получишь лишь отстук в DNS.
питон пок
from urllib.request import urlopen
content = urlopen(
"file://yoogle.com/etc/passwd", timeout=2,
).read().decode('utf-8')
print(content)
Представил сколько возможностей для обхода фильтров? И это не последний твой приступ FOMO за сегодня.
В статье
The Minefield Between Syntaxes от
@yeswehack, автор вскрывает проблемы разных синтаксисов и как парсеры выживают с ними.
Представим, ты нашёл SSTI, но WAF блокирует символ $
Что делать?
Неприятно, но не критично, ведь в Python / Perl возможно
представить символ через
\N{CHARACTER NAME}.
Пример обхода фильтра
\N{dollar sign}{7*7} == ${7*7} == 49Уже на стену лезешь? Погоди, я с тобой ещё не закончил.
Давай дальше по загрузке файлов. Видел же в
Content-Disposition есть параметр
filename?
В
RFC 6266 описан базовый подход с именем файла, но
RFC 8187 вышибает дверь с... чего.. какие юникод байты 😱
# RFC 6266
filename="image.png"
# RFC 8187
filename*=UTF8''image%0a.png
RFC 8187 вводит
новые правила для
filename параметра, включая поддержку всего Unicode + способности кодировать произвольные байты через
% То есть, ты можешь закодировать перенос строки (
%0a ==
\n) и всячески ломать как парсинг имени файла, так и куда тот запишется.
. . .
FOMO карусель закрыта.
Как восстановишь силы, пробегись по статье автора ради:
⚀ разбор CVE из-за проблем синтаксиса [^]
⚀ кейс бб, из cache poisoning в stored xss через пролом валидации parse_url в PHP [^]
⚀ кейс бб, из слепого чтения файлов через SSRF в arbitrary file read [^]
Затем разнеси CTF по ресерчу
1. обход фильтров SSTI [^]
2. иной подход к протоколу file:// [^]
3. пролом parse_url в PHP [^]
#web #waf_bypass