XML Injection (auch bekannt als Blind XPath Injection)

Beschreibung

XML Injection ist eine Schwachstelle, die auftritt, wenn Software ein XML-Dokument oder eine XPath-Abfrage ganz oder teilweise unter Verwendung von extern beeinflussten Eingaben einer vorgelagerten Komponente konstruiert, aber Spezialelemente, die die beabsichtigte XML-Struktur oder Abfragelogik modifizieren könnten, nicht oder nicht korrekt neutralisiert. Angreifer nutzen dies aus, indem sie XML-Metazeichen wie spitze Klammern (<, >), Ampersands (&), Anführungszeichen (", ') und XPath-Operatoren einschleusen, um XML-Dokumente zu manipulieren oder XPath-basierte Authentifizierung und Zugriffskontrollen zu umgehen. Dies kann zu Informationsoffenlegung, Authentifizierungsumgehung, Datenmanipulation und in schweren Fällen zu Server-Side Request Forgery oder Denial-of-Service durch XML-Entity-Expansion-Angriffe führen.

Risiko

XML-Injection-Schwachstellen können je nach Art der XML-Datenverarbeitung durch die Anwendung schwerwiegende Folgen haben. XPath-Injection in Authentifizierungssystemen kann eine vollständige Authentifizierungsumgehung ermöglichen. XML-Dokument-Injection kann Datenstrukturen beschädigen, bösartige Inhalte einschleusen oder das Anwendungsverhalten ändern. In Kombination mit XML External Entity (XXE)-Schwachstellen können Angreifer Server-Side Request Forgery erreichen, lokale Dateien lesen oder Denial-of-Service verursachen. Anwendungen, die XML für Konfiguration, Datenaustausch oder SOAP-Webservices verwenden, sind besonders gefährdet. Die Komplexität des XML-Parsings und die verschiedenen Injection-Punkte machen umfassenden Schutz herausfordernd.

Lösung

Verwenden Sie parametrisierte XPath-Abfragen, wenn diese über XML-Verarbeitungsbibliotheken verfügbar sind. Bereinigen Sie alle Benutzereingaben durch Escaping von XML-Sonderzeichen: < zu &lt;, > zu &gt;, & zu &amp;, " zu &quot; und ' zu &apos;. Implementieren Sie strikte Eingabevalidierung mit Allowlists für erwartete Datenformate. Deaktivieren Sie die Verarbeitung externer Entitäten in XML-Parsern, um XXE-Angriffe zu verhindern. Verwenden Sie moderne, sichere XML-Bibliotheken mit sicheren Standardkonfigurationen. Für XPath-Abfragen erwägen Sie die Verwendung vorkompilierter Abfragen mit Variablenbindung, sofern unterstützt. Vermeiden Sie die Konstruktion von XML-Dokumenten durch String-Verkettung; verwenden Sie stattdessen DOM-Manipulation oder XML-Builder.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

XPath-Injection kann Daten aus XML-Dokumenten extrahieren, einschließlich Authentifizierungsanmeldedaten, persönlicher Informationen und vertraulicher Geschäftsdaten.
ZugriffskontrolleBereich: Zugriffskontrolle

Authentifizierungsumgehung durch XPath-Injection ermöglicht unbefugten Zugriff auf geschützte Funktionen ohne gültige Anmeldedaten.
IntegritätBereich: Integrität

XML-Injection kann die Dokumentstruktur modifizieren, gespeicherte Daten ändern oder bösartige Inhalte einschleusen, die das Anwendungsverhalten beeinflussen.

Beispielcode + Lösungscode

Anfälliger Code

<?php
// ANFÄLLIG: XPath-Injection in Authentifizierung
function authenticate($username, $password) {
    $xml = simplexml_load_file('users.xml');

    // Angriff: username=' or '1'='1' or 'a'='a   password=beliebig
    // Ergibt: //user[username='' or '1'='1' or 'a'='a' and password='beliebig']
    $query = "//user[username='" . $username . "' and password='" . $password . "']";

    $result = $xml->xpath($query);
    return count($result) > 0;
}

// ANFÄLLIG: XML-Dokument-Konstruktion
function addComment($author, $content) {
    $xml = file_get_contents('comments.xml');
    // Angriff: content=</comment><comment><author>hacker</author><content>bösartig
    $newComment = "<comment><author>$author</author><content>$content</content></comment>";
    // Vor schließendem Tag einfügen
    $xml = str_replace('</comments>', $newComment . '</comments>', $xml);
    file_put_contents('comments.xml', $xml);
}
?>

Korrigierter Code

<?php
// SICHER: Escapte XPath-Abfragen
function authenticate($username, $password) {
    $xml = simplexml_load_file('users.xml');

    // XPath-Sonderzeichen escapen
    $safeUsername = escapeXPath($username);
    $safePassword = escapeXPath($password);

    $query = "//user[username='" . $safeUsername . "' and password='" . $safePassword . "']";

    $result = $xml->xpath($query);
    return count($result) > 0;
}

function escapeXPath($input) {
    // XPath 1.0 hat kein ordnungsgemäßes Escaping für Anführungszeichen
    // Beste Methode: concat() für Strings verwenden, die beide Anführungszeichen enthalten
    if (strpos($input, "'") === false) {
        return $input;
    }
    if (strpos($input, '"') === false) {
        return $input;
    }
    // Enthält beide - concat verwenden
    $parts = explode("'", $input);
    return "concat('" . implode("',\"'\",'", $parts) . "')";
}

// SICHER: DOM-basierte XML-Konstruktion
function addComment($author, $content) {
    $dom = new DOMDocument();
    $dom->load('comments.xml');

    // Eingabe validieren
    if (strlen($author) > 100 || strlen($content) > 1000) {
        throw new InvalidArgumentException("Eingabe zu lang");
    }

    // Elemente mit DOM erstellen - übernimmt automatisch das Escaping
    $comment = $dom->createElement('comment');
    $authorElem = $dom->createElement('author');
    $authorElem->appendChild($dom->createTextNode($author));
    $contentElem = $dom->createElement('content');
    $contentElem->appendChild($dom->createTextNode($content));

    $comment->appendChild($authorElem);
    $comment->appendChild($contentElem);

    $dom->documentElement->appendChild($comment);
    $dom->save('comments.xml');
}
?>

Ausgenutzt in der Praxis

SOAP-Webservice-Angriffe (Unternehmensanwendungen, fortlaufend)

XML-Injection-Angriffe gegen SOAP-basierte Webservices wurden genutzt, um Authentifizierung zu umgehen, sensible Daten zu extrahieren und Transaktionen in Unternehmensanwendungen einschließlich Finanzdienstleistungen und Gesundheitssystemen zu manipulieren.


Tools zum Testen/Ausnutzen

  • Burp Suite — Web-Sicherheitstestplattform mit XML/XPath-Injection-Testfähigkeiten.

  • XPath Injection Payloads — Sammlung von XPath-Injection-Payloads für verschiedene Angriffsszenarien.


CVE-Beispiele

  • CVE-2023-28708 — Apache Tomcat Session-Fixation kombiniert mit XPath-Injection.

  • CVE-2021-42013 — Apache HTTP Server Path-Traversal ermöglicht XML-Konfigurationsmanipulation.


Referenzen

  1. MITRE. "CWE-91: XML Injection (aka Blind XPath Injection)." https://cwe.mitre.org/data/definitions/91.html

  2. OWASP. "XPath Injection." https://owasp.org/www-community/attacks/XPATH_Injection