POXEK Telegram 4781
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



tgoop.com/poxek/4781
Create:
Last Update:

(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

BY Похек




Share with your friend now:
tgoop.com/poxek/4781

View MORE
Open in Telegram


Telegram News

Date: |

Step-by-step tutorial on desktop: Don’t publish new content at nighttime. Since not all users disable notifications for the night, you risk inadvertently disturbing them. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more. End-to-end encryption is an important feature in messaging, as it's the first step in protecting users from surveillance. Telegram message that reads: "Bear Market Screaming Therapy Group. You are only allowed to send screaming voice notes. Everything else = BAN. Text pics, videos, stickers, gif = BAN. Anything other than screaming = BAN. You think you are smart = BAN.
from us


Telegram Похек
FROM American