Около 2 некоторых из наших веб-сайтов были взломаны. Мы часами пытались понять, что пошло не так. Лазейка была str_replace
против \0
[Null Char] .
При использовании str_replace
с Single Quotes [']
,
Что-то вроде:
$str = 'java\0scr\0ip\0t:alert(\"XSS\")';
$clean_null_chars = str_replace('\\0','_[_blabla_]_',$str);
//Show the cleaned version
var_dump($clean_null_chars); // string 'java_[_blabla_]_scr_[_blabla_]_ip_[_blabla_]_t:alert(\"XSS\")' (length=62);
echo $clean_null_chars; //java_[_blabla_]_scr_[_blabla_]_ip_[_blabla_]_t:alert(\"XSS\")
Однако, используя str_replace
с Double Quotes ["]
, Ничего не произошло
Что-то вроде:
$str= "java\0scr\0ip\0t:alert(\"XSS\")";
$clean_null_chars = str_replace('\\0','_[_blabla_]_',$str);
//Show the cleaned version
var_dump($clean_null_chars); //string 'java�scr�ip�t:alert("XSS")' (length=26);
// ....[Notice the _Null Char_ rendered as question marks in var_dump]
echo $clean_null_chars;// javascript:alert("XSS")
Таким образом, некоторый гений сумел злоупотребить лазейкой.
Это нормальное поведение для str_replace
когда либо Single Quotes
или же Double Quotes
вовлечены?
Вот http://php.net/manual/en/function.str-replace.php они используют оба [']
а также ["]
нет упоминаний о различных видах поведения.
Есть идеи??
Задача ещё не решена.
Других решений пока нет …