%00
è la versione con codifica URL di un carattere null byte. In alcune applicazioni è possibile iniettare un byte null per terminare prematuramente una stringa. Un utente malintenzionato può trarne vantaggio per tagliare la fine di una stringa che non è possibile controllare.
Ecco lo pseudocodice per come può apparire il codice interessato:
print(readfile("./" + $name + ".txt"))
In questo esempio, qualsiasi valore fornito dall'utente per $name
verrebbe automaticamente aggiunto con un'estensione .txt
, impedendoti di scegliere nomi di file arbitrari. Per poter continuare a fornire il tuo percorso, puoi utilizzare il 0x00
byte per terminare la stringa immediatamente dopo il payload.
Quindi, questi percorsi sarebbero trattati allo stesso modo dal sistema interessato:
./../../../../../../../../windows/PFRO.log
./../../../../../../../../windows/PFRO.log%00.txt
I difetti di iniezione di byte nulli sono comuni perché molti linguaggi di livello superiore sono basati su C, dove viene utilizzato un byte null per indicare la fine di una stringa. Ad esempio, ecco un esempio di uno script PHP vulnerabile, preso dai documenti PHP :
<?php
$file = $_GET['file']; // "../../etc/passwdprint(readfile("./" + $name + ".txt"))
"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists will return true as the file /home/wwwrun/../../etc/passwd exists
include '/home/wwwrun/'.$file.'.php';
// the file /etc/passwd will be included
}
?>
Vedi anche: Embedding Null Code su OWASP.