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

This commit is contained in:
Translator 2025-01-22 23:13:03 +00:00
parent 79c6dd2be6
commit 8a0d3fdf4f

View File

@ -23,15 +23,15 @@ Om blootgestelde GraphQL voorbeelde te identifiseer, word die insluiting van spe
- `/graphql/api`
- `/graphql/graphql`
Die identifisering van oop GraphQL voorbeelde stel in staat om die ondersteunende vrae te ondersoek. Dit is van kardinale belang om die data wat deur die eindpunt beskikbaar is, te verstaan. GraphQL se introspeksiestelsel fasiliteer dit deur die vrae wat 'n skema ondersteun, te detailleer. Vir meer inligting hieroor, verwys na die GraphQL dokumentasie oor introspeksie: [**GraphQL: 'n vrae-taal vir API's.**](https://graphql.org/learn/introspection/)
Die identifisering van oop GraphQL voorbeelde stel in staat om die ondersteunende vrae te ondersoek. Dit is van kardinale belang om die data wat deur die eindpunt beskikbaar is, te verstaan. GraphQL se introspeksiestelsel fasiliteer dit deur die vrae wat 'n skema ondersteun, in detail te beskryf. Vir meer inligting hieroor, verwys na die GraphQL dokumentasie oor introspeksie: [**GraphQL: 'n vrae-taal vir API's.**](https://graphql.org/learn/introspection/)
### Vingerafdruk
Die hulpmiddel [**graphw00f**](https://github.com/dolevf/graphw00f) is in staat om te detecteer watter GraphQL enjin op 'n bediener gebruik word en druk dan nuttige inligting vir die sekuriteitsauditor.
Die hulpmiddel [**graphw00f**](https://github.com/dolevf/graphw00f) is in staat om te detecteer watter GraphQL enjin in 'n bediener gebruik word en druk dan nuttige inligting vir die sekuriteitsauditor.
#### Universele vrae <a href="#universal-queries" id="universal-queries"></a>
Om te kontroleer of 'n URL 'n GraphQL diens is, kan 'n **universele vraag**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL eindpunt huisves. Hierdie metode staatmaak op GraphQL se `__typename` veld, wat die tipe van die gevraagde objek onthul.
Om te kontroleer of 'n URL 'n GraphQL diens is, kan 'n **universele vraag**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL eindpunt huisves. Hierdie metode berus op GraphQL se `__typename` veld, wat die tipe van die gevraagde objek onthul.
```javascript
query{__typename}
```
@ -170,7 +170,7 @@ As introspeksie geaktiveer is, kan jy [**GraphQL Voyager**](https://github.com/A
### Navraag
Nou dat ons weet watter soort inligting in die databasis gestoor is, kom ons probeer om **sommige waardes te onttrek**.
Nou dat ons weet watter soort inligting in die databasis gestoor is, kom ons probeer om **'n paar waardes te onttrek**.
In die introspeksie kan jy vind **watter objek jy direk kan navraag doen** (want jy kan nie 'n objek navraag doen net omdat dit bestaan nie). In die volgende beeld kan jy sien dat die "_queryType_" "_Query_" genoem word en dat een van die velde van die "_Query_" objek "_flags_" is, wat ook 'n tipe objek is. Daarom kan jy die vlag objek navraag doen.
@ -217,7 +217,7 @@ Let daarop dat ek **ontdek** het dat ek kon vra vir die **parameters** "_**user*
En tydens die **enumeration fase** het ek ontdek dat die "_**dbuser**_" voorwerp as velde "_**user**_" en "_**password**_" gehad het.
**Query string dump trick (dank aan @BinaryShadow\_)**
**Query string dump trick (dankie aan @BinaryShadow\_)**
As jy kan soek op 'n string tipe, soos: `query={theusers(description: ""){username,password}}` en jy **soek vir 'n leë string** sal dit **al die data dump**. (_Let op dat hierdie voorbeeld nie verband hou met die voorbeeld van die tutorials nie, vir hierdie voorbeeld neem aan jy kan soek met "**theusers**" deur 'n String veld genaamd "**description**"_).
@ -250,7 +250,7 @@ name
```
Let op hoe dit aangedui word om die `name` van die `subscribedMovies` van die persoon te verkry.
Jy kan ook **verskeie voorwerpe terselfdertyd soek**. In hierdie geval word daar 'n soektog na 2 flieks gedoen:
Jy kan ook **verskeie voorwerpe terselfdertyd soek**. In hierdie geval word daar 2 flieks gesoek:
```javascript
{
searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) {
@ -289,9 +289,9 @@ In die **introspeksie** kan jy die **verklaarde** **mutasies** vind. In die volg
![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>)
In hierdie opstelling bevat 'n **databasis** **persone** en **flieks**. **Persone** word geïdentifiseer deur hul **e-pos** en **naam**; **flieks** deur hul **naam** en **gradering**. **Persone** kan vriende met mekaar wees en het ook flieks, wat verhoudings binne die databasis aandui.
In hierdie opstelling bevat 'n **databasis** **persone** en **flieks**. **Persone** word geïdentifiseer deur hul **e-pos** en **naam**; **flieks** deur hul **naam** en **gradering**. **Persone** kan vriende met mekaar wees en ook flieks, wat verhoudings binne die databasis aandui.
'n mutasie om **nuwe** flieks binne die databasis te **skep** kan soos die volgende een wees (in hierdie voorbeeld word die mutasie `addMovie` genoem):
'n mutasie om **nuwe** flieks binne die databasis te skep kan soos die volgende een wees (in hierdie voorbeeld word die mutasie `addMovie` genoem):
```javascript
mutation {
addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) {
@ -334,26 +334,26 @@ releaseYear
```
### Direkte Oorbelasting
Soos verduidelik in [**een van die kwesbaarhede beskryf in hierdie verslag**](https://www.landh.tech/blog/20240304-google-hack-50000/), impliseer 'n direkte oorbelasting om 'n direkte oproep selfs miljoene kere te maak om die bediener te laat mors met operasies totdat dit moontlik is om 'n DoS aan te dui.
Soos verduidelik in [**een van die kwesbaarhede beskryf in hierdie verslag**](https://www.landh.tech/blog/20240304-google-hack-50000/), impliseer 'n direkte oorbelasting om 'n direkte oproep selfs miljoene kere te maak om die bediener te dwing om operasies te mors totdat dit moontlik is om dit te DoS.
### Groepering brute-force in 1 API versoek
Hierdie inligting is geneem van [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Autentisering deur middel van GraphQL API met **gelyktydig baie navrae met verskillende akrediteerbesonderhede** te stuur om dit te toets. Dit is 'n klassieke brute force aanval, maar nou is dit moontlik om meer as een aanmeld/wagwoord paar per HTTP versoek te stuur as gevolg van die GraphQL groepering kenmerk. Hierdie benadering sou eksterne koersmonitering toepassings mislei om te dink alles is reg en daar is geen brute-forcing bot wat probeer om wagwoorde te raai nie.
Autentisering deur middel van GraphQL API met **gelyktydig baie navrae met verskillende akrediteerbes** om dit te toets. Dit is 'n klassieke brute force aanval, maar nou is dit moontlik om meer as een aanmeld/wagwoord paar per HTTP versoek te stuur as gevolg van die GraphQL groepering kenmerk. Hierdie benadering sou eksterne tariewe monitering toepassings mislei om te dink alles is reg en daar is geen brute-forcing bot wat probeer om wagwoorde te raai nie.
Hieronder kan jy die eenvoudigste demonstrasie van 'n toepassingsautentisering versoek vind, met **3 verskillende e-pos/wagwoord pare op 'n slag**. Dit is duidelik moontlik om duisende in 'n enkele versoek op dieselfde manier te stuur:
Hieronder kan jy die eenvoudigste demonstrasie van 'n toepassingsautentisering versoek vind, met **3 verskillende e-pos/wagwoorde pare op 'n slag**. Dit is duidelik moontlik om duisende in 'n enkele versoek op dieselfde manier te stuur:
![](<../../images/image (1081).png>)
Soos ons kan sien uit die respons skermskoot, het die eerste en derde versoeke _null_ teruggestuur en die ooreenstemmende inligting in die _error_ afdeling weerspieël. Die **tweede mutasie het die korrekte autentisering** data gehad en die respons het die korrekte autentisering sessie token.
Soos ons kan sien uit die respons skermskoot, het die eerste en derde versoeke _null_ teruggegee en die ooreenstemmende inligting in die _error_ afdeling weerspieël. Die **tweede mutasie het die korrekte autentisering** data gehad en die respons het die korrekte autentisering sessie token.
![](<../../images/image (119) (1).png>)
## GraphQL Sonder Introspeksie
Al hoe meer **graphql eindpunte deaktiveer introspeksie**. Tog is die foute wat graphql gooi wanneer 'n onverwagte versoek ontvang word, genoeg vir gereedskap soos [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) om die meeste van die skema te herop te bou.
Al hoe meer **graphql eindpunte deaktiveer introspeksie**. Tog is die foute wat graphql gooi wanneer 'n onverwagte versoek ontvang word, genoeg vir gereedskap soos [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) om die meeste van die skema te hercreëer.
Boonop observeer die Burp Suite uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) **GraphQL API versoeke 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 keer 'n valse respons terug wanneer dit 'n introspeksie navraag ontvang. As gevolg hiervan, wys GraphQuail al die navrae, argumente, en velde beskikbaar vir gebruik binne die API. Vir meer inligting [**kyk hier**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Boonop observeer die Burp Suite uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) **GraphQL API versoeke wat deur Burp gaan** en **bou** 'n interne GraphQL **skema** met elke nuwe navraag wat dit sien. Dit kan ook die skema vir GraphiQL en Voyager blootstel. Die uitbreiding gee 'n vals respons wanneer dit 'n introspeksie navraag ontvang. As gevolg hiervan, wys GraphQuail al die navrae, argumente, en velde beskikbaar vir gebruik binne die API. Vir meer inligting [**kyk hier**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
'n Goeie **woordlys** om [**GraphQL entiteite te ontdek kan hier gevind word**](https://github.com/Escape-Technologies/graphql-wordlist?).
@ -433,7 +433,7 @@ Vir meer inligting **kyk die** [**oorspronklike pos hier**](https://blog.doyense
## Cross-site WebSocket kaping in GraphQL
Soos CRSF kwesbaarhede wat GraphQL misbruik, is dit ook moontlik om 'n **Cross-site WebSocket kaping uit te voer om 'n outentisering met GraphQL te misbruik met onbeskermde koekies** en 'n gebruiker te laat optree op 'n onverwagte manier in GraphQL.
Soos CRSF kwesbaarhede wat GraphQL misbruik, is dit ook moontlik om 'n **Cross-site WebSocket kaping uit te voer om 'n outentisering met GraphQL te misbruik met onbeveiligde koekies** en 'n gebruiker te laat optree op 'n onverwagte manier in GraphQL.
Vir meer inligting kyk:
@ -501,7 +501,7 @@ Om dit te verminder, implementeer alias telling beperkings, navraag kompleksitei
### **Array-gebaseerde Navraag Groepering**
**Array-gebaseerde Navraag Groepering** is 'n kwesbaarheid waar 'n GraphQL API die groepering van verskeie navrae in 'n enkele versoek toelaat, wat 'n aanvaller in staat stel om 'n groot aantal navrae gelyktydig te stuur. Dit kan die agterkant oorweldig deur al die gegroepeerde navrae gelyktydig uit te voer, wat oormatige hulpbronne (CPU, geheue, databasisverbindinge) verbruik en potensieel kan lei tot 'n **Denial of Service (DoS)**. As daar geen limiet op die aantal navrae in 'n groep is nie, kan 'n aanvaller dit benut om diens beskikbaarheid te verlaag.
**Array-gebaseerde Navraag Groepering** is 'n kwesbaarheid waar 'n GraphQL API die groepering van verskeie navrae in 'n enkele versoek toelaat, wat 'n aanvaller in staat stel om 'n groot aantal navrae gelyktydig te stuur. Dit kan die agtergrond oorweldig deur al die gegroepeerde navrae gelyktydig uit te voer, wat oormatige hulpbronne (CPU, geheue, databasisverbindinge) verbruik en potensieel kan lei tot 'n **Denial of Service (DoS)**. As daar geen limiet op die aantal navrae in 'n groep is nie, kan 'n aanvaller dit benut om diens beskikbaarheid te verlaag.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -509,7 +509,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
'https://example.com/graphql'
```
In hierdie voorbeeld word 10 verskillende navrae in een versoek gebundel, wat die bediener dwing om al hulle gelyktydig uit te voer. As dit met 'n groter bundelgrootte of rekenaarintensiewe navrae uitgebuit word, kan dit die bediener oorlaai.
In hierdie voorbeeld word 10 verskillende navrae in een versoek saamgegroepeer, wat die bediener dwing om al hulle gelyktydig uit te voer. As dit met 'n groter groepgrootte of rekenaarintensiewe navrae uitgebuit word, kan dit die bediener oorlaai.
### **Direktiewe Oorlaai Kwetsbaarheid**
@ -539,7 +539,7 @@ En dan **gebruik sommige van die persoonlike** eenhede.
### **Veld Duplikasie Kwetsbaarheid**
**Veld Duplikasie** is 'n kwesbaarheid waar 'n GraphQL-bediener navrae toelaat met dieselfde veld wat oormatig herhaal word. Dit dwing die bediener om die veld oorbodig op te los vir elke instansie, wat beduidende hulpbronne (CPU, geheue, en databasisoproepe) verbruik. 'n Aanvaller kan navrae saamstel met honderde of duisende herhaalde velde, wat 'n hoë las veroorsaak en moontlik kan lei tot 'n **Denial of Service (DoS)**.
**Veld Duplikasie** is 'n kwesbaarheid waar 'n GraphQL-bediener navrae toelaat met dieselfde veld wat oormatig herhaal word. Dit dwing die bediener om die veld oorbodig op te los vir elke instansie, wat beduidende hulpbronne (CPU, geheue en databasisoproepe) verbruik. 'n Aanvaller kan navrae saamstel met honderde of duisende herhaalde velde, wat 'n hoë las veroorsaak en moontlik kan lei tot 'n **Denial of Service (DoS)**.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \