3 min read

[CTF GEMA] GG

CTF GEMA Groupe 2025

Niveau de Difficulté : Insane

Catégorie du Challenge : Web

Description :
Just hack me!

Steps to Solve

CL.CL Internal Page Access

  • Type d'attaque : Content Length. Content Length (CL.CL)
  • L'attaquant doit effectuer une attaque HRS normale en utilisant des techniques CL.CL pour contourner les restrictions du serveur frontal afin d'accéder aux pages du panneau d'administration interne pour supprimer l'utilisateur administrateur Alice par le biais d'une fonctionnalité interne.

En regardant la page web, on remarque un contenu statique avec des fonctionnalités qui ne relèvent pas de la logique du backend, comme la recherche, la connexion, etc...

Nous n'obtenons rien, mais nous savons que 90% des interfaces web ont des panneaux d'administration à gérer. Nous essayons donc d'accéder à /admin et nous obtenons une erreur 403.

Nous n'obtenons rien d'utile à partir de cela, mais en regardant les en-têtes de la requête, nous pouvons dire que le serveur utilise nginx et un serveur de mise en cache devant lui.

La plupart du temps, lorsque des couches de serveurs se superposent, des failles de sécurité apparaissent en raison d'incohérences dans leur mise en œuvre ou leur configuration.

A partir de là, nous prenons notre feuille de contrôle sur la contrebande de requêtes et commençons à essayer tous les scénarios possibles, car c'est le seul moyen de repérer les attaques HRS dans la nature.

Lorsque nous avons essayé CL.CL comme dans l'image ci-dessous, le serveur s'est bloqué, il semble qu'il attende que le corps de la requête soit envoyé, il a donc lu la première longueur de contenu comme étant le corps de la requête.

Si nous intervertissons les valeurs des en-têtes de longueur de contenu et envoyons la requête plusieurs fois, nous obtiendrons cette réponse 400.

Cela signifie que notre requête a été introduite clandestinement d'une manière ou d'une autre, mais qu'elle est analysée de manière incorrecte parce que quelque chose a été omis dans la requête.

Maintenant, la contrebande de requête est plus comme un essai et un échec jusqu'à ce que cela fonctionne, nous devrons jouer avec la requête contrebattue et les en-têtes de longueur de contenu jusqu'à ce que nous n'obtenions pas d'erreur ou au moins que nous recevions une réponse différente de l'erreur ou de la page d'index par défaut.

Notez que nous essayons d'accéder à /404 qui est, espérons-le, une page inexistante qui renverra un message 404 lorsqu'elle aura été correctement dissimulée.

Après quelques essais, nous avons obtenu une réponse différente 405 not allowed error for trying to access /404.

Si nous avons eu de la chance, nous pourrons accéder à la page /admin/ car elle devrait accepter le type de requête que nous envoyons

Et nous avons accédé à la page d'administration ! Maintenant, si nous vérifions le code source pour la suppression de l'utilisateur, nous verrons le point de terminaison pour la suppression de l'utilisateur delete_user.php avec le paramètre name.

En utilisant la même méthode pour accéder à la page d'administration, nous avons généré le POC pour la suppression d'un utilisateur.

L'utilisateur a été supprimé et nous avons obtenu le flag !

Flag

FLAG{I_like_potatoes}