Translated ['network-services-pentesting/pentesting-web/graphql.md'] to

This commit is contained in:
Translator 2024-07-17 17:16:24 +00:00
parent 0b584b88db
commit 6abae8f4c9

View file

@ -10,7 +10,7 @@ Ander maniere om HackTricks te ondersteun:
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Deel jou haktruuks deur PRs in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
@ -24,7 +24,7 @@ Met die koms van nuwe tegnologieë, insluitend GraphQL, ontstaan ook nuwe sekuri
### Gids vir Brute Force Aanvalle en GraphQL
Om blootgestelde GraphQL-instanties te identifiseer, word die insluiting van spesifieke paaie in gids vir brute force aanvalle aanbeveel. Hierdie paaie is:
Om blootgestelde GraphQL-instanties te identifiseer, word die insluiting van spesifieke paaie in gids virse aanvalle aanbeveel. Hierdie paaie is:
* `/graphql`
* `/graphiql`
@ -43,7 +43,7 @@ Die instrument [**graphw00f**](https://github.com/dolevf/graphw00f) is in staat
#### Universele navrae <a href="#universal-queries" id="universal-queries"></a>
Om te kontroleer of 'n URL 'n GraphQL-diens is, kan 'n **universele navraag**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL-eindpunt huisves. Hierdie metode steun op GraphQL se `__typename` veld, wat die tipe van die ondervraagde objek onthul.
Om te kontroleer of 'n URL 'n GraphQL-diens is, kan 'n **universele navraag**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL-eindpunt huisves. Hierdie metode steun op GraphQL se `__typename`-veld, wat die tipe van die ondervraagde objek onthul.
```javascript
query{__typename}
```
@ -67,7 +67,7 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
```
{% endcode %}
Met hierdie navraag kan jy al die tipes, hul velde, en hul argumente (en die tipe van die argumente) onttrek. Dit sal baie nuttig wees om te weet hoe om die databasis te bevraagteken.
Met hierdie navraag kan jy al die tipes, hul velde, en hul argumente (en die tipe van die argumente) onttrek. Dit sal baie nuttig wees om te weet hoe om die databasis te ondervra.
![](<../../.gitbook/assets/image (950).png>)
@ -79,12 +79,10 @@ Dit is interessant om te weet of die **foute** as hulle **gewys** gaan word, aan
?query={}
?query={thisdefinitelydoesnotexist}
```
![](<../../.gitbook/assets/image (416).png>)
**Enumerate Databasis Skema deur Introspeksie**
**Enumereer Databasis Skema via Introspeksie**
{% hint style="info" %}
As introspeksie geaktiveer is, maar die bogenoemde navraag nie uitgevoer word nie, probeer om die `onOperation`, `onFragment`, en `onField` riglyne uit die navraagstruktuur te verwyder.
Indien introspeksie geaktiveer is maar die bogenoemde navraag nie uitgevoer word nie, probeer om die `onOperation`, `onFragment`, en `onField` riglyne uit die navraagstruktuur te verwyder.
{% endhint %}
```bash
#Full introspection query
@ -193,7 +191,7 @@ In die introspeksie kan jy vind **watter voorwerp jy direk kan navraag doen** (o
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-17-48.png>)
Let daarop dat die tipe van die navraag "_flags_" is "_Flags_", en hierdie voorwerp is gedefinieer as volg:
Let daarop dat die tipe van die navraag "_flags_" is "_Flags_", en hierdie voorwerp is as volg gedefinieer:
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-22-57 (1).png>)
@ -201,7 +199,7 @@ Jy kan sien dat die "_Flags_" voorwerpe saamgestel is uit **naam** en **waarde**
```javascript
query={flags{name, value}}
```
Merk op dat in die geval waar die **voorwerp om te ondervra** 'n **primitiewe** **tipe** is soos **string** soos in die volgende voorbeeld
Merk op dat in die geval waar die **voorwerp om te ondervra** 'n **primitiewe tipe** is soos **string** soos in die volgende voorbeeld
![](<../../.gitbook/assets/image (958).png>)
@ -210,7 +208,7 @@ Jy kan dit net ondervra met:
query={hiddenFlags}
```
In 'n ander voorbeeld waar daar 2 voorwerpe binne die "_Query_" tipe voorwerp was: "_user_" en "_users_".\
As hierdie voorwerpe nie enige argument nodig het om te soek nie, kon jy **alle inligting daaruit haal** deur net te **vra** vir die data wat jy wil hê. In hierdie voorbeeld van die Internet kon jy die gestoorde gebruikersname en wagwoorde onttrek:
As hierdie voorwerpe nie enige argument nodig het om te soek nie, kon jy **alle inligting van hulle kry** deur net te **vra** vir die data wat jy wil hê. In hierdie voorbeeld van die Internet kon jy die gestoorde gebruikersname en wagwoorde onttrek:
![](<../../.gitbook/assets/image (880).png>)
@ -221,22 +219,22 @@ Tog, in hierdie voorbeeld as jy probeer om dit te doen kry jy hierdie **fout**:
Dit lyk asof dit op een of ander manier sal soek deur die "_**uid**_" argument van tipe _**Int**_.\
Hoe dan ook, ons het reeds geweet dat, in die [Basiese Enumerasie](graphql.md#basic-enumeration) afdeling 'n navraag voorgestel was wat al die nodige inligting aan ons getoon het: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
As jy die beeld lees wat verskaf is toe ek daardie navraag hardloop, sal jy sien dat "_**user**_" die **arg** "_**uid**_" van tipe _Int_ gehad het.
As jy die verskafte beeld lees wanneer ek daardie navraag hardloop sal jy sien dat "_**user**_" die **arg** "_**uid**_" van tipe _Int_ gehad het.
Dus, deur 'n bietjie ligte _**uid**_ bruteforce uit te voer, het ek gevind dat in _**uid**=**1**_ 'n gebruikersnaam en 'n wagwoord opgehaal is:\
Dus, deur 'n bietjie ligte _**uid**_ bruteforce uit te voer, het ek gevind dat in _**uid**=**1**_ 'n gebruikersnaam en wagwoord opgehaal is:\
`query={user(uid:1){user,password}}`
![](<../../.gitbook/assets/image (90).png>)
Merk op dat ek **ontdek** het dat ek vir die **parameters** "_**user**_" en "_**password**_" kon vra omdat as ek probeer om vir iets te soek wat nie bestaan nie (`query={user(uid:1){noExists}}`) kry ek hierdie fout:
Let daarop dat ek **ontdek** het dat ek vir die **parameters** "_**user**_" en "_**password**_" kon vra omdat as ek probeer om vir iets te soek wat nie bestaan nie (`query={user(uid:1){noExists}}`) kry ek hierdie fout:
![](<../../.gitbook/assets/image (707).png>)
En gedurende die **enumerasie fase** het ek ontdek dat die "_**dbuser**_" voorwerp veld "_**user**_" en "_**password**_ gehad het.
En gedurende die **enumerasie fase** het ek ontdek dat die "_**dbuser**_" voorwerp as velde "_**user**_" en "_**password**_ gehad het.
**Navraag string dump truuk (dankie aan @BinaryShadow\_)**
As jy kan soek volgens 'n string tipe, soos: `query={theusers(description: ""){username,password}}` en jy **soek vir 'n leë string** sal dit **alle data dump**. (_Merk op hierdie voorbeeld is nie verwant aan die voorbeeld van die tutoriale nie, vir hierdie voorbeeld aanvaar dat jy kan soek deur "**theusers**" met 'n String veld genaamd "**description**"_).
As jy kan soek volgens 'n string tipe, soos: `query={theusers(description: ""){username,password}}` en jy **soek vir 'n leë string** sal dit **alle data dump**. (_Merk op dat hierdie voorbeeld nie verband hou met die voorbeeld van die tutoriale nie, vir hierdie voorbeeld aanvaar dat jy kan soek deur "**theusers**" met 'n String veld genaamd "**description**"_).
### Soek
@ -250,7 +248,7 @@ email
}
}
```
Jy kan **soek** persone **volgens** hul **naam** en hul **geabonneerde** **films** kry:
Jy kan persone **volgens** die **naam** soek en hul **geabonneerde** **films** kry:
```javascript
{
searchPerson(name: "John Doe") {
@ -351,18 +349,18 @@ releaseYear
```
### Direktief Overbelasting
Soos verduidelik in [**een van die kwesbaarhede beskryf in hierdie verslag**](https://www.landh.tech/blog/20240304-google-hack-50000/), impliseer 'n direktief oorbelasting om 'n direktief selfs miljoene kere te roep om die bediener te laat operasies mors totdat dit moontlik is om dit DoS.
Soos verduidelik in [**een van die kwetsbaarhede beskryf in hierdie verslag**](https://www.landh.tech/blog/20240304-google-hack-50000/), impliseer 'n direktief oorbelasting om 'n direktief selfs miljoene kere te roep om die bediener operasies te laat mors totdat dit moontlik is om dit DoS.
### Batching brute force in 1 API-aanvraag
### Groepering van brute force in 1 API-aanvraag
Hierdie inligting is geneem van [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Outentifisering deur middel van GraphQL API met **gelyktydig stuur van baie navrae met verskillende geloofsbriewe** om dit te toets. Dit is 'n klassieke brute force-aanval, maar nou is dit moontlik om meer as een login/wagwoordpaar per HTTP-aanvraag te stuur as gevolg van die GraphQL-batchingfunksie. Hierdie benadering sou eksterne koersmoniteringsprogramme laat dink dat alles reg is en dat daar geen brute force-bot is wat wagwoorde probeer raai nie.
Outentifisering deur middel van GraphQL API met **gelyktydige stuur van baie navrae met verskillende geloofsbriewe** om dit te toets. Dit is 'n klassieke brute force-aanval, maar nou is dit moontlik om meer as een login/wagwoordpaar per HTTP-aanvraag te stuur as gevolg van die GraphQL-groepeereienskap. Hierdie benadering sou eksterne koersmoniteringsprogramme laat dink dat alles reg is en dat daar geen brute force-bot is wat wagwoorde probeer raai nie.
Hieronder kan jy die eenvoudigste demonstrasie van 'n aansoekoutentiseringsversoek vind, met **3 verskillende e-pos/wagwoordpare op 'n slag**. Dit is vanselfsprekend moontlik om duisende in een enkele versoek op dieselfde manier te stuur:
Hieronder kan jy die eenvoudigste demonstrasie van 'n aansoekoutentiseringsaanvraag vind, met **3 verskillende e-pos/wagwoordpare op 'n slag**. Dit is vanselfsprekend moontlik om duisende in een enkele aanvraag op dieselfde manier te stuur:
![](<../../.gitbook/assets/image (1081).png>)
Soos ons kan sien van die respons-skermkiekie, het die eerste en die derde versoeke _null_ teruggegee en het die ooreenstemmende inligting in die _fout_ afdeling weerspieël. Die **tweede mutasie het die korrekte outentiserings**-data gehad en die respons het die korrekte outentiseringsessie-token gehad.
Soos ons kan sien van die antwoordskerm, het die eerste en derde aanvrae _null_ teruggegee en het die ooreenstemmende inligting in die _fout_ afdeling weerspieël. Die **tweede mutasie het die korrekte outentiserings**-data gehad en die antwoord het die korrekte outentiseringsessietoken.
![](<../../.gitbook/assets/image (119) (1).png>)
@ -370,9 +368,9 @@ Soos ons kan sien van die respons-skermkiekie, het die eerste en die derde verso
Meer en meer **graphql-eindpunte deaktiveer introspeksie**. Nietemin is die foute wat graphql gooi wanneer 'n onverwagte versoek ontvang word genoeg vir gereedskappe soos [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) om die meeste van die skema te herskep.
Verder, die Burp Suite-uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) uitbreiding **waarnemings GraphQL API-aanvrae wat deur Burp gaan** en **bou** 'n interne GraphQL **skema** met elke nuwe navraag wat dit sien. Dit kan ook die skema blootstel vir GraphiQL en Voyager. Die uitbreiding gee 'n valse respons wanneer dit 'n introspeksie-navraag ontvang. As gevolg hiervan toon GraphQuail alle navrae, argumente en velde wat beskikbaar is vir gebruik binne die API. Vir meer inligting [**kyk hierdie**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Verder, die Burp Suite-uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) **waarnemings GraphQL API-aanvrae wat deur Burp gaan** en **bou** 'n interne GraphQL **skema** met elke nuwe navraag wat dit sien. Dit kan ook die skema blootstel vir GraphiQL en Voyager. Die uitbreiding gee 'n valse antwoord wanneer dit 'n introspeksie-navraag ontvang. Gevolglik toon GraphQuail al die navrae, argumente, en velde wat beskikbaar is vir gebruik binne die API. Vir meer inligting [**kyk hierdie**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
'n Mooi **woordelys** om [**GraphQL-entiteite te ontdek kan hier gevind word**](https://github.com/Escape-Technologies/graphql-wordlist?).
'n Goeie **woordelys** om [**GraphQL-entiteite te ontdek kan hier gevind word**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Om GraphQL introspeksie-verdedigings te omseil <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
@ -386,9 +384,35 @@ Om beperkings op introspeksie-navrae in API's te omseil, bewys dit effektief om
```
Indien onsuksesvol, oorweeg alternatiewe versoekmetodes, soos **GET-versoeke** of **POST met `x-www-form-urlencoded`**, aangesien beperkings moontlik slegs op POST-versoeke van toepassing kan wees.
### Probeer WebSockets
Soos genoem in [**hierdie gesprek**](https://www.youtube.com/watch?v=tIo\_t5uUK50), kyk of dit moontlik is om met graphQL via WebSockets te verbind, aangesien dit jou kan toelaat om 'n potensiële WAF te omseil en die websocket kommunikasie kan lei tot die uitlek van die skema van die graphQL:
```javascript
ws = new WebSocket('wss://target/graphql', 'graphql-ws');
ws.onopen = function start(event) {
var GQL_CALL = {
extensions: {},
query: `
{
__schema {
_types {
name
}
}
}`
}
var graphqlMsg = {
type: 'GQL.START',
id: '1',
payload: GQL_CALL,
};
ws.send(JSON.stringify(graphqlMsg));
}
```
### **Ontdekking van Blootgestelde GraphQL-Strukture**
Wanneer introspeksie gedeaktiveer is, is dit 'n nuttige strategie om die bronkode van die webwerf te ondersoek vir voorafgelaai queries in JavaScript-biblioteke. Hierdie queries kan gevind word deur die `Bronne`-tabblad in die ontwikkelaarshulpmiddels te gebruik, wat insig kan gee in die API se skema en moontlik **blootgestelde sensitiewe queries** kan onthul. Die opdragte om binne die ontwikkelaarshulpmiddels te soek is:
Wanneer introspeksie gedeaktiveer is, is dit 'n nuttige strategie om die webwerf se bronkode te ondersoek vir voorafgelaai queries in JavaScript-biblioteke. Hierdie queries kan gevind word deur die `Bronne`-tabblad in die ontwikkelaarshulpmiddels te gebruik, wat insigte in die API se skema bied en moontlik **blootgestelde sensitiewe queries** blootstel. Die opdragte om binne die ontwikkelaarshulpmiddels te soek is:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
@ -402,9 +426,9 @@ As jy nie weet wat CSRF is nie, lees die volgende bladsy:
[csrf-cross-site-request-forgery.md](../../pentesting-web/csrf-cross-site-request-forgery.md)
{% endcontent-ref %}
Daar buite sal jy verskeie GraphQL eindpunte vind **gekonfigureer sonder CSRF-tokens.**
Daar buite sal jy verskeie GraphQL eindpunte vind **wat ingestel is sonder CSRF-tokens.**
Let daarop dat GraphQL-aanvrae gewoonlik gestuur word via POST-aanvrae met die Inhouds-Tipe **`application/json`**.
Let daarop dat GraphQL-versoeke gewoonlik gestuur word via POST-versoeke met die Inhouds-Tipe **`application/json`**.
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
@ -418,17 +442,27 @@ Let egter daarop dat die nuwe verstekkoekiewaarde van die `samesite`-vlag van Ch
Let daarop dat dit gewoonlik moontlik is om die navraagversoek ook as 'n GET-versoek te stuur en dat die CSRF-token moontlik nie in 'n GET-versoek gevalideer word nie.
Deur 'n [XS-Soek](../../pentesting-web/xs-search/) aanval te misbruik, kan dit moontlik wees om inhoud van die GraphQL-eindpunt te eksfiltreer deur die gebruikers se geloofsbriewe te misbruik.
Deur ook 'n [XS-Soek](../../pentesting-web/xs-search/) aanval te misbruik, kan dit moontlik wees om inhoud van die GraphQL-eindpunt te eksfiltreer deur die gebruikers se geloofsbriewe te misbruik.
Vir meer inligting, sien die [oorspronklike plasing hier](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
## Kruis-webwerf WebSocket-kaping in GraphQL
Soortgelyk aan CRSF-gebreke wat graphQL misbruik, is dit ook moontlik om 'n Kruis-webwerf WebSocket-kaping uit te voer om 'n verifikasie met GraphQL met onbeskermde koekies te misbruik en 'n gebruiker onverwagte aksies in GraphQL te laat uitvoer.
Vir meer inligting, sien:
{% content-ref url="../../pentesting-web/websocket-attacks.md" %}
[websocket-attacks.md](../../pentesting-web/websocket-attacks.md)
{% endcontent-ref %}
## Magtiging in GraphQL
Baie GraphQL-funksies wat op die eindpunt gedefinieer is, mag slegs die outentisering van die versoeker nagaan, maar nie magtiging nie.
Baie GraphQL-funksies wat op die eindpunt gedefinieer is, mag slegs die verifikasie van die versoeker nagaan, maar nie magtiging nie.
Die wysiging van navraaginvoer veranderlikes kan lei tot die uitlek van sensitiewe rekeningbesonderhede.
Mutasi kan selfs lei tot rekeningoornames deur te probeer om ander rekeningdata te wysig.
Mutasiemag selfs lei tot rekening-oorneemingspogings om ander rekeningdata te wysig.
```javascript
{
"operationName":"updateProfile",
@ -438,21 +472,21 @@ Mutasi kan selfs lei tot rekeningoornames deur te probeer om ander rekeningdata
```
### Omgang met outorisasie in GraphQL
[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) saam kan 'n swak outentifikasie stelsel omseil.
[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) saam kan 'n swak outentiseringsisteem omseil.
In die onderstaande voorbeeld kan jy sien dat die operasie "forgotPassword" is en dat dit slegs die forgotPassword query wat daarmee verband hou, moet uitvoer. Dit kan omseil word deur 'n query aan die einde by te voeg, in hierdie geval voeg ons "register" by en 'n gebruiker veranderlike vir die stelsel om as 'n nuwe gebruiker te registreer.
In die onderstaande voorbeeld kan jy sien dat die operasie "forgotPassword" is en dat dit slegs die forgotPassword-navraag wat daarmee verband hou, moet uitvoer. Dit kan omseil word deur 'n navraag aan die einde by te voeg, in hierdie geval voeg ons "register" by en 'n gebruiker veranderlike vir die stelsel om as 'n nuwe gebruiker te registreer.
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Omgang met Tariefgrense deur Aliasse in GraphQL te gebruik
In GraphQL is aliase 'n kragtige kenmerk wat die **naamgewing van eienskappe eksplisiet** toelaat wanneer 'n API versoek gedoen word. Hierdie vermoë is veral nuttig vir die herwinning van **meervoudige gevalle van dieselfde tipe** van voorwerp binne 'n enkele versoek. Aliase kan gebruik word om die beperking te oorkom wat voorkom dat GraphQL voorwerpe meervoudige eienskappe met dieselfde naam het.
In GraphQL is aliase 'n kragtige kenmerk wat die **naamgewing van eienskappe eksplisiet** toelaat wanneer 'n API-aanvraag gedoen word. Hierdie vermoë is veral nuttig vir die herwinning van **meervoudige gevalle van dieselfde tipe** van voorwerp binne 'n enkele aanvraag. Aliase kan gebruik word om die beperking te oorkom wat voorkom dat GraphQL-voorwerpe meervoudige eienskappe met dieselfde naam het.
Vir 'n gedetailleerde begrip van GraphQL aliase, word die volgende bron aanbeveel: [Aliase](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Vir 'n gedetailleerde begrip van GraphQL aliase word die volgende bron aanbeveel: [Aliase](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Terwyl die primêre doel van aliase is om die noodsaaklikheid vir talle API-oproepe te verminder, is 'n onbedoelde geval geïdentifiseer waar aliase gebruik kan word om brute force aanvalle op 'n GraphQL eindpunt uit te voer. Dit is moontlik omdat sommige eindpunte beskerm word deur tariefgrense wat ontwerp is om brute force aanvalle te stuit deur die **aantal HTTP-versoeke** te beperk. Hierdie tariefgrense mag egter nie rekening hou met die aantal operasies binne elke versoek nie. Gegewe dat aliase toelaat vir die insluiting van meervoudige navrae in 'n enkele HTTP-versoek, kan hulle sulke tariefgrense maatreëls omseil.
Terwyl die primêre doel van aliase is om die noodsaaklikheid vir talle API-oproepe te verminder, is 'n onbedoelde geval geïdentifiseer waar aliase gebruik kan word om brute force aanvalle op 'n GraphQL-eindpunt uit te voer. Dit is moontlik omdat sommige eindpunte beskerm word deur tariefgrense wat ontwerp is om brute force aanvalle te stuit deur die **aantal HTTP-aanvrae** te beperk. Hierdie tariefgrense mag egter nie rekening hou met die aantal operasies binne elke aanvraag nie. Aangesien aliase toelaat dat meervoudige navrae in 'n enkele HTTP-aanvraag ingesluit word, kan hulle sulke tariefgrensmaatreëls omseil.
Oorweeg die onderstaande voorbeeld, wat illustreer hoe gealiaseerde navrae gebruik kan word om die geldigheid van winkel afslagkodes te verifieer. Hierdie metode kan tariefgrense omseil aangesien dit verskeie navrae in een HTTP-versoek saamstel, wat moontlik die verifikasie van verskeie afslagkodes gelyktydig kan toelaat.
Oorweeg die onderstaande voorbeeld, wat illustreer hoe gealiaseerde navrae gebruik kan word om die geldigheid van winkelafslagkodes te verifieer. Hierdie metode kan tariefgrense omseil aangesien dit verskeie navrae in een HTTP-aanvraag saamstel, wat moontlik die verifikasie van verskeie afslagkodes gelyktydig kan toelaat.
```bash
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
@ -469,7 +503,7 @@ valid
```
## Gereedskap
### Kwesbaarheidsskandeerders
### Kwesbaarheidsskanners
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Toets algemene wanopstellings van graphql-eindpunte
* [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): GraphQL-sekuriteitsouditeringsskrip met 'n fokus op die uitvoer van groep GraphQL-navrae en mutasies.
@ -477,8 +511,10 @@ valid
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Toolkit wat gebruik kan word om skemas te gryp en te soek na sensitiewe data, toets outorisasie, bruto krag skemas, en paaie na 'n gegewe tipe te vind.
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Kan as selfstandige of [Burp-uitbreiding](https://github.com/doyensec/inql) gebruik word.
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Kan ook as 'n CLI-klient gebruik word om aanvalle outomaties te maak
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Gereedskap wat die verskillende maniere lys om 'n gegewe tipe in 'n GraphQL-skema te bereik.
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp-uitbreiding vir gevorderde GraphQL-toetsing. Die _**Scanner**_ is die kern van InQL v5.0, waar jy 'n GraphQL-eindpunt of 'n plaaslike introspeksie-skemabestand kan analiseer. Dit genereer outomaties alle moontlike navrae en mutasies, organiseer hulle in 'n gestruktureerde aansig vir jou analise. Die _**Aanvaller**_ komponent laat jou groep GraphQL-aanvalle uitvoer, wat nuttig kan wees om swak geïmplementeerde tempo-limiete te omseil.
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Gereedskap wat die verskillende maniere lys om 'n gegewe tipe in 'n GraphQL-skema te **bereik**.
* [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Die Opvolger van Selfstandige en CLI-modusse van InQL
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp-uitbreiding vir gevorderde GraphQL-toetsing. Die _**Skandeerder**_ is die kern van InQL v5.0, waar jy 'n GraphQL-eindpunt of 'n plaaslike introspeksieskemabestand kan analiseer. Dit genereer outomaties alle moontlike navrae en mutasies, organiseer hulle in 'n gestruktureerde aansig vir jou analise. Die _**Aanvaller**_ komponent laat jou groep GraphQL-aanvalle uitvoer, wat nuttig kan wees om swak geïmplementeerde tempo-limiete te omseil.
* [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Probeer om die skema selfs met introspeksie gedeaktiveer te kry deur die hulp van sommige Graphql-databasisse wat die name van mutasies en parameters sal voorstel.
### Kliënte