2016-07-27 5 views
6

Als Webmaster muss ich gefährdete Skripte identifizieren.

Ich schreibe immer PHP-Code, der Benutzereingaben filtern. Ich traue niemals Benutzereingaben zu, wähle welche Zeichen gültig sind (im Gegensatz zu einigen), benutze php native Filterfunktion (filter_input) oder benutze lib/frameworks Dienstprogramme.

Heute wurde ich für Sicherheitslücken in heruntergeladenen Module Suche und diesen Code gefunden:

if (isset($_GET['css_file_name'])) {   
    $cssFileName = _PS_MODULE_DIR_ . DS . "xxxx" . DS . "css" . DS . $_GET['css_file_name'] . ".css"; 
    echo file_get_contents($cssFileName); 
} 
echo ""; 

Ich denke, das ist unsicher, es die Grundregel nicht Nie Eingabe Vertrauen Benutzer respektieren. Also habe ich beschlossen, es zu beweisen, ich habe versucht, DEL ASCII-Zeichen hinzuzufügen, um die .css zu entfernen und in der Lage sein, jede Datei (eine PHP-Datei mit Anmeldeinformationen zum Beispiel) zu finden, aber ich war nicht erfolgreich.

Also meine Frage ist: Ist dieser Code wirklich so unsicher? Ist es möglich, eine PHP-Datei mit ihm zu greifen (können Sie es beweisen?)

+0

Wenn wir nicht mit einem Exploit kommen können, ist es dann sicher? Ihre Frage ist interessant, aber Sicherheit ist mehr eine Art zu denken, und Sie selbst sind im Zweifel, ob das sicher ist oder nicht. Dies ist ein deutliches Zeichen, dass eine Whitelist in diesem Fall angebracht wäre, da es schwer ist, zu beweisen, dass es sicher ist. – martinstoeckli

Antwort

1

Mögliche Angriff: Die Null-Byte-Vergiftung der Funktion file_get_contents offenbaren kann, oder sind die Inhalte von falschen Dateien:

$ ls 
file.php nullbyte.php 
$ cat file.php 
I am the contents. 
$ cat nullbyte.php 
<?php 
$input = "file.php\0.jpg"; 
echo file_get_contents($input); 
echo "\n"; 
?> 
$ php nullbyte.php 
I am the contents. 

Diese Informationen sind nur für ältere (nicht unterstützte) Versionen von PHP relevant.

Null-Byte-Poisoning wurde in PHP 5.3.4 behoben (wobei es sich um eine alte und nicht unterstützte PHP-Version handelt): https://bugs.php.net/bug.php?id=39863.

Mögliche Lösung für ältere PHP-Versionen:

<?php 
    $clean = str_replace(chr(0), '', $input); 
?> 

jedoch der Angreifer in der Lage ist, alle möglichen CSS-Dateien des gesamten Dateisystems in Ihrem Beispiel aufzuzählen, ist es möglich, aus dem Web-Root zu brechen.

Verwandte Themen