3. Attack API
Suggestions¶
Wenn Introspection deaktiviert dann könnte man trotzdem mit Suggestions informationen ermitteln. GraphQL-Server schlägt dann vor was man meinen könnte.
Wie ein Angreifer das nutzt - Idee in 3 Schritten¶
- Schicke eine absichtlich falsche Query (z. B. Tippfehler im Feldnamen).
- Lies die Fehlerantwort: enthält sie Vorschläge, bekommst du valide Feld/Typ-Namen.
- Wiederhole / automate → baue so (teilweise) das Schema nach.
Bypassing GraphQL introspection defenses¶
Wenn man keine introspection queries laufen lassen kann könnte man versuchen einfach
- nur ein special character hinter __schema anfĂĽgen.
- Oder POST in GET ändern
- Oder POST Request mit Content-Type x-www-form-urlencoded
GET /graphql?query=query%7B__schema%0A%7BqueryType%7Bname%7D%7D%7D
Lab: Finding a hidden GraphQL endpoint¶
- API Endpunkte finde durch manuelles testen möglich
- Schauen ob der Endpunkte queries nimmt
- Jetzt können wir mit unserer InQL Extension einen introspection query setzen
{ width="675" }
- Wir stellen fest der Server hat einen Filter dagegen
- Filter umgehbar mit einfachen
%0a(New line) - Dann geschaut was es so gibt und folgendes gefunden.
- Wir schicken das an unsere
Target->Site mapum zu schauen welche API queries es gibt. - Dann beide Requests an den Repeater und Variable-Feld decoded, bearbeitet und wieder encoded
- Mit dem einen querie konnten wir user auslesen und deren ID(Variable in Smart Decoder um die ID manuell zu ändern)
- Mit der anderen Querie konnten wir dann User löschen anhand ihrer ID
Rate Limit umgehen¶
- GraphQL ist ein Post-Request, der viele Fragen in einem Request beantworten kann.
- Alias = du gibst einer Frage in derselben Anfrage einen neuen Namen, damit du dieselbe Frage mehrfach stellen kannst.
- Viele Server zählen nur Anfragen pro Minute (z. B. 100 Requests/min). Wenn du aber in einem Request 50 Fragen packst, zählt das immer noch als 1 Request — ergo: du kannst mehr ausprobieren, ohne das Rate-Limit auszulösen.
z. B.
query {
a: isValidDiscount(code: "CODE1") { valid }
b: isValidDiscount(code: "CODE2") { valid }
c: isValidDiscount(code: "CODE3") { valid }
}
Lab: Bypassing GraphQL brute force protections¶
GrapgQL CSRF¶
GraphQL kann im Zusammenhang mit CSRF genutzt werden. Wir können gewisse Payloads bauen und die dann über CSRF bei anderen Usern einschläusen.
Diese Schwachstelle entsteht wenn der Content-Type nicht validiert wird. In diesem Fall können wir x-www-form-urlencoded nutzen