Введение
Сканер, проверяющий только статус, отметил и реальный диагностический ответ, и пример документации. Теперь создайте проверку, которая отвечает на нужный вопрос: получил ли запрос без аутентификации актуальный внутренний диагностический объект этого приложения?
Вы создадите YAML-шаблон в собственном формате Nuclei, проверите условия ответа и просканируете шесть разрешённых сайтов Fieldwork Studio. Результатом для передачи станут ваш повторно используемый шаблон и реальные обнаружения. Среда независима от предыдущей лабораторной работы; файлы и процессы не переносятся.
Сначала завершите Подтвердите раскрытие диагностики по реальным ответам либо убедитесь, что умеете читать HTTP-статус, заголовки типа содержимого, небольшой объект JSON и обнаружения Nuclei в JSONL. Эта лабораторная работа объясняет YAML и выражения сопоставления. Вся конфигурация целей синтетическая. Используйте только предоставленную область с запросами для чтения, сохраните открытые страницы и расписания мастер-классов и заложите около 65 минут на чтение и обычные ошибки; это авторская оценка.
Определите контракт ответа для проверки
На этом шаге вы проверите обычный сервис и точно определите вопрос, на который должен отвечать ваш шаблон. Откройте Workshops, просмотрите занятия и используйте Get the workshop schedule, чтобы скачать настоящий fieldwork-schedule.csv. Printmaking и Bookbinding должны оставаться доступными на протяжении всей оценки.

