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

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

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

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

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

Категории

Все категории
Loading categories
domato — DOM-фаззер | Kitploit
Инструменты/GitHubGitHub/googleprojectzero/domato
Анализ уязвимостейВеб-безопасностьФаззингТоп в Фаззинг №7
GitHubgoogleprojectzero/domato

domato

DOM-фаззер

Репозиторий
1.8k28581 год назадПроверено Kitploit
Сайт

Популярное

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

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

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

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

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

Domato 🍅

Фаззер для DOM

Автор и сопровождающий: Ivan Fratric, [email protected]

Copyright 2017 Google Inc. All Rights Reserved.

Лицензировано в соответствии с Apache License, Version 2.0 (далее — «Лицензия»); вы не можете использовать этот файл иначе как в соответствии с Лицензией. Копию Лицензии можно получить по адресу:

root@kitploit:~
http://www.apache.org/licenses/LICENSE-2.0

Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое в соответствии с Лицензией, предоставляется на условиях «AS IS» («КАК ЕСТЬ»), БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых. См. Лицензию для получения информации о разрешениях и ограничениях.

Использование

Чтобы увидеть информацию об использовании, выполните следующую команду:

python3 generator.py --help

Для генерации одного .html-примера выполните:

python generator.py --file <output file>

Для генерации одного .html-примера с использованием написанного вами шаблона выполните:

python generator.py --file <output file> --template <your custom template file>

Для генерации нескольких примеров одним вызовом выполните:

python generator.py --output_dir <output directory> --no_of_files <number of output files>

Скачать инструмент

Сгенерированные примеры будут помещены в указанный каталог и названы fuzz-<number>.html, например fuzz-00001.html, fuzz-00002.html и т. д. Генерация нескольких примеров происходит быстрее, поскольку файлы входной грамматики нужно загрузить и разобрать только один раз.

Структура кода

generator.py содержит основной скрипт. Он использует grammar.py как библиотеку и содержит дополнительный вспомогательный код для фаззинга DOM.

grammar.py содержит движок генерации, который в основном независим от конкретного приложения и поэтому может использоваться в других (то есть не-DOM) генерационных фаззерах. Поскольку его можно использовать как библиотеку, его использование описано в отдельном разделе ниже.

Файлы .txt содержат определения грамматики. Есть 3 основных файла: html.txt, css.txt и js.txt, которые содержат грамматики HTML, CSS и JavaScript соответственно. Эти корневые файлы грамматики могут включать содержимое из других файлов.

Использование движка генерации и написание грамматик

Чтобы использовать движок генерации с пользовательской грамматикой, вы можете использовать следующий код Python:

root@kitploit:~
from grammar import Grammar

my_grammar = Grammar()
my_grammar.parse_from_file('input_file.txt')
result_string = my_grammar.generate_symbol('symbol_name')

В следующих разделах описан синтаксис файлов грамматики.

Базовый синтаксис

Domato основан на движке, который, получив контекстно-свободную грамматику в простом формате, указанном ниже, генерирует примеры на основе этой грамматики.

Грамматика описывается как набор правил в следующем базовом формате:

<symbol> = смесь констант и <other_symbol>

Каждое правило грамматики содержит левую и правую части, разделённые знаком равенства. Левая часть содержит символ, а правая часть — сведения о том, как этот символ может быть развёрнут. При разворачивании символа все символы в правой части разворачиваются рекурсивно, а всё, что не является символом, просто копируется в выходные данные. Обратите внимание, что одно правило не может занимать несколько строк входного файла.

Рассмотрим следующий упрощённый пример части грамматики CSS:

root@kitploit:~
<cssrule> = <selector> { <declaration> }
<selector> = a
<selector> = b
<declaration> = width:100%

Если мы укажем движку грамматики разобрать эту грамматику и сгенерировать 'cssrule', мы можем получить либо:

a { width:100% }

либо

b { width:100% }

Обратите внимание, что для символа 'selector' есть два правила. В таких случаях, когда генератору требуется сгенерировать 'selector', он выберет правило для использования случайным образом. Также можно указать вероятность правила с помощью атрибута 'p', например:

root@kitploit:~
<selector p=0.9> = a
<selector p=0.1> = b

В этом случае строка 'a' будет выводиться чаще, чем 'b'.

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

Рассмотрим ещё один пример для генерации HTML-примеров:

root@kitploit:~
<html> = <lt>html<gt><head><body><lt>/html<gt>
<head> = <lt>head<gt>...<lt>/head<gt>
<body> = <lt>body<gt>...<lt>/body<gt>

Обратите внимание, что символы '<' и '>' имеют специальное значение в синтаксисе грамматики, поэтому здесь мы используем <lt> и <gt> вместо них. Эти символы встроены и не требуют определения пользователем. Список всех встроенных символов приведён в отдельном разделе.

Генерация кода на языках программирования

Для генерации кода на языках программирования можно использовать похожий синтаксис, но есть несколько отличий. Каждая строка грамматики языка программирования будет соответствовать строке выходных данных. Из-за этого синтаксис грамматики будет более свободным, чтобы можно было выражать конструкции на различных языках программирования. Во-вторых, когда строка генерируется, помимо вывода самой строки могут создаваться одна или несколько переменных, и эти переменные могут повторно использоваться при генерации других строк. Опять же, давайте посмотрим на упрощённый пример:

root@kitploit:~
!varformat fuzzvar%05d
!lineguard try { <line> } catch(e) {}

!begin lines
<new element> = document.getElementById("<string min=97 max=122>");
<element>.doSomething();
!end lines

Если мы укажем движку сгенерировать 5 строк, мы можем получить что-то вроде:

root@kitploit:~
try { var00001 = document.getElementById("hw"); } catch(e) {}
try { var00001.doSomething(); } catch(e) {}
try { var00002 = document.getElementById("feezcqbndf"); } catch(e) {}
try { var00002.doSomething(); } catch(e) {}
try { var00001.doSomething(); } catch(e) {}

Обратите внимание, что

  • строки языка программирования заключены в операторы '!begin lines' и '!end lines'. Это даёт парсеру грамматики необходимую информацию о том, что строки между ними являются строками языка программирования и, таким образом, разбираются иначе.
  • Мы использовали <new element> вместо <element>. Это указывает генератору создать новую переменную типа 'element' вместо генерации символа 'element'.
  • <string> — один из встроенных символов, поэтому его не нужно определять.
  • [необязательно] Вы можете использовать оператор !varformat для определения формата переменных, которые вы хотите использовать.
  • [необязательно] Вы можете использовать оператор !lineguard для определения дополнительного кода, который вставляется вокруг каждой строки для перехвата исключений или выполнения других задач. Это нужно, чтобы вам не приходилось писать его для каждой строки отдельно.
  • Помимо '!begin lines' и '!end lines', вы также можете использовать '!begin helperlines' и '!end helperlines' для определения строк кода, которые будут использоваться только в том случае, если они требуются при генерации других строк (например, вспомогательные строки могут генерировать переменные, необходимые «основному» коду, но вы не хотите, чтобы эти вспомогательные строки попадали в выходные данные, когда они не нужны).
Комментарии

Всё после первого символа '#' в строке считается комментарием, например:

root@kitploit:~
#This is a comment
Предотвращение бесконечных рекурсий

Синтаксис грамматики позволяет указать фаззеру, какие правила являются нерекурсивными и могут безопасно использоваться, даже если достигнут максимальный уровень рекурсии. Это делается с помощью атрибута ‘nonrecursive’. Пример приведён ниже.

root@kitploit:~
!max_recursion 10
<test root=true> = <foobar>
<foobar> = foo<foobar>
<foobar nonrecursive> = bar

Во-первых, необязательный оператор ‘!max_recursion’ определяет максимальную глубину рекурсии (по умолчанию 50). Обратите внимание, что второе продукционное правило для ‘foobar’ помечено как нерекурсивное. Если когда-либо будет достигнут максимальный уровень рекурсии, генератор принудительно использует нерекурсивное правило для символа ‘foobar’, предотвращая тем самым бесконечную рекурсию.

Включение и импорт других файлов грамматики

В Domato включение и импорт грамматик — это два разных контекста.

Включение проще. Вы можете использовать:

root@kitploit:~
!include other.txt

для включения правил из other.txt в текущую разбираемую грамматику.

Импорт работает немного иначе:

root@kitploit:~
!import other.txt

указывает парсеру создать новый объект Grammar(), на который затем можно ссылаться из текущей грамматики с помощью специального символа <import>, например так:

root@kitploit:~
<cssrule> = <import from=css.txt symbol=rule>

Вы можете думать об импорте и включении в терминах пространств имён: !include помещает включённую грамматику в единое пространство имён, а !import создаёт новое пространство имён, к которому затем можно обращаться с помощью символа <import> и пространства имён, указанного через атрибут 'from'.

Включение кода Python

Иногда вам может понадобиться вызвать пользовательский код Python в вашей грамматике. Например, предположим, вы хотите использовать движок для генерации HTTP-ответа и хотите, чтобы длина тела совпадала с заголовком 'Size'. Поскольку это невозможно сделать с помощью обычных правил грамматики, вы можете включить пользовательский код Python для решения этой задачи следующим образом:

root@kitploit:~
!begin function savesize
  context['size'] = ret_val
!end function

!begin function createbody
  n = int(context['size'])
  ret_val = 'a' * n
!end function

<foo root> = <header><cr><lf><body>
<header> = Size: <int min=1 max=20 beforeoutput=savesize>
<body> = <call function=createbody>

Функции Python определяются между командами ‘!begin function <имя_функции>’ и ‘!end function’. Функции можно вызывать двумя способами: с помощью атрибута ‘beforeoutput’ и с помощью символа <call>.

Указав атрибут ‘beforeoutput’ в некотором символе, соответствующая функция будет вызвана, когда этот символ будет развёрнут, непосредственно перед выводом результата разворачивания в пример. Результат разворачивания будет передан функции в переменной ret_val. Затем функция может изменить ret_val, сохранить его для последующего использования или выполнить любые другие операции.

При использовании специального символа <call> функция (указанная в атрибуте ‘function’) будет вызвана, когда символ будет встречен во время генерации языка. Любое значение, сохранённое функцией в ret_val, будет считаться результатом разворачивания (ret_val включается в пример).

Ваш код Python имеет доступ к следующим переменным:

  • context — словарь, который передаётся через всю генерацию примера. Вы можете использовать его для хранения значений (например, для сохранения размера в примере выше) и извлечения их в правилах, которые срабатывают впоследствии.
  • attributes — словарь, соответствующий текущему обрабатываемому символу. Вы можете использовать его для передачи параметров вашим функциям. Например, если вы используете что-то вроде <call function=func foo=bar> для вызова вашей функции, attributes[‘foo’] будет установлено в ‘bar’.
  • ret_val — значение, которое будет выведено в результате вызова функции. Оно инициализируется пустым значением, когда для вызова функции используется символ <call>; в противном случае оно инициализируется значением, сгенерированным символом.
Встроенные символы

Следующие символы имеют специальное значение, и пользователям не следует их переопределять:

  • <lt> — символ ‘<’
  • <gt> — символ ‘>’
  • <hash> — символ ‘#’
  • <cr> — символ CR
  • <lf> — символ LF
  • <space> — пробел
  • <tab> — символ табуляции
  • <ex> — символ ‘!’
  • <char> — можно использовать для генерации произвольного ASCII-символа с помощью атрибута ‘code’. Например, <char code=97> соответствует ‘a’. Если атрибут не указан, генерирует случайный символ. Поддерживает атрибуты ‘min’ и ‘max’.
  • <hex> — генерирует случайную шестнадцатеричную цифру.
  • <int>, <int 8>, <uint8>, <int16>, <uint16>, <int32>, <uint32>, <int64>, <uint64> — можно использовать для генерации случайных целых чисел. Поддерживают атрибуты ‘min’ и ‘max’, которые можно использовать для ограничения диапазона генерируемых целых чисел. Поддерживают атрибуты ‘b’ и ‘be’, которые делают вывод двоичным в формате little/big endian вместо текстового вывода.
  • <float>, <double> — генерируют случайное число с плавающей запятой. Поддерживают атрибуты ‘min’ и ‘max’ (0 и 1, если не указаны). Поддерживают атрибут ‘b’, который делает вывод двоичным.
  • <string> — генерирует случайную строку. Поддерживает атрибуты ‘min’ и ‘max’, которые управляют минимальным и максимальным генерируемым кодом символа, а также атрибуты ‘minlength’ и ‘maxlength’, которые управляют длиной строки.
  • <htmlsafestring> — то же, что и <string>, за исключением того, что HTML-метасимволы будут экранированы, что делает строку безопасной для встраивания в текст HTML или значения атрибутов.
  • <lines> — выводит заданное число (через атрибут ‘count’) строк кода. См. раздел о генерации кода на языках программирования для примера.
  • <import> — импортирует символ из другой грамматики, см. раздел о включении внешних грамматик.
  • <call> — вызывает определяемую пользователем функцию, соответствующую атрибуту function. См. раздел о включении кода Python в грамматику.
