Изображение JPEG представляется в виде последовательности сегментов, где каждый сегмент начинается с заголовка. Каждый заголовок начинается с некоторого байта. Полезная нагрузка, следующая за заголовком, отличается в зависимости от типа заголовка. Ниже перечислены распространенные типы маркеров JPEG:
Каждый двоичный файл содержит несколько заголовков. Они очень важны для файла, поскольку определяют специфическую информацию о файле. За большинством заголовков следует информация о длине. Это говорит нам о длине конкретного сегмента.
Начало заголовка изображения содержит FF D8. Если мы его не видим, то можем предположить, что это какой-то другой файл. Другим важным маркером является FF D9, который указывает на конец изображения.
Чтобы полезная нагрузка выглядела как легитимный файл JPEG, мы добавим длину заголовка, заголовок комментария, нулевые байты, а затем наш вектор атаки javascript.
Допустим, вектор атаки
The payload in hex:
Мы можем использовать hex-редактор для внедрения javascript в метаданные изображения. Это работает потому, что браузеры интерпретируют код при преобразовании изображения в HTML.
test.jpg:
У меня есть изображение test.jpg, а ниже приведен hexdump test.jpg. С помощью редактора ghex мы собираемся заменить некоторые шестнадцатеричные символы и сохранить их.
Как мы знаем, первый FF D8 - это начало изображения, следующие два байта представляют собой два последующих байта, 00 10 - длина заголовка JPEG, которая в десятичном эквиваленте составляет 16 байт.
Time for Injection
Мы собираемся внедрить нашу полезную нагрузку между FF E0 и FF DB . Начнем с 2F 2A, что является шестнадцатеричным представлением /*
Если вы заметили, мы только что заменили 00 10 на 2F 2A, а десятичный эквивалент шестнадцатеричного 2F 2A составляет 12074 байта. Таким образом, теперь заголовок изображения изменился с 16 байт до 12074 байт.
Из скриншота выше видно, что размер нашей полезной нагрузки составляет 18 байт, поэтому мы должны заполнить оставшиеся байты нулями, что составляет 12074-16-18=12040 байт.
Приведенные выше команды прочитают test.jpg, вставят нашу полезную нагрузку между 2F 2A FF DB изменят hex в буфер, добавят 12040 нулевых байт и запишут в файл test_new.jpg. Теперь в редакторе ghex закройте тег комментария перед FF D9
В Firefox при использовании набора символов UTF-8 для документа он повреждает polyglot, когда включается в качестве скрипта! Чтобы заставить скрипт работать, мы должны указать ISO-8859-1 charset в теге скрипта, и он будет выполняться нормально.
Exploiting XSS with Javascript/JPEG Polyglot
Код:
0xffd8: “Start of Image”,
0xffe0: “Application Default Header”,
0xffdb: “Quantization Table”,
0xffc0: “Start of Frame”,
0xffc4: “Define Huffman Table”,
0xffda: “Start of Scan”,
0xffd9: “End of Image”
Каждый двоичный файл содержит несколько заголовков. Они очень важны для файла, поскольку определяют специфическую информацию о файле. За большинством заголовков следует информация о длине. Это говорит нам о длине конкретного сегмента.
Начало заголовка изображения содержит FF D8. Если мы его не видим, то можем предположить, что это какой-то другой файл. Другим важным маркером является FF D9, который указывает на конец изображения.
Чтобы полезная нагрузка выглядела как легитимный файл JPEG, мы добавим длину заголовка, заголовок комментария, нулевые байты, а затем наш вектор атаки javascript.
Допустим, вектор атаки
*/=alert("XSS")/* Преобразование в шестнадцатеричную систему будет выглядеть следующим образом.
The payload in hex:
Код:
2A 2F 3D 61 6C 65 72 74 28 22 58 53 53 2E 22 29
Мы можем использовать hex-редактор для внедрения javascript в метаданные изображения. Это работает потому, что браузеры интерпретируют код при преобразовании изображения в HTML.
test.jpg:
У меня есть изображение test.jpg, а ниже приведен hexdump test.jpg. С помощью редактора ghex мы собираемся заменить некоторые шестнадцатеричные символы и сохранить их.
Как мы знаем, первый FF D8 - это начало изображения, следующие два байта представляют собой два последующих байта, 00 10 - длина заголовка JPEG, которая в десятичном эквиваленте составляет 16 байт.
Time for Injection
Мы собираемся внедрить нашу полезную нагрузку между FF E0 и FF DB . Начнем с 2F 2A, что является шестнадцатеричным представлением /*
Если вы заметили, мы только что заменили 00 10 на 2F 2A, а десятичный эквивалент шестнадцатеричного 2F 2A составляет 12074 байта. Таким образом, теперь заголовок изображения изменился с 16 байт до 12074 байт.
Из скриншота выше видно, что размер нашей полезной нагрузки составляет 18 байт, поэтому мы должны заполнить оставшиеся байты нулями, что составляет 12074-16-18=12040 байт.
Приведенные выше команды прочитают test.jpg, вставят нашу полезную нагрузку между 2F 2A FF DB изменят hex в буфер, добавят 12040 нулевых байт и запишут в файл test_new.jpg. Теперь в редакторе ghex закройте тег комментария перед FF D9
Код:
Code to execute image as javascript:-
<script charset="ISO-8859-1" src="test_new.jpeg">
В Firefox при использовании набора символов UTF-8 для документа он повреждает polyglot, когда включается в качестве скрипта! Чтобы заставить скрипт работать, мы должны указать ISO-8859-1 charset в теге скрипта, и он будет выполняться нормально.
Exploiting XSS with Javascript/JPEG Polyglot
