Poison Null Byte


El Poison Null Byte también conocido como The Poisoned NUL Byte fue originalmente denominado como tal por Olaf Kirch, en un post del news group fa.linux.security, donde al agregar NULL bytes/characteres en aplicaciones que no manejan adecuadamente postfix null terminators permitía a un atacante explotar un sistema usando técnicas como Local File Inclusión.

El exploit de Poison Null Byte se aprovecha de las cadenas con una longitud conocida que pueden contener bytes nulos, al colocar un byte nulo en un byte determinado, la cadena se terminará en ese punto, anulando el resto de la cadena que se encuentra luego del byte nulo, por ejemplo podría ser el caso de la extensión de un archivo.

Existen varias formas de explotar un Poison Null Byte, entre ellas las siguientes:
  • La terminación de un nombre de archivo en una cadena, por ejemplo, la extensión del archivo.
  • Terminar o comentar una instrucción SQL de forma dinámica cuando se ejecuta, por ejemplo el 'EXECUTE IMMEDIATE' de Oracle.

Perl/PHP Null Byte Injection

Un ejemplo de un script PHP vulnerable al Null Byte es el siguiente:

$file = $_GET['file'];
require_once("/var/www/$file.php");

A pesar de que el script anterior es aparentemente seguro ya que está forzando a usar la extensión ".php", este podría ser explotado de la siguiente forma:

http://vulnerable.com/index.php?file=../../etc/passwd

La url anterior es un ejemplo de como explotar esta vulnerabilidad, como se puede observar al final de la ruta a cargar se agregó el Null Byte "", esto lo que hará es que la extensión ".php" que supuestamente era obligatoria/forzada se pierda, y el archivo /etc/passwd sea cargado además notese que también se esta usando otro concepto llamado Directory Transversal para poder escalar directorios hasta nuestro objetivo.

Java Null Byte Injection

Arshan Dabirsiaghi estudió a finales del 2007 Null Byte Injections en Java, Arshan descubrió dos errores en los que Java tiene un mal manejo de los bytes nulos.

String path_to_file = request.getParameter("target") + ".xls";
File f = new File(filePath);
deliver_to_user(contentsOf(f));

Al igual que en PHP/C/C++ este es un código que podría ser atacado vía Poison Null Byte para ver cualquier archivo del sistema, también funciona en Java debido a que File(filePath) pasa lo que haya ingresado el usuario como ruta para abrir un archivo, aquí se puede ver un código de prueba: http://i8jesus.com/stuff/Test.java

Soluciones

PHP

Hay varias formas de prevenir el Poison Null Byte Injection en PHP, estas incluyen escapar el NULL byte con un backslash, sin embargo, la forma más recomendable de hacerlo es eliminar por completo el Null Byte usando un código como este:

$file = str_replace(chr(0), '', $string);

Perl

Al igual que con PHP, Perl tiene varias opciones para tratar con inyecciones de caracteres nulos. También como con PHP, se recomienda no escapar el byte, sino eliminarlo completamente utilizando un código como el siguiente:

$data = ~s/\0//g;

.NET

Los problemas en .NET se solucionaron con los siguientes parches:
KB928365 (Security Update for Microsoft .NET Framework 2.0)
KB928366 (Security Update For Microsoft .NET Framework 1.1)

Comentarios