(
PHP)
Type JugglingЭтот пост начну с предповествования.
У различных языков программирования разный подход к типизации - то есть к тому, насколько строго ЯП будет относиться к типам переменным (int, float, string и т.д.). Здесь будет идти речь о свободно типизированных языках программирования (eng: loosely typed), а в частности о PHP, как о ЯП, который собрал в себе наиболее интересные штуки, о которых рассказано далее. Данные языки стараются "предугадывать", что имел в виду программист или пользователь и делать внутри неявное преобразование переменных в другие типы. К слову, некоторые подходы могут быть применимы и к другим свободно типизорованным ЯП, например Perl, JavaScript, но у них есть своя специфика, о которой здесь рассказывать не буду.
Итак,
🟪Type Juggling - автоматическая конвертация типов в свободно типизированных языках программирования.
По своей сути это является особенностью языка, а не уязвимостью. Тем не менее, неаккуратное ее использование зачастую приводит к неожиданным последствиям, которые зачастую результируют в проблемы безопасности.
🟣Тип:Programming Language, Web, Server-Side.
Наибольший интерес в данном ключе вызывают операции сравнения. В PHP их два вида:
📝свободное (loose):
==
или
!=
📝строгое (strict):
===
иди
!==
И самые интересные моменты всплывают как раз в первом типе.
🟣Пример уязвимого кода:
if (md5($user_input) == '0e732793752744629114494286417663') { ...
В данном случае если пользователь введет что-то, что при преобразовании в int будет давать 0 (например
GTJ3YSmZ
в md5 будет 0e{digits...}), то условие будет истинным, так как для PHP обе эти строки будут конвертироваться в 0 (данный синтаксис возводит 0 в огромную степень, что результирует в 0).
Еще один интересный пример
'abc' == 0
. Данное условие будет истинным, так как в первой строке PHP будет смотреть на ее начало в поиске цифр, по ненахождению которых он будет считать строку нулем. То есть следующее условие также будет истинным:
'23abc' == 23
Больше подобных сравнений я поместил в скрине к посту (источник)
🟣 Влияние:Такие штуки помогают обходить разные условные конструкции и критичность будет зависеть от расположения подобной проблемы в коде. Один из наиболее базовых и критичных импактов - возможность обходить контроль доступа при авторизации (сравнение хешей паролей) - тут и появилось понятие "магических хешей" (magic hashes).
🟣 Как защититься?Использовать строгое (`===`) сравнение и использовать функции
password_hash()
,
password_verify()
и
hash_equals()
для работы с хешами и паролями. (Ну и md5 не используйте для этих целей - он уже давно признан старым, оставьте в покое старичка).
На самом деле, в наши дни такое можно встретить только на CTF, где оно используется очень часто. Последние версии PHP умеют элегантно справляться с подобными проблемами и большинством способов обхода защиты, а даже если и используется более старая версия языка, то обнаружить эту проблему без наличия исходных кодов (и явных признаков от самого приложения) крайне сложно. Но тем не менее, знать о существовании этого очень полезно и может пригодиться во многих сферах работы.
#edu #vuln #programming #web #php #php_type_juggling #magic_hashes #type_juggling