the_open_door
café
ESEN
← Volver al índice

SQL Truncation

Arsenal completo de comandos en la cheatsheet

El SQL truncation es un ataque de toma de cuentas que explota un desajuste entre la longitud que acepta la aplicación y la que almacena la base de datos. No es una inyección SQL: no se rompe ninguna consulta. El fallo está en que la base de datos trunca silenciosamente los valores que superan la longitud de la columna y, además, elimina los espacios finales.

La mecánica. Supongamos una columna email VARCHAR(20) con un índice único, y un registro que valida "este correo no existe todavía". El atacante quiere apoderarse de admin@book.htb:

  1. Envía admin@book.htb + espacios + relleno, por ejemplo admin@book.htb 123 (más de 20 caracteres).
  2. La validación de la aplicación compara esa cadena con las existentes: es distinta de admin@book.htb, así que pasa el control de duplicados.
  3. La base de datos trunca a 20 caracteres (admin@book.htb ) y recorta los espacios finales, dejando admin@book.htb.
  4. Como ese correo ya existe, según la configuración la fila se sobrescribe (o se crea una segunda "admin" indistinguible), quedando la contraseña bajo control del atacante.

Pista para detectarlo. Cualquier campo que trunque la entrada de forma visible (un nombre que se corta a N caracteres) sugiere límites de longitud estrictos en el esquema. Si el correo o el usuario tienen el mismo comportamiento, el truncation es candidato. Conviene confirmar el límite registrando un valor que, al truncarse, choque con una cuenta existente (la aplicación dará un error de duplicado).

Detalles prácticos. Los paneles suelen rechazar espacios en el frontend; se evita enviando la petición con Burp y los espacios URL-codificados (%20). El comportamiento depende del SGBD y su modo (MySQL en modo no estricto trunca sin error; en modo estricto aborta).

Payload de ejemplo

El correo objetivo, seguido de espacios (que la base de datos recorta) y un carácter de relleno para superar la longitud de la columna (por ejemplo VARCHAR(20)):

curl -s -X POST http://<host>/register \
  --data-urlencode 'email=admin@book.htb                        a' \
  --data-urlencode 'password=hacked123'
# comprobar la toma de la cuenta
curl -s -X POST http://<host>/login --data 'email=admin@book.htb&password=hacked123'

Defensa. Validar la longitud antes de llegar a la base de datos y rechazar (no recortar) lo que la exceda; activar el modo estricto del SGBD para que el truncado sea un error, no un silencio; normalizar (trim) en la capa de aplicación de forma consistente; usar restricciones de unicidad robustas. Relacionado con la enumeración de usuarios (saber qué cuenta atacar) y el account takeover en general.

Máquinas donde se aplica