curl -v http://localhost/
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.20.1
< Date: Fri, 05 Nov 2021 12:41:58 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Thu, 10 Jun 2021 22:34:09 GMT
< Connection: keep-alive
< ETag: "60c29361-264"
< Accept-Ranges: bytes
<
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
* Connection #0 to host localhost left intact
**¿Qué es la vulnerabilidad de inyección CRLF?**
En un ataque de inyección CRLF, el atacante inserta los caracteres de retorno de carro y salto de línea en la entrada del usuario para engañar al servidor, a la aplicación web o al usuario haciéndole creer que un objeto ha terminado y otro ha comenzado. Aunque las secuencias CRLF no son caracteres maliciosos en sí mismos, pueden utilizarse con intención maliciosa, por ejemplo para dividir la respuesta HTTP.
En las aplicaciones web, una inyección de CRLF puede tener un impacto severo, dependiendo de lo que la aplicación haga con los bloques de solicitud. Las consecuencias pueden ir desde la divulgación de información hasta la ejecución de código, una vulnerabilidad de seguridad de aplicaciones web de impacto directo. No solo a nivel de cabeceras, si no que los logs pueden ser también afectados y se podrían generar logs falsos.
===== Evitar inyección CRLF en Nginx =====
En Nginx esto es fácil de resolver, simplemente evitando las variables "$uri" o "$document_uri" en beneficio de "$request_uri", la cual no interpreta los caracteres CRLF.
**Nginx usando $uri / $document_uri**
location /test/ {
return 302 http://X.X.X.X:8000$uri;
}
Test de ineyección CLRF.
curl -v "http://localhost/test/%0d%0aX-TEST:%20CLRF"
> GET /test/%0d%0aX-TEST:%20CLRF HTTP/1.1
> Host: localhost
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.20.1
< Date: Fri, 05 Nov 2021 12:55:34 GMT
< Content-Type: text/html
< Content-Length: 145
< Connection: keep-alive
< Location: http://X.X.X.X/test/ <--------
< X-TEST: CLRF <-------- INYECCIÒN !!
<
302 Found
302 Found
nginx/1.20.1
* Connection #0 to host localhost left intact
**Nginx usando $request_uri**
location /test/ {
return 302 http://X.X.X.X:8000$request_uri;
}
Test de inyección CLRF.
curl -v "http://localhost/test/%0d%0aX-TEST:%20CLRF"
> GET /test/%0d%0aX-TEST:%20CLRF HTTP/1.1
> Host: localhost
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.20.1
< Date: Fri, 05 Nov 2021 12:58:57 GMT
< Content-Type: text/html
< Content-Length: 145
< Connection: keep-alive
< Location: http://X.X.X.X:8000/test/%0d%0aX-TEST:%20CLRF <---------
<
302 Found
302 Found
nginx/1.20.1
* Connection #0 to host localhost left intact