Ottenere attacchi con null byte injection per funzionare con PHP 5.2.17

1

Sto cercando di capire come gli attacchi di null byte injection nel codice PHP abbiano funzionato prima che venissero rattoppati in PHP 5.3.4. Ho questa pagina HTML di esempio che è una versione leggermente modificata di ciò che è mostrato qui :

<?php
var_dump($_GET);
echo '<br>';
$file = $_GET['file'];
$path = '/var/www/' . $file . '.php';
echo $path;
if (file_exists($path)) {
    echo "file exists!";
    include $path;
}
?>

Questo codice è in esecuzione su un sistema Ubuntu 12.04 con PHP 5.2.17. Mi aspetterei un URL come http://localhost/?file=../../../etc/passwd%00 per funzionare, ma invece vedo %code% stampato letteralmente nella stringa:

array(1) { ["file"]=> string(21) "../../../etc/passwd
<?php
var_dump($_GET);
echo '<br>';
$file = $_GET['file'];
$path = '/var/www/' . $file . '.php';
echo $path;
if (file_exists($path)) {
    echo "file exists!";
    include $path;
}
?>
" } /var/www/../../../etc/passwd
array(1) { ["file"]=> string(21) "../../../etc/passwd%pre%" }
/var/www/../../../etc/passwd%pre%.php
.php

Che cosa sto sbagliando? In che modo posso ottenere attacchi con null byte injection sul mio computer locale?

    
posta gsingh2011 29.08.2014 - 18:20
fonte

1 risposta

1

L'output dell'eco con /var/www/../../../etc/passwd/var/www/../../../etc/passwd.php inclusa dovrebbe accadere, niente di cui preoccuparsi. Per capire l'attacco, devi sapere come C e PHP memorizzano le stringhe.

C

In C, una stringa è semplicemente un puntatore a un indirizzo di memoria in cui il puntatore punta all'inizio della stringa e il carattere %code% indica la fine. Non viene memorizzata alcuna lunghezza, tutto il codice che legge le stringhe viene letto finché non viene raggiunto il carattere %code% . Una stringa C può essere lunga quanto vuole.

PHP

In PHP, una stringa consiste di due parti: un intero e un array. Il numero intero indica la lunghezza della stringa e della matrice, la matrice contiene la stringa stessa. Tutto il codice di gestione delle stringhe in PHP legge quello intero e sa per quanto tempo è la stringa. Ignora il carattere %code% . Il numero intero ha un limite superiore, e lo stesso vale per la lunghezza della stringa .

L'attacco

L'attacco si basa su questa diversa gestione delle stringhe. Quindi, dato che puoi includere un carattere %code% nella stringa PHP, la stampa della stringa includerà il carattere %code% . Quindi il tuo output sarà %code% . La magia accade nel momento in cui PHP dà quella stringa a C: C interpreta il carattere %code% come terminazione stringa e pensa di aver ottenuto %code% . E questo file esiste naturalmente.

La correzione

Dalle note sulla versione :

Paths with NULL in them (foo%bl0ck_qu0te%bar.txt) are now considered as invalid. (Rasmus)

La correzione consiste principalmente nell'aggiungere clausole if, confrontando la lunghezza della stringa con il metodo c ( a sinistra) e il metodo php (a destra):

if (strlen(Z_STRVAL_PP(file)) != Z_STRLEN_PP(file)) {
    RETURN_FALSE;
}
    
risposta data 29.08.2014 - 19:28
fonte

Leggi altre domande sui tag