<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
* 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)**.**
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.
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.
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/)
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.
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.
Graphql kawaida inasaidia **GET**, **POST** (x-www-form-urlencoded) na **POST**(json). Ingawa kwa usalama inapendekezwa kuruhusu tu json ili kuzuia mashambulizi ya CSRF.
Ikiwa uchunguzi umewezeshwa lakini swali lililopita halifanyi kazi, jaribu kuondoa maelekezo ya `onOperation`, `onFragment`, na `onField` kutoka kwa muundo wa swali.
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.
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:
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}}}}}}}`
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:
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**"_).
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.
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):
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.
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.
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.
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:
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.
**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.
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).
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:
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.
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:
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.
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.
Tambua kuwa mara nyingi inawezekana kutuma **ombi** la **kuuliza** pia kama **ombi la GET na kitambulisho cha CSRF huenda kisithibitishwe katika ombi la GET.**
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.
[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.
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.
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.
* [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.
* [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.
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* 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.