ketyiaの学んだこと議事録

このサイトでは学んだことを記事にまとめていきます

ウェブ・セキュリティ基礎試験(徳丸試験)の勉強 ㉒APIの脆弱性

ウェブ・セキュリティ基礎試験(徳丸試験)の勉強 ㉒APIの脆弱性


こんばんわ!
世間では徳丸試験といわれている、ウェブ・セキュリティ基礎試験に挑戦しようということで、いつものごとくアウトプットで記事にまとめていきます。

今回は第二十二回目のAPI脆弱性についてまとめます。

JSONJSONP


JSONとは、JavaScriptのオブジェクトリテラルの形式をベースに作られたデータ交換形式です。名前と値がペアになっているデータの集合体として表され、名前と値を「:」 (コロン)でペアとして記述し、データの間は「,」 (カンマ)で区切ります。これらを {}で囲んだものがJSON形式となります。

一方、JSONPは「JSON with Padding」の略で、異なるオリジン間でデータをやり取りするための手法です。JSONPは、異なるオリジン間でデータを受け渡すことができないXMLHttpRequestを使用せず、script要素を使用して外部のJavaScriptを直接実行することにより、異なるオリジン間でデータをやり取りする方法が考案されました。JSONPでは、JSON文字列そのままではscript要素でデータを受け取ることができないため、関数呼び出しの形でデータを生成します。

API脆弱性


APIで起こりやすい脆弱性は下記です

JSONエスケープの不備

JSON直接のXSS

JSONPのコールバック関数名によるXSS

・WebAPIのクロスサイト・リクエストフォージェリ

JSONハイジャック

JSONPの不適切な利用

・CORSの検証不備

原因は下記です

JSON文字列の生成時に適切なエスケープ処理などが行われていない

JSONの評価にeval関数などを用いているか、JSONPを用いている

対策は下記です

・文字列連携によるJSONデータ生成をやめ、信頼できるライブラリを用いてJSONを生成する

・eval関数ではなく、JSON.parseなどの安全なAPIJSONを解釈する

JSONXSS


APIが返すレスポンスデータをブラウザで直接閲覧させることにより、攻撃が可能になる場合があります。

対策は下記です

・MINEタイプを正しく設定する

・レスポンスヘッダX-Content-Type-Options:nosniffを出力する

Unicodeエスケープする

XMLHttpRequestなどCORS対策の機能だけから呼び出せるようにする

JSONPのコールバック関数のXSS


外部から指定したパラメータによって表示内容(関数名)が制御できることから、コールバック関数名によるクロスサイト・スクリプティングが可能になる場合があります。

原因は下記です

・外部から指定されたコールバック関数名を検証しないでそのまま表示している

・MINEタイプをText/JavascriptとするべきところをText/Htmlとしている

対策は下記です

・コールバック関数名の文字種と文字数を制限する

MIMEタイプを正しく設定する

クロスサイトリクエストフォージェリ


下記原因によって、APIにてクロスサイトスクリプティングが発生する可能性があります。

・text/plain エンコードせずにそのまま送信

・application/x-www-form-urlencoded 通常のフォーム

・multipart/form-data ファイルアップロードで用いる形式

対策は下記です

CSRFトーク

・二重送信クッキー

・カスタムリクエストヘッダによる対策

・入力データのMIMEタイプを検証

・CORSを適切に実装する

JSONハイジャック


JSONハイジャックとは、攻撃者が罠サイトを作成し、そのサイトにアクセスしたユーザーのブラウザから、本来は読み出せないはずのJSONデータを読み出す攻撃手法です。

対策は下記です

・X-Content-Type-Options:nosniffヘッダ付与

・X-Requested-with:XMLHttpRequestの確認

JSONPの利用


APIに悪意がある場合、緩和する手立てがJSONPにはありません。

従い、下記の対策を考える必要があります。

JSONPはできるだけ、CORS+JSONに移行する

JSONPは公開情報の提供のみに用いる

JSONPは信頼できる提供のみを使用する

レスポンスヘッダ


X-Frame-Options

これはHTTPヘッダのフィールドの一つで、Webページを別のページ中のiframeタグやembedタグ、objectタグから参照して埋め込み表示するのを許可するか指定するものです。Webサーバ側が「X-Frame-Options: DENY」を指定すると、他のページからこれらの要素を介して埋め込み表示することは拒否されます。一方、「X-Frame-Options: SAMEORIGIN」を指定すると、同じWebサイトを構成する別のページへの埋め込みは許可され、外部の他のサイトへの埋め込みは拒否されます。

X-Content-Type-Options

これはHTTPヘッダのフィールドの一つで、Content-Typeフィールドで指定したメディアタイプを強制適用するものです。WebサーバからWebブラウザへの応答(HTTPレスポンス)の中で用いられます。ブラウザ側ではこれに従わずに伝送されてきたデータ本体を調べてメディアタイプを推測する「MIMEスニッフィング」を行なう場合がありますが、これを防止するために「X-Content-Type-Options: nosniff」と指定します。

X-XSS-Protection

これはInternet Explorer, Chrome, Safariの機能で、反射型クロスサイトスクリプティング (XSS) 攻撃を検出したときに、ページの読み込みを停止するためのHTTPレスポンスヘッダーです。

Content-Security-Policy

これはクロスサイトスクリプティング (XSS) やデータインジェクション攻撃などのような、特定の種類の攻撃を緩和するためのセキュリティレイヤーでHTTPレスポンスヘッダーに指定して利用します。このポリシーは、特定のDocumentまたはWorkerに代わって要求(およびその後埋め込みまたは実行)できるリソース、インラインスクリプトの実行、eval()および同様の構造を介した動的コード実行、インラインスタイルの適用などを制御します。

ここまでです。
読んでいただきありがとうございます