Скрываем полезную нагрузку JavaScript в JPEG файле

Скрываем полезную нагрузку JavaScript в JPEG файле

Этичный Хакер

Что такое полиглот?

Точно так же, как PNG, JPEG и DOC являются допустимыми типами файлов, полиглоты представляют собой комбинацию двух разных типов файлов. Например, Phar + JPEG (архив PHP и файл JPEG), GIFAR (файл Gif и Rar), Javascript + JPEG и т. д.

Приложения разрешают только определенные типы файлов для таких функций, как загрузка файлов, и не разрешают другие типы файлов, такие как файлы .php или .js, поскольку они могут позволить злоумышленнику загружать вредоносные файлы в приложение. Приложения выполняют проверки фильтрации расширений, такие как двойные расширения (.jpg.php) или использование нулевых байтов в расширении (.php%00.jpg), именах файлов (.htaccess, .config и т. д.), а также то, что подписи загруженного файла соответствуют своему типу содержимого.

Разные приложения используют разные методы проверки и для обхода некоторых из этих проверок можно использовать полиглоты.

Структура JPEG

Изображение JPEG представлено в виде последовательности сегментов, где каждый сегмент начинается с заголовка. Каждый заголовок начинается с некоторого байта. Полезная нагрузка, за которой следует заголовок, зависит от типа заголовка. Общие типы маркеров JPEG перечислены ниже:

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, мы добавим длину заголовка, заголовок комментария, null byte, а затем наш javascript для атаки.

Вектор атаки будет следующий: */=alert(“XSS”)/*. Конвертируем ее в шестнадцатиричное представление.

Полезная нагрузка в шестнадцатеричном виде:

2A 2F 3D 61 6C 65 72 74 28 22 58 53 53 2E 22 29

Мы можем использовать шестнадцатеричный редактор для введения javascript в метаданные изображения. Это работает, потому что браузеры интерпретируют код при рендеринге изображения в HTML.

test.jpg (файл изображения)

У меня есть изображение test.jpg, а ниже шестнадцатеричный вид test.jpg. С помощью редактора ghex мы заменим некоторые шестнадцатеричные символы и сохраним их.

Как мы знаем, первый FF D8— это начало изображения, следующие два байта это конец заголовка, 00 10 показывают длину JPEG заголовка, которая в десятичном эквиваленте составляет 16 байтов.

Время для инъекций

Мы собираемся ввести нашу полезную нагрузку между 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 , добавлять 12040 нулевых байтов и записывать их в файл test_new.jpg. Теперь в редакторе ghex закройте тег комментария перед FF D9

Проверим в браузере

Наш javascript/jpeg полиглот работает просто отлично!

Поделитесь с друзьями, если вам было интересно.



Report Page