Ін'єкція в заголовок Host
Лист про скидання пароля справжній. Посилання в ньому — не ваше.
Що таке Ін'єкція в заголовок Host?
Застосунки будують посилання для скидання пароля із заголовка Host або X-Forwarded-Host вхідного запиту, і тому автор запиту вирішує, куди ці посилання ведуть. Ви відтворите запит на скидання пароля зі схожим доменом у X-Forwarded-Host , змусите застосунок надіслати справжній токен у вашому посиланні й повторно використаєте його, поки він діє, щоб заволодіти обліковим записом. Потім ви побудуєте базову адресу із заданої в конфігурації APP_BASE_URL замість даних запиту й додасте список дозволених хостів на проксі-сервері. Така сама схема ховається в підписаних URL для завантаження та в ключах кешу.
Що ви дізнаєтесь у Ін'єкція в заголовок Host
- Розпізнавайте <code>req.headers.host</code> як недовірені вхідні дані: заголовок — це заява автора запиту про те, куди він надіслав запит, а не про те, що це за застосунок
- Застосовуйте виправлення з константою з конфігурації: будуйте URL із <code>process.env.APP_BASE_URL</code> (значення задають для кожного середовища в конфігурації розгортання), а не зі значень, похідних від запиту
- Поєднуйте це виправлення із суворим списком дозволених значень заголовка Host на рівні фреймворку чи проксі-сервера, щоб був захищений і кожен інший код, який і далі читає заголовок
- Перевіряйте кожне місце, де будуються URL (шаблони листів, підписані URL для завантаження, перенаправлення, ключі кешу, нижні колонтитули листів), на такий самий антипатерн
- Усвідомте: заголовки запиту контролює зловмисник, конфігурацію розгортання — оператор, а базові адреси URL, критичні для безпеки, мають лежати на боці оператора
Ін'єкція в заголовок Host — Кроки навчання
-
Скористайтеся функцією скидання пароля
Боб полює на облікові записи Verdanta. Це застосунок для особистих фінансів, тож кожен обліковий запис, яким він заволодіє, відкриває прямий доступ до чиїхось справжніх банківських залишків. Нічийого пароля він не знає, тому починає там, де пароль не потрібен: зі сторінки відновлення пароля. Спершу він надсилає форму зі своєю одноразовою адресою, щоб достеменно побачити, який запит робить сторінка.
-
Знайдіть ендпоінт
Запит пішов, і браузер його записав. Боб відкриває вкладку Network («Мережа»), щоб побачити, куди сторінка його насправді надіслала.
-
Прочитайте схему тіла запиту
Один запит — і Боб дізнається все, що йому потрібно. Він дивиться, що сторінка передала в тілі запиту.
-
Підробіть запит на скидання пароля
Боб відтворює той самий запит в API Tester, де може додати те, чого браузерна форма йому ніколи не дозволяє задати: підроблений заголовок Host. Він просить скинути пароль для справжнього облікового запису Аліси, але повідомляє застосунку, що запит надійшов на account-verdanta.app — схожий домен, який він зареєстрував і контролює (зверніть увагу на .app, тоді як справжній сайт Verdanta — account.verdanta.com). Якщо застосунок будує посилання для скидання пароля із цього заголовка, лист Аліси міститиме його домен і її справжній токен.
-
Відповідь нічого не виказує
API відповідає звичайним 200 і загальним повідомленням. Ніщо у відповіді не натякає, що щось пішло не так, і саме тому ця помилка непомітна. Шкода не у відповіді, яку бачить Боб. Вона в листі, який уже лежить у поштовій скриньці Аліси, з посиланням, що починається з його домену.
-
Лист про скидання пароля
Поза робочим часом Аліса отримує від Verdanta лист про скидання пароля. Вона його не замовляла, але він виглядає точнісінько як справжній: той самий відправник, ті самі слова, те саме оформлення.
-
Натисніть посилання для скидання пароля
Аліса натискає посилання, щоб скинути пароль, — так, як зробив би будь-хто.
-
Подивіться на адресний рядок
Відкривається сторінка скидання пароля. Вона виглядає як сторінка Verdanta, але адресний рядок показує інше.
-
Перехопіть токен
Клік Аліси так і не дійшов до Verdanta. Її браузер відкрив сервер, який контролює Боб, — account-verdanta.app, і токен скидання пароля вирушив туди в URL. Повернувшись до власного комп'ютера, Боб дивиться кінець журналу доступу цього сервера, щоб побачити, що щойно надійшло.
-
Повторно надішліть токен
Токен належить Алісі, але тепер він у руках Боба, а токенам скидання пароля байдуже, хто їх пред'являє. Поки токен не втратив чинності, Боб повторно надсилає його на справжній ендпоінт і задає пароль на власний вибір.
Охоплення стандартів безпеки
OWASP Top 10
- A02:2025 Security Misconfiguration
- A05:2021 Security Misconfiguration
CWE
- CWE-644 Improper Neutralization of HTTP Headers for Scripting Syntax
- CWE-640 Weak Password Recovery Mechanism for Forgotten Password
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security