Похек
16.4K subscribers
2.08K photos
110 videos
243 files
3.06K links
All materials published on the channel are for educational and informational purposes only.

Мнение автора ≠ мнение компании, где работает автор

Чат: @poxek_chat

Реклама: @PoxekAds_bot или
https://telega.in/c/poxek

РКН: https://clck.ru/3FsVhp
Download Telegram
Forwarded from Hunt Or Be Hunted (Alexey Kosmachev)
(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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥2