Уязвимость В Кохане?

Вчера наш портал, написанный на языке 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

Вместе с данным постом часто просматривают: