CRLF Injection
Inyección CRLF
Descripción
La inyección CRLF es una vulnerabilidad en la que un atacante logra inyectar una secuencia CRLF (retorno de carro y salto de línea) en la respuesta, lo que le permite manipular el cuerpo y/o los encabezados de la respuesta.
Los ataques de inyección CRLF incluyen:
- HTTP Response Splitting
Un ataque en el que un atacante inserta secuencias CRLF en la entrada del usuario, con el objetivo de manipular la respuesta HTTP generada por la aplicación web. Esto puede llevar a diversas consecuencias, como la inyección de contenido malicioso o la elaboración de respuestas engañosas.
- HTTP Header Injection
Implica inyectar secuencias CRLF en los encabezados HTTP. Este ataque puede provocar problemas de seguridad, permitiendo que un atacante agregue o modifique encabezados, lo que potencialmente puede llevar al envenenamiento de caché (cache poisoning), fijación de sesión (session fixation) u otras formas de compromiso de la aplicación web.
- Memcache Injection
Un tipo de ataque CRLF que se dirige a sistemas que utilizan Memcached, un sistema de caché de memoria distribuida. Los atacantes inyectan secuencias CRLF para manipular el contenido almacenado en Memcached, lo que posiblemente lleve a envenenamiento de caché, divulgación de información o denegación de servicio.
- Server-Side Request Forgery:
Un ataque más amplio que a veces involucra la inyección CRLF. En este escenario, un atacante engaña al servidor para que realice solicitudes a recursos internos inyectando entradas maliciosas que contienen secuencias CRLF. El atacante puede explotar esto para acceder a información confidencial, pivotar a través de sistemas internos o realizar acciones no autorizadas en nombre del servidor.
import flask
from flask import request
from flask import make_response
app = flask.Flask(__name__)
@app.route("/")
def index():
header = request.args.get("header")
username = request.args.get("username")
resp = make_response("Hello: %s" % username)
resp.headers.set(header, username)
return resp
app.run(host="0.0.0.0", port=8080)
GET /?header=GET%20/?name=A:a%0a%0dA:d%0d%0d%0a%0dInjected-Header&username=abc HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0
Referrer: http://localhost/
HTTP/1.1 200 OK
Server: Werkzeug/2.3.7 Python/3.10.12
Date: Tue, 09 Jan 2024 11:03:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 10
GET /?name=A:a
A:d
Injected-Header: abc
Connection: close
Hello: abc
Recomendación
- Actualizar a la última versión del software: La inyección CRLF generalmente afecta al servidor web o al proxy inverso (reverse proxy) en sí, por lo tanto, se recomienda mantenerlo actualizado.
- Evitar configurar el nombre del encabezado a partir de la entrada del usuario: Permitir a los usuarios controlar los nombres de los encabezados HTTP puede llevar a varios problemas de seguridad, incluida la inyección CRLF.
- Saneamiento de la entrada del usuario: en algunos casos, podría ser posible lograr una inyección CRLF si la aplicación web concatena la entrada del usuario en los encabezados de respuesta o cookies; por lo tanto, la entrada del usuario debe ser saneada de caracteres especiales.
GET /?page=login%0D%0ACustom-Header:%20vulnerable HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0
Referrer: http://localhost/
HTTP/1.1 200 OK
Date: Wed, 05 Jan 2024 12:00:00 GMT
Server: Apache/2.4.58 (Unix)
Content-Length: 1234
Content-Type: text/html; charset=UTF-8
Set-Cookie: page=login%0D%0ACustom-Header:%20vulnerable
<body>
Enlaces
Estándares
- GDPR:
- ART_25
- ART_32
- PCI_STANDARDS:
- REQ_6_4
- REQ_6_5
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255