Xpath Injection

Was ist eine XPath Injection?

Ähnlich einer SQL Injection, können XPath-Injection-Attacken erfolgen, wenn eine Website vom Anwender bereitgestellte Eingaben für Xpath-Queries für XML-Daten verwendet. Durch das absichtliche Senden bösartiger Informationen kann der Angreifer herausfinden, wie die XML-Daten aufgebaut sind oder auf Daten zugreifen, die für ihn normalerweise nicht zugänglich sind. Wenn die XML-Daten zur Authentifizierung der Anwender zum Einsatz kommen, kann sich der Angreifer mithilfe der Manipulation höhere Rechte verschaffen.

Was schützt gegen XPath Injections?

Wenn XML auf einer Website im Einsatz ist, ist die Weiterverarbeitung von Eingaben des Anwenders üblich. Diese Eingaben müssen jedoch unbedingt bereinigt werden. So ist sichergestellt, dass die Eingabe die XPath-Anfrage nicht manipuliert und zur Ausgabe falscher Daten führt.

Beispiel

Der folgende Code zeigt als Beispiel ein XML-Snippet:

~

<?xml version="1.0" encoding="utf-8"?><Angestellte><Mitarbeiter ID="1"><FirstName>Peter</FirstName><LastName>Meier</LastName><UserName>PMeier</UserName><Password>password$$!</Password><Type>Admin</Type></Mitarbeiter><MitarbeiterID="2"><FirstName>Annika</FirstName><LastName>Helm</LastName><UserName>AHelm</UserName><Password>super!?passwort</Password><Type>User</Type></Mitarbeiter></Angestellte>

~

Angenommen eine Website nutzt solch eine XML-Datei für die Authentifizierung der Nutzer. Wenn Username und Password mitgeteilt wurden, verwendet die Software zum Auffinden des Users Xpath:

Beispiel in C#:

~

String FindUserXPath;FindUserXPath = "//Mitarbeiter[UserName/text()='" + Request("Username") + "' AndPassword/text()='" + Request("Password") + "']";

~

Mit folgender Eingabe ungültiger Benutzerdaten kann sich der Angreifer einen unerlaubten Zugriff verschaffen:

~

Username: test' or 1=1 or 'a'='a

Password: test

FindUserXPath wird //Mitarbeiter[UserName/text()='test' or 1=1 or'a'='a' And Password/text()='test']Das ist gleichbedeutend mit://Mitarbeiter[(UserName/text()='test' or 1=1) or('a'='a' And Password/text()='test')]

~

In diesem Fall muss nur der erste Teil der Eingabe wahr sein, der Teil mit dem Passwort ist irrelevant. Der angegebe Username ist wegen des „1=1“-Teils für alle Mitarbeiter wahr.

Wie lassen sich Xpath Injections verhindern?

Zum Unterbinden dieser Angriffsform muss der Code die Eingabe des Anwenders auf Korrektheit prüfen. Im folgenden Beispiel werden einzelne Anführungszeichen (') zum Beenden vertrauensunwürdiger Eingaben verwendet. Zur Sicherheit müssen diese Eingaben durch die XML-Version des Zeichens ersetzt werden (&apos).

Beispiel in C#:

~

String FindUserXPath;FindUserXPath = "//Mitarbeiter[UserName/text()='" + Request("Username").Replace("'", "&apos;") + "' AndPassword/text()='" + Request("Password").Replace("'", "&apos;") + "']";

~

Eine geeignete Alternative ist die Verwendung von bereits kompilierten Xpath-Anfragen. Diese werden nicht dynamisch aus den Eingaben des Anwenders erzeugt. Dieser Weg ist sicherer, da ein versehentlich vergessenes Zeichen in der Anfrage nicht zur Verarbeitung schädlicher Eingaben führt.