Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
hackingweek_2014:web:web2 [2014/03/06 15:02] nico34 |
hackingweek_2014:web:web2 [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Code source disponible pour cette épreuve : https://repo.zenk-security.com/hackingweek2014_ctf/web2.zip | Code source disponible pour cette épreuve : https://repo.zenk-security.com/hackingweek2014_ctf/web2.zip | ||
- | code index.php | ||
+ | code index.php | ||
<code html> | <code html> | ||
<?php session_start(); ?> | <?php session_start(); ?> | ||
Ligne 222: | Ligne 222: | ||
- | Pour accéder à la page success.php qui provoque le "cataclysme" il faut que la condition ($query == "taagle") soit validé dans la fonction search_query($query). | + | Pour accéder à la page success.php qui provoque le "**cataclysme**" il faut que la condition ($query == "taagle") soit validé dans la fonction search_query($query). |
+ | |||
+ | |||
+ | |||
+ | Première analyse des filtres effectués en début de code sur $query ($_GET): | ||
+ | |||
+ | $query = htmlspecialchars($_GET['query'], ENT_QUOTES, 'ISO-8859-1'); | ||
+ | * http://us3.php.net/manual/fr/function.htmlspecialchars.php fonction PHP qui permet de convertir les caractères &<>'" en leur équivalent HTML | ||
+ | $query = strtolower($query); | ||
+ | * http://us3.php.net/manual/fr/function.strtolower.php fonction PHP qui permet de mettre une chaine en minuscule | ||
+ | $query = truncate_query($query); | ||
+ | * fonction définie dans le code qui permet de tronquer une chaine à 50 caractères max. | ||
+ | $query = forbidden_query($query); | ||
+ | * fonction définie dans le code qui permet d'obfusquer (masquer) une chaine si elle contient des mots clés (google,taagle,bing...) | ||
+ | $query = filter_query($query); | ||
+ | * fonction définie dans le code qui permet de remplacer "\r", "\n", "\t", "\\" par "\n" et de conserver que la première partie | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | La fonction search_query est appelé via "$results = search_query($query);" après l'appel des filtres. | ||
+ | |||
+ | |||
+ | |||
+ | Si on entre le mot clé "taagle" dans le champs de recherche nous avons en résultat "$�=" ce qui est pas top :) (l'obfuscation fonctionne bien) | ||
+ | |||
+ | il faut donc trouver quelle chaine de caractère entré pour avoir "taagle" en sortie ! | ||
+ | |||
+ | il faut regarder la fonction obfuscate_query de plus près. | ||
+ | <code php> | ||
+ | function obfuscate_query($query) | ||
+ | { | ||
+ | global $obf_seq; // clé pour le xor masqué dans le fichier require ../secret.php | ||
+ | |||
+ | for($i = 0; $i < strlen($query); $i++) // boucle sur la longueur de la chaine query | ||
+ | { | ||
+ | $query[$i] = chr(ord($query[$i]) ^ $obf_seq[$i % count($obf_seq)]); // XOR entre les charactères de query et la clé | ||
+ | } | ||
+ | |||
+ | $query = str_rot13($query); // appel à la fonction rot13 pour faire un décalage de 13 dans l'alphabet (26) | ||
+ | |||
+ | return $query; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Ensuite il faut exploiter la fonction filter_query pour forcer le passage dans la fonction d'obfuscation et conserver que notre chaine de caractère qui écrit "taagle" | ||
+ | |||
+ | filter_query("test\t titi"); | ||
+ | |||
+ | va retourner test | ||
+ | |||
+ | si l'on fait | ||
+ | |||
+ | filter_query("test\t taagle");# test taagle | ||
+ | |||
+ | va retourné $�/eJ.�25 car la présence du mot clé "taagle" nous fait entrer dans la fonction d'obfuscation. | ||
+ | |||
+ | il faut donc faire un script qui poste une chaine de caractère de la forme : | ||
+ | |||
+ | <caractères> \t taagle | ||
+ | |||
+ | ou l'on fait une itération sur chaque <caractère> (caractère ascii 00 caractère ascii 01 caractère ascii 02 ....) jusqu'a l'obtention d'un **t** | ||
+ | |||
+ | puis on cherche le deuxième caractère qui donne un **a** ... et ainsi de suite. | ||
+ | |||
+ | |||
+ | voici un code qui permet de le faire (en php :) ) | ||
+ | |||
+ | le code se résume à "$start.$char.'taagle'" | ||
+ | * $start = le début de la chaine (vide au début) | ||
+ | * $char = itération pour chercher | ||
+ | * 'taagle' = pour forcer l'obfuscation | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | # url du moteur taagle | ||
+ | $url = "http://91.121.9.92/web2/search.php?query="; | ||
+ | |||
+ | # ce que l'on cherche à obtenir dans la réponse du moteur de recherche | ||
+ | $comps = str_split('taagle'."\t"); | ||
+ | |||
+ | $start=""; | ||
+ | foreach($comps as $key=>$cmp){ #pour chaque char recherché | ||
+ | for($i=0;$i<256;$i++){ # on boucle sur la table ascii 256 # 128 n'a pas trouvé toute les lettres | ||
+ | |||
+ | $char = chr($i); # on convertie l'int en caractère ascii # string chr ( int $ascii ) | ||
+ | $res = getQuery($url,urlencode($start.$char.'taagle')); # récupère le résultat de la page | ||
+ | if(!isset($res[1][0])){ # si pas de résultat | ||
+ | $http = file_get_contents($url.urlencode($start.$char.'taagle')); # on récupère la page avec notre mot ($start) | ||
+ | if (strpos($http,'cataclysme') !== false) { # si il y a cataclysme sur la page | ||
+ | echo "\n\n url $url".urlencode($start.$char.'taagle'); # on affiche l'url trouvé afin de la consulter | ||
+ | exit(); # fin | ||
+ | } | ||
+ | } | ||
+ | else{ # sinon (il y a une réponse) | ||
+ | $tmp = (string)$res[1][0]; | ||
+ | $str = str_split($res[1][0]); | ||
+ | echo "."; # des petits points | ||
+ | if(ord($str[$key]) == ord($cmp)){ # si le mot chercher est dans la page on concatène le caractère qui à permis de l'obtenir à $start | ||
+ | |||
+ | echo "\n".urlencode($char)." : ".urlencode($cmp)."\n"; # on affiche | ||
+ | $start=$start."$char"; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | function getQuery($url,$query){ #r écupère le résultat de la requete faite au moteur taagle | ||
+ | $res = file_get_contents($url.$query); | ||
+ | |||
+ | $patern="@<span>(.*)</span>@";# <span>$query.net</span> | ||
+ | preg_match_all($patern,$res,$matches); | ||
+ | |||
+ | return $matches; | ||
+ | } | ||
+ | ?> | ||
+ | </code> | ||
+ | |||
+ | http://img15.hostingpics.net/pics/981774web2.png | ||
+ | |||
+ | |||
+ | |||
+ | la solution est | ||
+ | |||
+ | http://91.121.9.92/web2/search.php?query=7%9A2%19%02%06%3Btaagle | ||
+ | |||
+ | |||
+ | http://img15.hostingpics.net/pics/317320cataclysme.png | ||
+ | http://img15.hostingpics.net/pics/533569success.png | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||