Magic Hash: دور زدن مقایسهی رمز با Type Juggling در PHP
یک نوع خاص از آسیبپذیری Deserialization/Type Juggling که با یک رشتهی هش خاص، هر مقایسهی رمز را true میکند.
در PHP، مقایسهی غیر-strict (==) بین دو رشته که هر دو با 0e شروع میشوند و بقیهشان فقط رقم است (مثل 0e123456789)، بهصورت عددی تفسیر و هر دو برابر صفر علمی در نظر گرفته میشوند — یعنی "0e123" == "0e456" نتیجهی true میدهد! اگر یک رمز هششده بهطور تصادفی این الگو را داشته باشد و مقایسه با == (نه ===) انجام شود، یک "magic hash" آن را دور میزند.
ارتباط با Deserialization
این دسته از باگها معمولاً وقتی یک مقدار از یک آبجکت deserializeشده (که نوع واقعی آن قابلکنترل است) در یک مقایسهی غیر-strict قرار میگیرد، ظاهر میشوند.
راهحل
همیشه از مقایسهی strict (===) برای مقایسهی رمزها و هشها استفاده شود؛ و از توابع مقایسهی امن در برابر timing attack مثل hash_equals().