Shikata Ga Nai

Private? There is no such things.

【有料試作版】BugBounty解説:$6,400報奨金を得たクリティカルSQL Injection

Hello there, ('ω')ノ

記事:

https://aryasec.medium.com/my-first-critical-on-hackerone-with-a-6-400-bounty-sql-injection-913566a12c6b


ねらい

この記事は、HackerOneで発見されたSQL Injection(SQLi)により、報奨金\$6,400を獲得した事例です。 攻撃者視点では、「ちょっとしたパラメータ操作」からサーバ内部のPostgreSQLデータベースに到達するまでのストーリーが重要です。


全体像(ストーリー)

  1. ターゲットはクラウド関連のサブドメイン cloud.****/

  2. ログインが必要だったため、まずSignUpページからアカウント登録。

  3. 登録後の画面で通信をBurpSuiteで観察。

  4. 特定のリクエスト:

   https://cloud.****/****/dnt?level=standard&region=gcp-us-central1

に注目。

  1. region パラメータにシングルクォート(')を入れると、500エラーを返した。

  2. SQL Injectionの兆候を確認。

  3. その後、SQLmapを利用して自動化 → PostgreSQLが動いていることを確認。

  4. 結果:データベース操作可能なクリティカル脆弱性


実践:一手ずつ「なぜそうするか」

1) サインアップから観察

  • 操作:新規登録してメールを使用。
  • 理由:まずはログインバイパスではなく「正規の入り口」を利用し、アプリの動作をBurpで記録するため。

2) 不審なエンドポイントを見つける

  • 対象:
  /dnt?level=standard&region=gcp-us-central1
  • 理由:パラメータ region はクラウド環境のリージョン指定用 → 動的にDBへ問い合わせていそうと推測。

3) 単純なインジェクションテスト

  • 操作:region=gcp-us-central1'
  • 観察:レスポンスが500 Internal Server Error。
  • 理由:SQL構文が壊れた → サーバが入力をエスケープしていない証拠。

4) 自動化で深掘り

  • 操作:SQLmapを利用してテスト。
  • 結果:バックエンドDBはPostgreSQL
  • 理由:SQLmapはエラーメッセージや応答の違いからDBMSを特定 → 攻撃を効率化。

影響(Impact)

攻撃者は以下を実行可能:

  • SQL文の改ざん(WHERE条件を変更、権限昇格)
  • 任意データの抽出(ユーザー情報、資格情報など)
  • DB破壊や改ざん(DELETE/UPDATEによる破壊的攻撃)

記事では直接「データ閲覧」までは言及していませんが、SQL Injectionの一般的影響範囲はアカウント情報流出や完全なデータベース制御に及びます。


失敗パターン(学び)

  • もし500エラーが出なければ? → 単純な ' では動かないケースもある。"--) OR (1=1)-- などを試す必要がある。

  • もしWAFがあったら? → その場合は時間差攻撃(Time-based Blind SQLi)を試す。 例:region=gcp-us-central1' || pg_sleep(5)--


実務目線の防御策

  • Prepared Statements(プリペアドステートメント)の使用 → 値とクエリを分離し、SQL Injectionを原理的に防止。

  • 入力検証・サニタイズ → 特殊文字 ' " ; -- などを適切に処理。

  • エラーメッセージ制御 → ユーザーにDBエラーを直接返さず、内部ログにのみ記録。


まとめ

この攻撃のポイントは:

  1. 正規の登録から観察(BurpSuiteで通信確認)
  2. 動的パラメータを特定(regionが怪しい)
  3. シンプルなインジェクションテスト(' → 500エラー)
  4. 自動化ツールで確認(SQLmap → PostgreSQL特定)
  5. Critical報告として提出 → $6,400報奨金

つまり、「小さなエラー反応からクリティカルまで掘り下げる」ことがバグハンティング成功の鍵です。

Best regards, (^^ゞ