Shikata Ga Nai

Private? There is no such things.

APIでサポートされているコンテンツタイプの特定 – セキュリティの盲点を突く

Hello there, ('ω')ノ

APIは特定のデータフォーマットを想定してリクエストを処理します。しかし、異なるコンテンツタイプ(Content-Type)を送信すると、予期しない動作を引き起こす可能性があります。これを利用すると、エラーメッセージの取得、認証・認可のバイパス、さらにはインジェクション攻撃の実行が可能になる場合があります。


1. APIが扱う主なコンテンツタイプ

Content-Type 説明 セキュリティリスク
application/json JSON形式のデータ 一般的に安全だが、パース処理の不備でXXEが発生することもある
application/xml XML形式のデータ XXE(XML外部実体参照)やXPathインジェクションのリスク
text/plain ただのテキスト 型チェックの回避やSQLインジェクション
application/x-www-form-urlencoded HTMLフォームデータ クライアント側のバリデーションをバイパス可能
multipart/form-data ファイルアップロード時に使用 ファイルのパス・種類の制限バイパス
application/graphql GraphQLのクエリ送信時に使用 クエリのバリデーションをバイパスできる可能性

2. Content-Typeの変更による攻撃手法

(1) エラーメッセージの取得

異なるコンテンツタイプを試すことで、APIの内部処理や使用しているフレームワークに関する情報がエラーメッセージとして漏洩することがあります。

例: JSONを想定しているAPIにXMLを送信

POST /api/orders HTTP/1.1
Host: example.com
Content-Type: application/xml

<order>
    <item>123</item>
</order>

レスポンス

{
    "error": "Unexpected token '<' at position 0 in JSON"
}

👉 サーバーがJSONを期待していることが分かる → JSONパースのバグを狙える可能性


(2) 認証・認可のバイパス

場合によっては、特定のコンテンツタイプを使うことで、アクセス制御が適用されないエンドポイントが存在する可能性があります。

例えば、通常のリクエストでは認証が必要でも、Content-Type: text/plain で送信すると認証を回避できることがあります。

POST /api/admin HTTP/1.1
Host: example.com
Content-Type: text/plain

admin=true

👉 APIがプレーンテキストを処理すると、認証チェックを回避できる可能性


(3) インジェクション攻撃

JSON形式では安全でも、XMLでは脆弱なAPIが存在することがあります。

例: JSONなら問題ないが、XMLだとXXEが発生
POST /api/profile HTTP/1.1
Host: example.com
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<profile>
    <name>&xxe;</name>
</profile>

👉 このリクエストが成功すると、/etc/passwd の内容が漏洩する可能性(XXE攻撃)


3. Content-Typeを変更してAPIをテストする方法

(1) Burp Suiteで手動テスト

  • Burp SuiteのRepeaterを使用し、Content-Typeを変更して送信
  • 異なるデータフォーマットでAPIがどう応答するか観察
  • レスポンスのエラーメッセージを分析し、攻撃のヒントを得る

(2) Content type converter BAppの活用

  • Burp Suiteの BApp Store から Content type converter をインストール
  • JSONデータをXMLに自動変換し、リクエストを送信
  • 手作業なしで複数のフォーマットをテスト可能

(3) Burp Intruderを使った自動化テスト

  • IntruderでリクエストのContent-Typeヘッダーをパラメータ化
  • application/json, application/xml, text/plain などを順番に送信
  • レスポンスの違いを比較し、異常動作を探す

4. まとめとポイント

APIは異なるContent-Typeに対して異なる動作をすることがある
エラーメッセージを利用してAPIの内部構造を推測できる
Content-Typeを変更することで、認証バイパスやインジェクション攻撃が可能になることもある
Burp Suiteの「Content type converter」やIntruderを活用し、効率的にテストを行う

Content-Typeの変更による攻撃は、APIテストの基本ですが、脆弱なAPIに対しては強力な攻撃手法となります。テスト時には複数のフォーマットを試し、APIの想定外の挙動を探りましょう。

Best regards, (^^ゞ