Aller au contenu

CRLF Injection

Injection CRLF

Description

L'injection CRLF est une vulnérabilité par laquelle un attaquant parvient à injecter une séquence CRLF (retour chariot et saut de ligne) dans la réponse, lui permettant ainsi de manipuler le corps et/ou les en-têtes de la réponse.

Les attaques par injection CRLF incluent :

  • HTTP Response Splitting

Une attaque où un attaquant insère des séquences CRLF dans les entrées utilisateur, dans le but de manipuler la réponse HTTP générée par l'application web. Cela peut entraîner diverses conséquences, telles que l'injection de contenu malveillant ou la création de réponses trompeuses.

  • HTTP Header Injection

Consiste à injecter des séquences CRLF dans les en-têtes HTTP. Cette attaque peut entraîner des problèmes de sécurité, permettant à un attaquant d'ajouter ou de modifier des en-têtes, ce qui peut potentiellement conduire à un empoisonnement du cache (cache poisoning), une fixation de session ou d'autres formes de compromission d'applications web.

  • Memcache Injection

Un type d'attaque CRLF qui cible les systèmes utilisant Memcached, un système de mise en cache en mémoire distribuée. Les attaquants injectent des séquences CRLF pour manipuler le contenu stocké dans Memcached, pouvant entraîner un empoisonnement du cache, une divulgation d'informations ou un déni de service.

  • Server-Side Request Forgery:

Une attaque plus large qui implique parfois l'injection CRLF. Dans ce scénario, un attaquant trompe le serveur pour qu'il effectue des requêtes vers des ressources internes en injectant des entrées malveillantes contenant des séquences CRLF. L'attaquant peut exploiter cela pour accéder à des informations sensibles, pivoter à travers les systèmes internes ou effectuer des actions non autorisées au nom du serveur.

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

Recommandation

  • Mettre à jour vers la dernière version du logiciel : L'injection CRLF impacte généralement le serveur web ou le proxy inverse (reverse proxy) lui-même, il est donc conseillé de le maintenir à jour.
  • Éviter de définir le nom de l'en-tête à partir des entrées utilisateur : Permettre aux utilisateurs de contrôler les noms d'en-tête HTTP peut entraîner plusieurs problèmes de sécurité, y compris l'injection CRLF.
  • Assainissement des entrées utilisateur : dans certains cas, il peut être possible de réaliser une injection CRLF si l'application web concatène les entrées utilisateur dans les en-têtes de réponse ou les cookies, par conséquent, les entrées utilisateur doivent être purgées des caractères spéciaux.
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>

Liens

Normes

  • 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