Синтаксическая путаница возникает, когда два и более компонентов в системе по-разному интерпретируют один и тот же пользовательский ввод из-за неоднозначных или противоречивых правил синтаксиса.
Современные веб-приложения часто имеют цепочку парсеров: браузер нормализует ввод, CDN может его переписать, прокси пересылает дальше, фреймворк приложения парсит, а вспомогательные библиотеки интерпретируют заново.
Если на двух этапах ввод семантически «означает» разное, валидация, применённая на одном этапе, может перестать действовать на другом — и тогда от «санитизированного» ввода может остаться путь к эксплуатируемому поведению.
☝️ В языке программирования C определенные последовательности символов обрабатываются препроцессором и/или компилятором как один символ (digraphs и trigraphs). Python и Perl поддерживают экранирование Unicode-символов по именам символов.
Content-Disposition
Параметр
filename заголовка Content-Disposition предлагает имена файлов для загружаемых или скачиваемых файлов:HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="invoice.pdf"
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: text/plain
Альтернативный синтаксис с
* позволяет указать кодировку и использовать URL-кодирование:Content-Disposition: form-data; name="file"; filename*=UTF8''myfile%0a.txt
Если система поддерживает
filename*, ты можешь ввести управляющие символы или обойти ограничения на имена файлов — это открывает дорогу к перезаписи файлов и другим кейсам.file URI и обход фильтров
Схема file URI обычно указывает на локальные файлы (
file:///path/to/file), но также допускает указание хоста: file://<host>/<path>. Используя схему URI файла с указанием хоста, можно обойти фильтры или получить DNS-запросы для отслеживания рабочего процесса в целевом приложении.🔗 The Minefield Between Syntaxes: Exploiting Syntax Confusions in the Wild


