Вчера наш портал, написанный на языке Kohana, подвергся успешной атаке.
Идея о том, что виноваты уважаемые рамки, в которых безопасность играет далеко не последнюю роль, поначалу даже не обсуждалась.
Программе, сканировавшей наш сайт, потребовалось около 95 тысяч запросов и 5 часов времени, чтобы найти эту уязвимость.
Взгляните внимательно на эти две функции из ядра Kohana версии 3.2:
public function redirect($url = '', $code = 302) { $referrer = $this->uri(); $protocol = ($this->secure()) ? 'https' : TRUE; if (strpos($referrer, '://') === FALSE) { $referrer = URL::site($referrer, $protocol, ! empty(Kohana::$index_file)); } if (strpos($url, '://') === FALSE) { // Make the URI into a URL $url = URL::site($url, TRUE, ! empty(Kohana::$index_file)); } if (($response = $this->response()) === NULL) { $response = $this->create_response(); } echo $response->status($code) ->headers('Location', $url) ->headers('Referer', $referrer) ->send_headers() ->body(); // Stop execution exit; }
public static function site($uri = '', $protocol = NULL, $index = TRUE)
{
// Chop off possible scheme, host, port, user and pass parts
$path = preg_replace('~^[-a-z0-9+.
]++://[^/]++/?~', '', trim($uri, '/'));
if ( ! UTF8::is_ascii($path))
{
// Encode all non-ASCII characters, as per RFC 1738
$path = preg_replace('~([^/]+)~e', 'rawurlencode("$1")', $path);
}
// Concat the URL
return URL::base($protocol, $index).
$path;
}
Как видите, при использовании функции перенаправления запроса функция URL::site применяется к текущему uri, который использует preg_replace с модификатором выполнения «e»: rawurlencode применяется к каждому сегменту URL, и сегмент передается в двойных кавычках, что позволяет передать туда что-то вроде (${@phpinfo()}), и это сработает. Таким образом, если у нас есть ссылка http://site/path/param1 выполняется перенаправление, затем, добавив выражение типа (${@phpinfo()} в параметр1), вы можете выполнить некоторый код. Главное, чтобы параметр1 содержал еще и не-ascii символы, например русские буквы .
В нашем случае после того, как уязвимость была найдена ботом, задачу взял на себя человек, и через некоторое время с помощью несложных манипуляций он смог залить оболочку через эту дыру.
Этот момент также оказал неоценимую помощь в этом отношении.
Обработчик исключений Коханова имеет следующий фрагмент:
public static function handler(Exception $e)
{
// .
// if (Request::$current !== NULL AND Request::current()->is_ajax() === TRUE) { // Just display the text of the exception echo "\n{$error}\n"; exit(1); } // .
//
}
Имеет ли запрос заголовок X-Requested-With, равный XMLHttpRequest? Сохраните сообщение об ошибке! От трекера Kohana уже отписались.
Теги: #Kohana безопасность безопасность #информационная безопасность #разработка сайтов #kohana
-
Zenity + Wget = Графический Интерфейс Wget
19 Oct, 24 -
Streetview В 2000 Году
19 Oct, 24 -
Образовательный Английский
19 Oct, 24 -
Подстыки №18
19 Oct, 24 -
Видеорепортажи С Golang Москва
19 Oct, 24