¿Qué hace type-juggling?
Bypass de comparación débil y manipulación de tipos en PHP (==). Útil cuando la autenticación, la verificación de HMAC/firmas o la validación de tokens utilizan igualdad laxa, coerción numérica o comparaciones de hash sin tipos estrictos, común en PHP heredado y rutas de código estilo CTF.
Descripción General
Esta habilidad proporciona herramientas para explotar vulnerabilidades de type juggling en PHP. Las comparaciones débiles (==) en PHP pueden conducir a comportamientos inesperados cuando se comparan valores de diferentes tipos, permitiendo a menudo bypass de seguridad.
Plataformas Soportadas
- Sistemas Unix (macOS, Linux, WSL)
- Windows (PowerShell, CMD)
Prerrequisitos
- Node.js: Versión LTS 18.x o superior
- npm: Normalmente incluido con Node.js
Instalación
npm install -g @yaklang/type-juggling
Uso
Como Asistente de CLI
El comando yak-juggling proporciona varias utilidades:
# Verificar comparación de hash
yak-juggling check-hash <hash_value> <known_plaintext>
# Generar payload para bypass
yak-juggling generate --type <type> --target <target_value>
# Listar tipos de bypass disponibles
yak-juggling list-types
Tipos de Bypass Comunes
| Tipo | Descripción | Ejemplo |
|---|---|---|
numeric | Strings numéricos que se convierten al mismo número | "123" == 123 → true |
hash-md5 | Comparación de hash MD5 | "0e12345..." == "0e67890..." → true |
hash-sha1 | Comparación de hash SHA1 | "0e12345..." == "0e67890..." → true |
array | Comparación de arreglos | [] == false → true |
boolean | Coerción booleana | "false" == false → false (¡cuidado!) |
Ejemplo de Detección y Bypass
Escenario: Bypass de Autenticación
// Código vulnerable
if ($_POST['password'] == $stored_hash) {
// Autenticado
}
- Detectar el patrón de comparación débil
- Determinar el tipo de hash (MD5, SHA1, etc.)
- Generar un payload que produzca una comparación verdadera
yak-juggling generate --type hash-md5 --target "0e215962017"
Consideraciones de Seguridad
- Solo usar en entornos autorizados (pruebas de penetración, CTF, laboratorios)
- Las aplicaciones modernas de PHP deberían usar
===yhash_equals()para comparaciones seguras - Esta habilidad es principalmente para demostrar y educar sobre la importancia de la comparación estricta de tipos
Solución de Problemas
| Problema | Causa | Solución |
|---|---|---|
comando no encontrado | npm global no está en PATH | Agregar $(npm root -g)/bin al PATH |
Error de permiso | Permisos de instalación insuficientes | Usar sudo npm install -g o configurar npm correctamente |
Versión de Node.js no soportada | Node.js desactualizado | Actualizar a Node.js 18.x o superior |