脆弱性についてまとめてみるぼっちアドベントカレンダーの11日目の記事です。
(書ききったのは22日目...学校のレポートが...)
概要
ファイルアップロードの脆弱性は画像のみ投稿できるサイトにphpファイルを投稿しサーバーサイドで実行するなどといった本来アップロードできないファイルをアップロードできてしまう脆弱性です。
悪用方法について
ファイルアップロードの脆弱性では多岐にわたる悪用をすることができます。
RCE
まずはRCE(リモートコード実行)です。
プロフィール画像等のファイルアップロード機能を利用しphpファイルをアップロードしサーバーサイドで実行させることで攻撃が成功します。
RCEが成功すると内部の情報漏洩から改ざん削除やマルウェアを仕込まれたり外部への攻撃への踏み台に使われてしまったりします。
XSS
またXSSにも利用することができます。
SVG形式の画像は内部にJSを埋め込むことができ掲示板等にSVG形式の画像をアップロードでき適切に対策していない場合Stored XSSになります。
DoS
DoSといえば大量のリクエストを送りつけることを想像するかもしれませんがサービスの可用性を低下させる攻撃の総称です。
そのため画像サイズの制限がなければ巨大なファイルサイズの画像を大量にアップロードしストレージを枯渇させシステムをダウンさせたりクラウドを利用している場合高額な請求を発生させることができます。
対策について
フィルタリングについて
様々なフィルタリング方法がありますが個々では3つ紹介します。しかし基本的にフィルタリングはバイパスされることを考えなければなりません。
MIME検証
これはhttpで送信される際に付与されるファイルタイプを確認するものです。しかしMIMEはファイルの拡張子に基づいて設定される為簡単にバイパスされほとんど意味をなしません。
マジックナンバー検証
マジックナンバーとはファイルの先頭にあるバイト列の事でファイルの内容を識別するものです。
しかしMIMEよりはマシですが偽造が不可能なわけではないので確実な対策ではありません。
ファイル長フィルタリング
こちらはファイルの種類というよりかはDoS対策になります。一応色々機能が盛り込まれた汎用的なリバースシェルのコードはサイズが大きくなるためフィルタリングできますが単純なものを利用すればいいだけなので対策になりません。しかしDoS対策としては有能なのでこれは必須だと思います。
これらのフィルタリングは基本的にクライアントサイドとサーバーサイドの両方で行うことが望ましいです。
理由は簡単でBurpSuiteなどで簡単にクライアントのフィルタリングはバイパスできてしまうためです。
サーバーサイドフィルタリングのバイパス
こちらは少し複雑です。
拡張子フィルタリング
サーバーサイドで拡張がブラックリスト方式でフィルタリングされている場合php5やphtmlといったマイナーな拡張子を使えるか検証する価値があります。
マジックナンバーフィルタリング
phpの場合開始タグがあるためphpファイルの先頭にJPEG等のマジックナンバーをつけても正常に実行することが可能です。
適当にhexeditorなどで簡単に偽造が可能です。
HackerOneレポート
あまりファイルアップロードの脆弱性のレポートを探すことができませんでした。
この脆弱性はRCEやXSSへの途中経過に過ぎないことが多いからだと思います。
1. Tricking the "Create snippet" feature into displaying the wrong filetype can lead to RCE on Slack users
リンク: https://hackerone.com/reports/833080
PoC動画: https://www.youtube.com/watch?v=cIlGfnn4iG8
これはSlackに存在していた脆弱性です。
ユーザーがスニペットを送信する際ファイル名とファイルタイプをそれぞれ自由に指定できるため拡張子も普通のBATファイル、内容もBATファイルだがファイルタイプをCSVとすることができファイル名を長くし拡張子を見えないようにしたらクリックしただけでBATファイルを実行させることができます。
こういったコミュニケーションツールではファイルを送信する際の対策が大事だなと感じました。実行ファイルも簡単に送れてしまったら大変ですよね。
詳細は非公開ですがPoC動画があってすごくわかりやすかったです。