Перейти к содержимому

Поиск по платформе

Type Juggling: Magic Hash Collision

API-логин через токен использует loose comparison (==) между md5-хэшами. Magic hash вида 0e[0-9]+ интерпретируется как научная нотация (0.0), что приводит к коллизии хэшей и обходу аутентификации.

Автор: Hack & Fix
Освоишь: strict equality (===)typed schema
Легко+30 XP ~20 мин php
CWE-704 · A03:2021 Pro
Обложка: Type Juggling: Magic Hash Collision Обложка: Type Juggling: Magic Hash Collision
Задача
# Манипуляция типами: магические хэши в токен-логине ## Сценарий Магазин спортивного питания **SportPit** много лет назад интегрировался со складским софтом, и от той эпохи остался API-эндпоинт входа по токену: клиент присылает JSON с именем пользователя и секретом, сервер вычисляет от секрета хэш и сверяет с сохранённым значением. Настоящий токен администратора нигде не светится — в базе лежит только хэш. Перед отключением интеграции команду попросили проверить, можно ли войти этой учётной записью, не зная токена, — и вы точно знаете, где искать. ## Цель 1. Изучите логику токен-логина: как сервер проверяет присланный секрет и каким оператором сравнивает хэши. 2. Пройдите проверку под привилегированной учётной записью, не зная её настоящего токена. 3. Получите сессионную cookie этой учётной записи и откройте с ней страницу профиля. ## Теория **Манипуляция типами (type juggling)** — класс ошибок PHP, где нестрогое сравнение приводит операнды к числам по неинтуитивным правилам. Если обе строки выглядят как число в экспоненциальной записи с нулевой мантиссой, интерпретатор считает их числами, и любые две такие строки оказываются «равными» — при том что их содержимое совершенно разное. К хэшам это применимо напрямую: часть хэшей популярной быстрой функции по чистой случайности попадает в этот формат, и тогда присланный секрет с «подходящим» хэшем проходит проверку вместо настоящего. **Уязвимый паттерн:** ```php $submittedHash = md5((string)$token); if ($submittedHash == $row['token_hash']) { // нестрогое сравнение хэшей ``` Механика словами: проверка верна, только пока обе стороны — «обычные» строки. Как только обе строки распознаются как числа в научной записи, сравнение уходит из мира байтов в мир чисел, и вся криптография хэша обнуляется: совпадение содержимого больше не требуется. Такие «магические» значения для быстрой хэш-функции давно найдены и опубликованы — подбирать их перебором не нужно. ## Точка входа атаки `POST /api/token-login` — JSON-тело с полями `username` и `token`; при успехе выдаёт ту же сессионную cookie, что и обычная форма входа. * **Обычный пользователь:** `demo` / `demo` (для сравнения поведения) * **Целевая учётная запись:** `admin`

Похожие лабораторные (2)

другие лабы по этой уязвимости
Обложка лабы: Type Juggling: JSON-аутентификация с loose comparison Обложка лабы: Type Juggling: JSON-аутентификация с loose comparison
Type Jug

Type Juggling: JSON-аутентификация с loose comparison

JSON-API логина сравнивает пароль с хешем через loose == . В БД хранится хеш-строка вида 0e830... (magic hash), которая коэрсится в число 0.0. Отправив {"password": 0}, атакующий заходит как admin.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: Type Juggling: ошибочная интерпретация strcmp() Обложка лабы: Type Juggling: ошибочная интерпретация strcmp()
Type Jug

Type Juggling: ошибочная интерпретация strcmp()

На PHP 8.2 эндпоинт /promo приводит ввод к строке, но принимает `strcmp(...) < 1`: любой отрицательный результат ошибочно считается совпадением секретного токена.

+60 XP
PHP Pro
Exploit Fix