Securitylab•July 23, 2026•🇷🇺Translated from Russian

PHP Type Juggling Vulnerabilities: How Loose Comparisons Enable Authentication Bypass in Legacy Applications

PHP has long outgrown its origins as a language for small websites. Banking portals, CRMs, e-commerce platforms, corporate intranets, and APIs now run on it, yet one of its oldest features continues to produce critical vulnerabilities: automatic type coercion known as Type Juggling.

For developers, comparing a string with a number without explicit casting feels convenient. For penetration testers, it offers a reliable way to bypass password checks, HMAC validation, token verification, or authorization logic. That is why PHP Type Juggling challenges appear regularly in CTF competitions, PortSwigger labs, and older real-world applications.

Why Type Juggling Exists

PHP uses dynamic typing. Variables have no fixed type, and the interpreter constantly converts values to the most suitable type. The expression $a = "10"; $b = 10; var_dump($a == $b); returns true because the string is interpreted as the integer 10. Problems arise when non-numeric strings are forced into numeric comparisons, producing unexpected results that can completely alter application logic.

Loose versus Strict Comparison

The operator == performs loose comparison after type coercion, while === checks both type and value. Consequently, "10" === 10 evaluates to false, but "10" == 10 evaluates to true. Using == with passwords, tokens, HMAC values, or cryptographic hashes creates the conditions for Type Juggling attacks.

Most Dangerous Coercions and Magic Hashes

When a string begins with digits, PHP uses only the numeric portion. In older versions, "admin" == 0 and "0admin" == 0 both returned true. The most famous technique involves scientific notation: the string "0e12345" is treated as the number zero. This behavior enables magic hash attacks where two different MD5 hashes starting with 0e followed only by digits compare as equal after coercion to zero.

Array-to-String Substitution and NULL Returns

Attackers can supply ?token[]=123 to force $_GET['token'] into an array. In older PHP versions, functions such as hash_hmac() return NULL and emit a warning when given an array instead of a string. The subsequent loose comparison NULL == "" succeeds, completely bypassing signature validation.

PHP 8 Improvements and Remaining Risks

PHP 8 changed many string-to-number comparisons so that "admin" == 0 now returns false. Nevertheless, large numbers of applications still run on PHP 7.4 and earlier, and new vulnerabilities continue to appear from incorrect handling of NULL values, arrays, and cryptographic results.

Detection and Defense

Testers should look for == or != near calls to md5(), sha1(), hash(), or hash_hmac(), especially in token or cookie validation logic. Defenses include replacing all loose comparisons with ===, using hash_equals() for cryptographic values, explicitly rejecting arrays where strings are expected, and calling in_array($value, $array, true) to enforce strict comparison.

The article concludes with an invitation to practice on the ONE TASK challenge “At Jamshut’s” available after free registration for the White Hacker Profession course, allowing participants to discover and exploit a realistic Type Juggling flaw in a production-like application.

Related articles

Habr•Vulnerabilities & Exploits

Enodia: Open-Source Go Tool Automates Service Inventory, EOL Tracking and CVE Correlation

A DevOps engineer has released enodia, a single-binary Go CLI that discovers real versions of services across large heterogeneous environments and correlates them with end-of-life calendars and vulnerability databases. The tool was built after manual Ansible-based inventories and existing solutions such as endoflife.date, nvchecker, Renovate and Uptime Kuma proved insufficient for covering both infrastructure and application services while also providing actionable lifecycle, patch and branch status. Enodia uses product-specific probes for 123 technologies including PostgreSQL, MySQL, MariaDB, Jira, Confluence, Bitbucket, VMware vCenter, ESXi, pfSense and multiple Linux distributions, falling back to a generic URL-plus-regex probe when needed. Data collection is deliberately separated from evaluation so that inventory.jsonl files can be generated inside air-gapped networks and later analysed where CVE feeds are available. The project also contributed dozens of missing products and corrected EOL dates to the endoflife.date project and integrates both NVD and Russia’s FSTEC BDU vulnerability databases. Special handling was added for MySQL/MariaDB connection-error counters, version-string masquerading, and vendor-specific update nomenclature to avoid false reports.

BoletimSec•Vulnerabilities & Exploits

Telegram Voice Call Flaw Allows Remote Code Execution on Android Devices

Security researchers disclosed a vulnerability in Telegram for Android that enables remote code execution on a victim's device simply by answering a voice call. The attacker requires only a standard account, and the flaw was present in versions 8.6.2 through 12.10.3 released between March 2022 and September 2026. Telegram addressed the issue in version 12.10.4, released at the end of September 2026. The root cause lies in improper handling of the MediaState message exchanged during calls, specifically when processing rotation values and missing video state fields, leading to out-of-bounds memory reads. The same underlying fix was deployed earlier to shared call libraries, iOS, and desktop clients, but reached Android later. Researchers confirmed the impact only on private calls running on ARM64 Android devices, with no evidence of exploitation in the wild or public CVE assignment as of October 29, 2026.

安全客•Vulnerabilities & Exploits

360 Security Cloud Opens PHP2Shell Vulnerability Self-Check Platform to Government and Enterprise Users

360 Security Cloud has launched a dedicated self-assessment platform that allows organizations to scan their PHP-based websites and systems for the PHP2Shell vulnerability. The service is now available to government agencies, large enterprises, and small-to-medium businesses. Users can apply by scanning a provided QR code to determine how many of their assets run PHP, identify affected versions, and check whether any systems have already been compromised. The platform addresses key questions about exposure: the number of PHP-powered sites and systems, the presence of vulnerable versions, and signs of prior intrusion. The announcement emphasizes that the tool helps organizations proactively assess risk without requiring external assistance. The original Chinese report was published on October 30, 2026, and the service is positioned as a practical response to ongoing PHP-related security concerns.

Habr•Vulnerabilities & Exploits

Liferay Community Edition Misconfiguration Exposes Plaintext Passwords in Government Systems via CWE-319

A detailed analysis reveals how the use of Liferay Community Edition in a closed government information system led to the transmission of user passwords in plaintext through transactional emails. The issue stemmed from default notification templates that included the [$PASSWORD$] macro, combined with unadjusted system variables pointing to localhost instead of the production domain. Despite proper OAuth 2.0 delegation and CSRF protections, the misconfigured password change workflow sent permanent credentials in clear text to user inboxes. The root cause was traced to custom portlets that incorrectly reused the New Password Notification trigger intended only for administrator-initiated resets. Remediation involves removing the password macro from email templates and updating portal-ext.properties to enforce production host settings. The case highlights how open-source enterprise platforms require thorough hardening beyond initial code audits when deployed in high-security environments.