Type Juggling: обход strcmp() через массив
Эндпоинт /promo сравнивает секретный токен через strcmp() с `== 0`. Отправка promo_token[]=x превращает strcmp() в NULL, а NULL == 0 — true: проверка обходится.
mediumphpPro
Задача
# Lab: Type Juggling — обход strcmp() через некорректную интерпретацию результата
## Сценарий
SecureShop добавил специальную страницу "Promo Redemption" — по секретному административному токену любой пользователь может получить "CTF Flag" бесплатно. Токен хранится в базе и должен быть длинной случайной строкой — угадать невозможно.
Разработчик использовал `strcmp()` для сравнения присланного токена с сохранённым значением, но неправильно интерпретировал возвращаемое значение: `strcmp()` возвращает `0` только при равенстве строк, и отрицательное число, если первая строка лексикографически меньше. Неверная проверка приняла **любую** строку, лексикографически меньшую админского секрета, за "равную".
Твоя задача — обойти проверку токена и получить "CTF Flag" на аккаунт `demo`, не зная секретного значения.
## Цели
1. Залогиниться под `demo` / `demo`.
2. Обойти проверку промо-токена на эндпоинте `POST /promo` и получить заказ "CTF Flag" на свой аккаунт.
3. Убедиться, что на странице `/profile` появился заказ "CTF Flag".
## Данные
| Параметр | Значение |
|----------|----------|
| Эндпоинт | `POST /promo` |
| Пользователь | `demo` / `demo` |
| Поле формы | `promo_token` |
| Проверка результата | `GET /profile` должен показывать "CTF Flag" в списке заказов |
## Ограничения
- Подбирать точное значение токена нельзя: это длинная случайная строка.
- Утечка секрета из кода/БД не предполагается — сервер доступен только по HTTP.
- Нужен специфичный для PHP трюк при сравнении строк / интерпретации возвращаемого значения.