コハナの脆弱性?

昨日、コハナで書かれたポータルが攻撃に成功しました。 尊敬されるフレームワークで罪を犯す必要があるという考えは、そのセキュリティは最後にはほど遠いものでしたが、最初は議論さえされていませんでした。 私たちのサイトをクロールしたプログラムは、この脆弱性を発見するのに約95万件のリクエストと5時間かかりました。 Kohanaカーネルバージョン3.2の次の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 ::サイト関数が現在のuriに適用され、preg_replaceに実行修飾子「e」が使用されます。rawurlencodeはURLの各セグメントに適用され、セグメントは二重引用符で送信されます($ {@ phpinfo()})のようなもので、動作します。 したがって、リンクhttp:// site / path / param1を使用してリダイレクトが行われる場合、($ {@ phpinfo()})などの式をparam1に追加すると、コードを実行できます。 主なことは、param1には非ASCII文字(ロシア文字など)も含まれていることです 。 私たちのケースでは、ボットによって脆弱性が発見された後、男が問題を取り上げ、しばらく操作した後、この穴からシェルを埋めることができました。 このような貴重な助けがそのような瞬間に提供されました。 Kokhanovsky例外ハンドラーには次のスライスがあります。
 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); } // ..... // }
      
      



要求には、XMLHttpRequestと等しいX-Requested-Withヘッダーがありますか? エラーメッセージを保管してください! トラッカーの小花はすでに退会しています。



All Articles