L'encodage en base 64 et le hachage des mots passe sont deux outils qui peuvent protéger d'une attaque de type SQL injection.





0x01. ENCODAGE


 
<?php
/*
 * Authentication checks : login base64 encoded, password hash with custom function
 * ------------------------------------------------------------------------------------------
 */
 
if( isset($_POST["pwd"]) ) {
  mysql_connect("db_host","db_user","db_password");
 
  if( $_GET["page"] == "inscription" ) {
    $res = mysql_query("INSERT INTO `db_users`.`tbl_auth` (`usr`, `pwd`) VALUES ('".base64_encode($_POST["usr"])."', '"
                       .custom_hash($_POST["pwd"])."');");
 
    if( $res ) {
      echo "Register successful.";
    }
  }
 
  if( $_GET["page"] == "connexion" ) {
    $sql = "SELECT * FROM `db_users`.`tbl_auth` WHERE usr LIKE '".base64_encode($_POST["usr"])."' AND pwd LIKE '"
            .custom_hash($_POST["pwd"])."'";
 
    $res = mysql_query($sql);
    if( $res ) {
      $obj = mysql_fetch_object($res);
 
      if( $obj ) {
        echo "Connected as user: ".base64_decode($obj->usr);
      }
    }
  }
}  ?>
 
 




0x02. HASH



Si un hash MD5 ou SHA1, ou peu importe ce "casse", enfin se "bruteforce" grâce à des grosses base de données, ce même hash avec un grain de sel
est déjà plus compliqué à "cracker".
Cette fonction, ajoute "un grain de sel" de 31 caractères, ce qui complique pas mal la tâche...
...mais on va en plus, compresser ce texte (gzdeflate), l'encoder en base 64 (pour le stocker en base de donnée) et finalement, pour rendre toute tentative de retrouver le mot de passe, on va remplacer les lettres du hash (a, b, c, d, e & f) par des chiffres :


nico@secureinfo> php custom_hash.php "password"
3726486832118828331552328020078665545454
 
<?php
/*
 * Sha1 hash with salt, base64 encode and compression ...
 * and a custom replacement
 * ------------------------------------------------------------------------------------------
 */
 
function custom_hash($str,$salt1="y.fph_xAuJuvB%S,=UZFeM=8B0xg1QG")
{
  $match = array( 0=> "a", "b", "c", "d", "e", "f" );
  $replace = array( 0=> "4", "8", "2", "9", "5", "0" );
  $res = base64_encode( gzdeflate($salt1.$str) );
  return(  str_replace( $match,$replace,sha1($res) )  );
}
?>
 



   =>   Écrit par : Nicolas, le 04 septembre 2015


 
Mots clés :  
  poc 
  
  sql 
  
  web 
  
  php 
    >   Articles connexes :

Backdoor via injection SQL


Nous allons voir comme effectuer une injection SQL en contournant la protection par addslashes().

HTTP Server, tell me who you are ?


Discuter avec un serveur web *apparement* muet ? Voici comment faire...

TLD et Indexes téléphoniques



Troll The Lamer



6949212