Saltar al contenido

¿Qué significa tener un “nombre de archivo con bytes NULL en instancias serializadas”?

Eduardo, parte de este gran equipo, nos hizo el favor de redactar este tutorial porque controla perfectamente este tema.

Solución:

A null byte es un byte con el valor cero, es decir, 0x00 en hexadecimal.

Ha habido vulnerabilidades de seguridad relacionadas con null bytes Estos ocurren porque C usa null bytes como un string terminador Otros lenguajes (Java, PHP, etc.) no tienen un string terminador; almacenan la longitud de cada string por separado.

Ahora, considere una aplicación web Java que acepte cargas de archivos. Tal vez queremos permitir que los usuarios carguen .jpg archivos, pero nada más. De hecho, si un usuario puede subir un .jsp archivo, esto será una vulnerabilidad de seguridad grave.

Lo que un hacker podría intentar es subir hack.jsp.jpg. Pensemos en cómo se procesará esto. Primero, Java mirará el nombre del archivo, verá que termina en .jpg y permitir la carga. Luego llama a la biblioteca del sistema operativo, que está escrita en C. C ve el personaje como el string terminador, por lo que guarda el archivo como hack.jsp.

Muchos idiomas solucionan esto al no permitir explícitamente bytes en nombres de archivo. Sé que Python y PHP hacen esto. Sin embargo, si su idioma no hace esto por usted, debe hacerlo usted mismo. Más información – OWASP: Inyección de bytes nulos

No sé cómo se relacionan exactamente las “instancias serializadas” con esto, pero creo que esto les da una idea de lo que está pasando.

Cada carácter tiene un valor numérico dictado por el juego de caracteres correspondiente. Entonces, por ejemplo, típicamente A es 65 y a es 97. Pero si el número es 0entonces no es realmente un personaje, es un “null”; lo que básicamente significa no es un personaje.

En C y C++, este “null”carácter se usa para significar el final de un string. Así que “HOLA” se almacena así:

 H   E   L   L   O  
72  69  76  76  79  00 

los 00 al final dice “detente aquí”. Pero no todos los marcos usan C-strings y sus “null terminador”; de hecho, la mayoría no lo hace. En cambio, la longitud del string se almacena por adelantado y el contenido real puede contener cualquier cosa, incluidos estos null caracteres: caracteres cuyo valor numérico es 0.

Entonces, en este caso, si el nombre contiene uno de estos null caracteres, a la mayor parte del código no le importará; null Se permiten bytes. Pero cuando el nombre llega al código FileUpload, eso null termina causando cierta confusión. Parte del código piensa que el nombre termina con el null byte, mientras que otros bits piensan que el null byte es solo otra letra. Esa confusión, donde dos bits de código no concuerdan en cuál es el nombre real, conduce a una vulnerabilidad de seguridad.

Si tienes alguna duda y disposición de aumentar nuestro tutorial te recordamos escribir una explicación y con deseo lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *