GB16500
GB16500 - Cybersecurity Business Convention 2023 - 300 pts⌗
Énoncé⌗
Connectez vous en tant qu’admin pour récupérer le flag !
Solution⌗
Explication⌗
Le but du challenge est d’injecter une requête SQL dans l’input username afin d’obtenir la liste des utilisateurs et leurs mots de passe, et de se connecter en tant qu’administrateur pour obtenir le flag.
La requête est implémentée à l’aide d’une instruction préparée PDO en PHP; par conséquent, les tentatives d’injection SQL doivent être adaptées pour contourner cette méthode.
La vulnérabilité dans le défi existe en raison de l’émulation d’instructions préparées par PDO. Pendant l’émulation, PHP construit internement la requête en remplaçant les espaces réservés par les valeurs
correspondantes. Une instruction préparée émulée par PDO n’envoie pas la requête SQL et les données au serveur séparément, ce qui signifie que la requête est toujours vulnérable aux attaques par injection SQL.
Cependant, pour réduire la probabilité qu’un attaquant injecte via l’émulation d’instructions préparées, pendant l’émulation, la fonction mysql_real_escape_string est appliquée à chaque valeur d’entrée pour
échapper les caractères spéciaux.
La fonction PHP mysql_real_escape_string est appliquée aux valeurs d’entrée pour échapper certains caractères : guillemets simples, guillemets doubles, barre oblique inverse et octets ‘NULL’.
Cependant, il est en fait possible de contourner la fonction mysql_real_escape_string lorsqu’un serveur SQL utilise des ensembles de caractères particuliers, ici GBK.
La fonction mysql_real_escape_string peut être contournée en trompant la fonction pour créer un caractère multibyte valide au lieu d’échapper à un guillemet simple.
Par exemple, dans l’ensemble de caractères GBK, la valeur hexadécimale 0xBF27 n’est pas un caractère multibyte valide. Cependant, dans l’ensemble de caractères ’latin1’, la valeur hexadécimale 0xBF27 représente la chaîne ¿'.
Appliquer la fonction mysql_real_escape_string à cette chaîne ajoutera une barre oblique avant le guillemet simple, résultant en la chaîne ¿' . La chaîne ¿' a une valeur hexadécimale de 0xBF5C27.
Cependant, dans l’ensemble de caractères GBK, cette valeur hexadécimale représente la chaîne 뽜' et par conséquent le serveur interprétera la valeur hexadécimale 0xBF5C27 comme la chaîne 뽜'.
L’entrée de la chaîne ¿' injectera avec succès un guillemet simple, malgré l’utilisation de la fonction mysql_real_escape_string.
Flag⌗
En accédant au challenge, on se retrouve sur un interface web comportant un formulaire, un espace de connexion apparemment réservé pour les astronautes, la version de PHP qui nous indique que la fonction
mysql_real_escape_string est utilisée. Un indice se trouve dans le titre du challenge (GB16500) une petite recherche sur Google : “GBK, ou GB 16500, est un jeu de caractères destiné à représenter les caractères chinois simplifiés….”.
Essayons de lister tout les utlisateurs présent dans la base de donnée en insérant un multibyte avant notre query SQL :

Le serveur nous renvoies effectivement tous les utilisateurs présent dans la BDD. Pour se challenge nous cherchons à nous connecter en tant que RocketAdm, modifions notre query afin d’obtenir les MDP.

Une fois les identifiants récupérés, on récupère le flag:
