Notice: file_put_contents(): Write of 6789 bytes failed with errno=28 No space left on device in /var/www/tgoop/post.php on line 50

Warning: file_put_contents(): Only 8192 of 14981 bytes written, possibly out of free disk space in /var/www/tgoop/post.php on line 50
Похек@poxek P.4781
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: |

Joined by Telegram's representative in Brazil, Alan Campos, Perekopsky noted the platform was unable to cater to some of the TSE requests due to the company's operational setup. But Perekopsky added that these requests could be studied for future implementation. Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day. When choosing the right name for your Telegram channel, use the language of your target audience. The name must sum up the essence of your channel in 1-3 words. If you’re planning to expand your Telegram audience, it makes sense to incorporate keywords into your name. Each account can create up to 10 public channels Add up to 50 administrators
from us


Telegram Похек
FROM American