Hello there, ('ω')ノ
記事:
ねらい
この記事は、HackerOneで発見されたSQL Injection(SQLi)により、報奨金\$6,400を獲得した事例です。 攻撃者視点では、「ちょっとしたパラメータ操作」からサーバ内部のPostgreSQLデータベースに到達するまでのストーリーが重要です。
全体像(ストーリー)
ターゲットはクラウド関連のサブドメイン
cloud.****/。ログインが必要だったため、まずSignUpページからアカウント登録。
登録後の画面で通信をBurpSuiteで観察。
特定のリクエスト:
https://cloud.****/****/dnt?level=standard®ion=gcp-us-central1
に注目。
regionパラメータにシングルクォート(')を入れると、500エラーを返した。→ SQL Injectionの兆候を確認。
その後、SQLmapを利用して自動化 → PostgreSQLが動いていることを確認。
結果:データベース操作可能なクリティカル脆弱性。
実践:一手ずつ「なぜそうするか」
1) サインアップから観察
- 操作:新規登録してメールを使用。
- 理由:まずはログインバイパスではなく「正規の入り口」を利用し、アプリの動作をBurpで記録するため。
2) 不審なエンドポイントを見つける
- 対象:
/dnt?level=standard®ion=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エラーを直接返さず、内部ログにのみ記録。
まとめ
この攻撃のポイントは:
- 正規の登録から観察(BurpSuiteで通信確認)
- 動的パラメータを特定(regionが怪しい)
- シンプルなインジェクションテスト(' → 500エラー)
- 自動化ツールで確認(SQLmap → PostgreSQL特定)
- Critical報告として提出 → $6,400報奨金
つまり、「小さなエラー反応からクリティカルまで掘り下げる」ことがバグハンティング成功の鍵です。
Best regards, (^^ゞ