Две карточки мастер-классов показывают общедоступный сервис, который необходимо сохранить. Зелёная ссылка Get the workshop schedule скачивает его настоящее расписание.
Переключитесь на Auditor. Он открывает контейнер аудита Kali в /home/labex/project. Прочитайте область проверки и разрешённые базовые URL:
cat scope.txt
cat targets.txt
Шесть сайтов — studio, archive, manual, garden, status и members — находятся под http://workshop.test:8080/. Проверяйте только эти URL с помощью HTTP GET-запросов только для чтения. Не изменяйте целевые сайты и предоставленные файлы области проверки.
Ещё раз изучите актуальный диагностический ответ. Как и прежде, curl -i включает заголовки ответа:
curl -i http://workshop.test:8080/studio/maintenance/diagnostics
Обнаружение должно одновременно подтверждать HTTP 200, тип содержимого JSON и внутренний диагностический объект приложения на верхнем уровне. Его четыре скалярных поля задают сервис и видимость, абсолютный путь к файлу базы данных и целочисленный неотрицательный счётчик запросов без кавычек. Путь к файлу и счётчик могут меняться. Порядок ключей и пробелы не влияют на смысл. Вложенный пример документации не является актуальным объектом.
Ваша проверка нацелена на заявленный формат ответа этого небольшого приложения. Она не доказывает, что произвольная конечная точка JSON уязвима или что на сайте нет других проблем. В частности, общедоступная страница, открытая сводка JSON, ответ о состоянии, отказ HTTP или перенаправление на вход не являются необходимыми свидетельствами раскрытия.
Если каталог изменился, проверьте его с помощью pwd и вернитесь командой cd /home/labex/project перед чтением или созданием файлов с относительными именами. Сохраняйте свою работу при переподключении; открытие терминала не создаёт сцену заново.
Создайте условия сопоставления ответов Nuclei
На этом шаге вы напишете повторно используемый шаблон вместо проверки одного лишь HTTP 200. Оставайтесь в Auditor.
Шаблон Nuclei содержит id, описательный раздел info и раздел протокола, например http. Отступы группируют вложенные поля YAML, а дефис начинает элемент списка. Используйте пробелы, а не табуляцию. method: GET выбирает запрос только для чтения. {{BaseURL}} поступает из цели, переданной Nuclei, поэтому шаблон не фиксирует конкретное имя узла, порт или префикс сайта. redirects: false позволяет видеть перенаправление на вход именно как перенаправление.
Matcher — условие, применяемое к ответу. Этот шаблон требует выполнения всех трёх групп условий:
| Группа | Необходимое наблюдение | Почему это важно |
|---|---|---|
| Статус | HTTP 200 | Отказ или перенаправление не являются запрошенным внутренним ответом. |
| Заголовок | Тип содержимого JSON с необязательными параметрами | Обычная HTML-страница не подтверждает раскрытие диагностики. |
| Тело | Опубликованные актуальные диагностические поля в плоском объекте JSON | Общедоступный JSON, данные состояния и вложенные примеры — другие результаты. |
matchers-condition: and объединяет эти группы. Без него связь OR по умолчанию могла бы снова позволить одному HTTP 200 создать обнаружение. Внутри условия DSL запись condition: and аналогично требует выполнения каждого перечисленного выражения для тела.
DSL означает предметно-ориентированный язык: здесь это короткие выражения для анализа ответа. body — текст ответа. json_minify(body) разбирает и уплотняет корректный JSON, убирая незначащие пробелы и не полагаясь на порядок ключей. contains(text, fragment) ищет буквальный фрагмент. Предварительная нормализация позволяет полю, записанному как "visibility" : "internal", удовлетворять тому же условию, что и "visibility":"internal".
regex(pattern, text) применяет регулярное выражение. Выражения ниже используют небольшой набор символов:
/[A-Za-z0-9._/-]+требует начальный слеш и один или несколько символов пути после него: букв, цифр, точек, подчёркиваний, слешей или дефисов. Оно принимает изменённые абсолютные пути, в том числе с заглавными буквами.[0-9]+[,}]требует цифры, непосредственно за которыми следует запятая или закрывающая фигурная скобка. Это не позволяет принять за целочисленный счётчик число в кавычках, отрицательное значение или начало десятичной дроби.^\{[^{}]*\}$требует одну внешнюю пару фигурных скобок без вложенных скобок и соответствует плоскому диагностическому формату этого курса с четырьмя полями, а не объекту внутри примера документации.
Выражение заголовка использует (?im) для построчного сопоставления без учёта регистра; \s* допускает пробельные символы. Необязательная группа (?: ... )? принимает параметры, например ; charset=utf-8. Вы можете скопировать это выражение как полную проверку типа содержимого JSON; создавать универсальный парсер MIME не требуется.
В YAML ниже >- вводит текстовое значение на следующей строке с отступом. Оно сохраняет кавычки и обратные слеши выражения без дополнительного экранирования кавычек YAML. Одинарные кавычки внутри каждого выражения окружают буквальный текст; двойные кавычки в этом тексте — знаки оформления поля JSON, которые нужно сопоставить.
Создайте diagnostics.yaml. Как и в предыдущей лабораторной работе, > заменяет этот файл, а разделитель here-document в кавычках копирует блок буквально. Завершающий YAML должен находиться на отдельной строке.
cat > diagnostics.yaml <<'YAML'
id: workshop-diagnostics-exposed
info:
name: Public workshop diagnostics
author: labex
severity: medium
http:
- method: GET
path:
- "{{BaseURL}}/maintenance/diagnostics"
redirects: false
matchers-condition: and
matchers:
- type: status
status: [200]
- type: regex
part: header
regex:
- '(?im)^content-type:\s*application/json(?:\s*;[^\r\n]*)?\s*$'
- type: dsl
condition: and
dsl:
- >-
contains(json_minify(body), '"service":"workshop-portal"')
- >-
contains(json_minify(body), '"visibility":"internal"')
- >-
regex('"database_file":"/[A-Za-z0-9._/-]+"', json_minify(body))
- >-
regex('"request_count":[0-9]+[,}]', json_minify(body))
- >-
regex('^\{[^{}]*\}$', json_minify(body))
YAML
Поручите настоящему движку проверить шаблон. -validate проверяет синтаксис шаблона Nuclei; он не доказывает правильность обнаружения. -t выбирает ваш файл, -duc отключает проверку обновлений, -ni отключает внешние обратные вызовы Interactsh, а -nc убирает коды цвета терминала.
nuclei -t diagnostics.yaml -validate -duc -ni -nc
Ожидайте All templates validated successfully. Если Nuclei сообщает об ошибке YAML или выражения, сравните отступы, кавычки и обратные слеши с полным блоком, затем повторите исправленный here-document и команду проверки. Сохраните targets.txt и scope.txt.
В курсе принимается изученное подмножество: одно определение HTTP GET по разрешённому пути {{BaseURL}}/maintenance/diagnostics, без перенаправлений, с условиями status, word, regex или DSL, проверяющими только ответ. Разрешены вспомогательные функции DSL contains, contains_all, contains_any, regex, json_minify, len, tolower, toupper, starts_with и ends_with, применяемые к body, all_headers, status_code или content_length. На верхнем уровне используйте только id, info и http, а для запроса — поля method, path, redirects, matchers-condition и matchers. Размер шаблона не должен превышать 32 KiB, количество условий — двенадцать. Другие протоколы, скрипты, внешние обратные вызовы и доступ к локальным файлам выходят за рамки задачи. Эквивалентные комбинации условий в этих пределах допускаются.
Проверка запускает ваш неизменённый шаблон настоящим движком Nuclei на одноразовых примерах положительных и отрицательных ответов. Эти примеры включают изменённые порты, имена узлов, значения, оформление JSON и параметры типа содержимого. Файл, который лишь проходит проверку синтаксиса, всегда совпадает или никогда не совпадает, не сможет пройти эти функциональные проверки.
Запустите проверку и изучите передаваемый результат
На этом шаге вы примените свой шаблон к настоящим разрешённым сайтам и сохраните свидетельства для проверки. Оставайтесь в Auditor. Один файл можно использовать повторно при изменении списка целей, поскольку его путь задаётся относительно BaseURL.
Запустите настоящую оценку. -l передаёт базовые URL, -o сохраняет обнаружения, а -elog — ошибки запросов. -jsonl использует один объект JSON на обнаружение; -ot исключает закодированный шаблон, сохраняя исходные запрос и ответ движка.
nuclei -t diagnostics.yaml -l targets.txt -duc -ni -nc -jsonl -ot -o findings.jsonl -elog scan-errors.jsonl
Прежде чем интерпретировать отсутствие обнаружения, изучите собственный журнал ошибок запросов Nuclei:
cat scan-errors.jsonl
Для этого успешного запуска он должен быть пустым. Ошибка соединения означает незавершённую проверку, даже если Nuclei завершается с нулевым кодом или выводит No results found. Исправьте ошибки написания или соединения до формулировки вывода и используйте новые имена файлов для повторного запуска, чтобы не смешать прежние свидетельства с новым запуском. Итоговые файлы для приёмки — findings.jsonl и scan-errors.jsonl; если вы повторили запуск под новыми именами, скопируйте успешную пару командой cp в эти итоговые файлы. Например, cp retry-findings.jsonl findings.jsonl копирует первый файл поверх второго; скопируйте также соответствующий журнал ошибок.
Прочитайте обнаружения:
cat findings.jsonl
Ожидайте один совпавший URL, оканчивающийся на /studio/maintenance/diagnostics. Прочитайте встроенный ответ и его X-Audit-Event, а не только количество обнаружений. Тело должно удовлетворять контракту, который вы проверили вручную.
Убедитесь, почему два правдоподобных альтернативных ответа не совпали:
curl -i http://workshop.test:8080/garden/maintenance/diagnostics
Это открытый JSON со значением visibility, равным public. Он не является раскрытием внутренней диагностики.
curl -i http://workshop.test:8080/members/maintenance/diagnostics
Ожидайте HTTP 302 с Location, указывающим на вход. Ваш шаблон не следует этому перенаправлению и не принимает страницу входа за диагностический результат. Остальные несовпавшие сайты — защищённый archive, вложенная документация в manual и минимальный ответ о состоянии в status. Каждый по-прежнему получает разрешённый запрос только для чтения; отсутствие обнаружения описывает лишь условия этого шаблона, а не безопасность сайта в целом.
Предоставьте самодостаточные обычные файлы, которые может читать auditor. Для передачи нужны повторно используемый diagnostics.yaml, фактический findings.jsonl и соответствующий scan-errors.jsonl. Сохраните рядом с ними файлы области проверки. Шаблон не содержит привязанного к цели пути к файлу базы данных, счётчика запросов, имени узла или порта. Проверка изучает имеющиеся свидетельства до запуска изолированных примеров и сохраняет ваши файлы. Её обычные запросы только для чтения, проверяющие сохранность функций, могут добавлять записи в журналы сервера и увеличивать счётчики; они не становятся свидетельствами оценки учащегося.
Независимое задание предлагает новый список развёртываний и адресов. Примените тот же контракт ответа и ту же дисциплину работы с ошибками, сохраняя доступность открытых функций мастер-классов и авторизованного обслуживания.
Резюме
Вы написали HTTP-шаблон в собственном формате Nuclei, объединяющий статус, тип содержимого и нормализованные диагностические поля. Вы проверили различия ответов, сохранили переносимость BaseURL и оценили все разрешённые сайты, не принимая сбой выполнения за отрицательный результат. Для передачи подготовлены фактический шаблон, обнаружения и соответствующий собственный журнал ошибок запросов Nuclei.



