Outils pour utilisateurs

Outils du site


web:injection_xpath

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
web:injection_xpath [2016/03/15 11:00]
yorin
web:injection_xpath [2016/07/04 08:38] (Version actuelle)
Ligne 1: Ligne 1:
-__**1)Présentation de la Vulnérabilité ​**__+**Faille XPath Injection**
  
 +**1.Présentation de la Vulnérabilité **
  
-__**2)Exploit **__+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 inaccessibles. 
 + 
 +**2.Exploit **
  
 __2.1 XPATH Authentification__ __2.1 XPATH Authentification__
Ligne 12: Ligne 15:
 Maintenant, notre but est d'​utiliser un tweak sur les valeurs username et password pour renvoyer une réponse **TRUE** et bypasser 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:+Une partie ​à découvrir, c'est le nœud courant. Pour rappel la sémantique d'une Xpath estUn axe, un nœud, des prédicats. Ici notre nœud est username:
 Pour tester : Pour tester :
 <​code>​ username='​ or '​1'​='​1 </​code>​ <​code>​ username='​ or '​1'​='​1 </​code>​
  
-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é :+username est le nom de la variable ​renvoyée ​par le formulaire, on ferme ensuite la chaîne de caractères avec **'** puis on ajoute une vérité :
 **or '​1'​='​1** ​ **or '​1'​='​1** ​
 On n'​ajoute pas de **'** , $xpath s'en charge pour nous. On n'​ajoute pas de **'** , $xpath s'en charge pour nous.
Ligne 25: Ligne 28:
  
 Se connecter avec le premier utilisateur : <​code>​ username='​ or '​1'​='​1&​password='​ or '​1'​='​1 </​code>​ Se connecter avec le premier utilisateur : <​code>​ username='​ or '​1'​='​1&​password='​ or '​1'​='​1 </​code>​
-Cette requête renverra TRUE, nous serons donc loggé ​avec la première ​utilisateur de la liste, ici FrankyVincent. ​+Cette requête renverra TRUE, nous serons donc logué ​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: Si vous suivez un peu, vous voyez déjà que l'on peut bypasser le password par une fermeture en plus ! Voici:
  
 <​code>​ username='​ or '​1'​='​1'​ or ''​='&​password= </​code>​ <​code>​ username='​ or '​1'​='​1'​ or ''​='&​password= </​code>​
  
-ce qui donne dessous ​la machine :+ce qui donne sous le capot de la machine :
  
 <​code>​ $xpath = "//​username[username=''​ or '​1'​='​1'​ or ''​=''​ and password=''​]";​ </​code>​ <​code>​ $xpath = "//​username[username=''​ or '​1'​='​1'​ or ''​=''​ and password=''​]";​ </​code>​
  
-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+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 loguer ​en admin par exemple
  
 <​code>​ username=admin'​ or '​1'​='​1'​ or ''​='&​password= </​code>​ <​code>​ username=admin'​ or '​1'​='​1'​ or ''​='&​password= </​code>​
Ligne 45: Ligne 48:
 <​code>​ Invalid XPath syntax : //​username/​user[contains(.,​ ''​ )')] </​code>​ <​code>​ Invalid XPath syntax : //​username/​user[contains(.,​ ''​ )')] </​code>​
  
-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 ! +En voici une erreur qui en dit long ! On récupère notre nœud (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 +Il est important de savoir que contains attend un string en 2ème paramètre qui va être chercher dans le premier, donc dans le nœud actuel.
  
 Notre but est donc de fermer la requête, fermer le prédicat puis recommencer une requête complète. Notre but est donc de fermer la requête, fermer le prédicat puis recommencer une requête complète.
Ligne 71: Ligne 74:
 <​code>​ $xpath=//​username/​user[contains(.,''​)]/​../​*[('​1'​='​1'​)] </​code>​ <​code>​ $xpath=//​username/​user[contains(.,''​)]/​../​*[('​1'​='​1'​)] </​code>​
  
-On remonte dans l'​arborescence et affiche tout le contenu de l'​ensemble des noeuds ​“user” et tous ses attributs.+On remonte dans l'​arborescence et affiche tout le contenu de l'​ensemble des nœuds ​“user” et tous ses attributs.
  
 L'​injection : <​code>​ username='​)]/​../​*[('​1'​='​1 </​code>​ renverra: L'​injection : <​code>​ username='​)]/​../​*[('​1'​='​1 </​code>​ renverra:
Ligne 90: Ligne 93:
   * **Décédé**   * **Décédé**
  
-__**3)Remédiation ​de la Vulnérabilité **__+**3.Comment s'en protéger** 
 + 
 +Tout comme les injections SQL il faut échapper 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ées par la version XML encoded à savoir "&​apos;"​. 
 + 
 +<​code>​ 
 +VB: 
 +Dim FindUserXPath as String 
 +FindUserXPath = "//​Employee[UserName/​text()='"​ & Request("​Username"​).Replace("'",​ "&​apos;"​) & "'​ And  
 +        Password/​text()='"​ & Request("​Password"​).Replace("'",​ "&​apos;"​) & "'​]"​ 
 + 
 +C#: 
 +String FindUserXPath;​ 
 +FindUserXPath = "//​Employee[UserName/​text()='"​ + Request("​Username"​).Replace("'",​ "&​apos;"​) + "'​ And  
 +        Password/​text()='"​ + Request("​Password"​).Replace("'",​ "&​apos;"​) + "'​]";​ 
 +</​code>​ 
 + 
 +source : [[https://​www.owasp.org/​index.php/​XPATH_Injection]]
web/injection_xpath.1458039618.txt.gz · Dernière modification: 2016/07/04 08:37 (modification externe)