Атрибуты символов

Поддерживаются следующие атрибуты:

  • root — помечает символ как корневой символ грамматики. Единственное поддерживаемое значение — ‘true’. Когда вызывается GenerateSymbol(), если аргумент не указан, будет сгенерирован корневой символ.
  • nonrecursive — даёт генератору подсказку, что это правило не содержит циклов рекурсии, и используется для предотвращения бесконечных рекурсий. Единственное поддерживаемое значение — ‘true’.
  • new — используется при генерации языков программирования для обозначения того, что здесь создаётся новая переменная, а не разворачивается символ как обычно. Единственное поддерживаемое значение — ‘true’.
  • from, symbol — используются при импорте символов из других грамматик, см. раздел «Включение внешних грамматик».
  • count — используется в символе lines для указания количества создаваемых строк.
  • id — используется для обозначения того, что несколько символов должны иметь одно и то же значение. Например, в правиле ‘doSomething(<int id=1>, <int id=1>)’ оба int будут иметь одинаковое значение. Фактически разворачивается только первый экземпляр, второй просто копируется из первого.
  • min, max — используются при генерации числовых типов для указания минимального и максимального значения. Также используются для ограничения набора генерируемых символов в строках.
  • b, be — используются в числовых типах для указания двоичного вывода little-endian (‘b’) или big-endian (‘be’).
  • code — используется в символе char для указания точного выводимого символа по его коду.
  • minlength, maxlength — используются при генерации строк для указания минимальной и максимальной длины.
  • up — используется в символе hex для указания вывода в верхнем регистре (по умолчанию — нижний регистр).
  • function — используется в символе <call>, см. раздел «Включение кода Python».
  • beforeoutput — используется для вызова определяемых пользователем функций, см. «Включение Python».

Демонстрация найденных ошибок

Некоторые из ошибок, найденных с помощью Domato:

  • Apple Safari: CVE-2017-2369, CVE-2017-2373, CVE-2017-2362, CVE-2017-2454, CVE-2017-2455, CVE-2017-2459, CVE-2017-2460, CVE-2017-2466, CVE-2017-2471, CVE-2017-2476, CVE-2017-7039, CVE-2017-7040, CVE-2017-7041, CVE-2017-7042, CVE-2017-7043, CVE-2017-7046, CVE-2017-7048, CVE-2017-7049, CVE-2017-13796, CVE-2017-13792, CVE-2017-13797, CVE-2017-13795, CVE-2017-13785, CVE-2017-13784, CVE-2017-13783, CVE-2017-13802, CVE-2017-13794, CVE-2017-13798, CVE-2017-13791, CVE-2018-4089, CVE-2018-4200, CVE-2018-4197, CVE-2018-4318, CVE-2018-4317, CVE-2018-4314, CVE-2018-4306, CVE-2018-4312, CVE-2018-4315, CVE-2018-4323, CVE-2018-4328
  • Google Chrome: Issues 666246 and 671328
  • Microsoft Internet Explorer 11: CVE-2017-0037, CVE-2017-0059, CVE-2017-0202, CVE-2017-8594, CVE-2018-0866
  • Microsoft Edge: CVE-2017-0037, CVE-2017-8496, CVE-2017-8652, CVE-2017-8644
  • Microsoft JScript: CVE-2017-11903, CVE-2017-11855, CVE-2017-11793, CVE-2017-11906, CVE-2017-11907, CVE-2018-0935, CVE-2018-8353, CVE-2018-8631
  • Microsoft VBScript: CVE-2018-8544, CVE-2018-8552, CVE-2018-8625
  • Mozilla Firefox: CVE-2017-5404, CVE-2017-5447, CVE-2017-5465

Отказ от ответственности

Это не официальный продукт Google.