Hello there, ('ω')ノ
✅ 脆弱性の概要
多くのアプリケーションは、画面上では正常な入力値しか想定しておらず、 異常な入力値(負の数、異常に大きな値、桁外れな文字列など)への対処を忘れていることがあります。
💣 典型的な設計ミスの例:送金処理
以下は、送金処理の簡略化されたコードです:
$transferAmount = $_POST['amount']; $currentBalance = $user->getBalance(); if ($transferAmount <= $currentBalance) { // 送金を実行 } else { // 残高不足でブロック }
ここで amount に -1000 を送ると…
-1000 <= 現在の残高は 常に true- 送金が許可されてしまう
- さらに、受取先と送金元が逆転する可能性もあり、被害者から攻撃者に送金されてしまうことも!
🔍 監査時に試すべき「想定外の値」
| フィールド種別 | 試すべき入力値 |
|---|---|
| 数値系 | -1, 0, 99999999, 1.5, 'abc' |
| 文字列系 | ''(空文字), A*10000, 特殊文字 |
| 日付系 | 1970-01-01, 9999-12-31, null |
| フラグ系 | true, false, yes, 0, 1, 2, -1 |
🛠 Burpを使った検証手法
- 対象機能をブラウザで実行(例:商品注文、送金、数量入力など)
- Burp Proxyで通信をキャプチャ
該当のパラメータを Repeaterで改変
quantity=-10amount=9999999discount=100
- サーバーのレスポンスや画面挙動を観察
✅ 設計の教訓と対策
| 教訓 | 対策 |
|---|---|
| データ型の受け入れ可能範囲を定義せよ | 数値は必ず min <= 値 <= max のチェックを行う |
| クライアント側の制御だけでは不十分 | JSでの検証はあくまで補助。必ずサーバー側で再検証すること |
| 「想定外」の入力が来ることを前提に作れ | nullや型不一致を想定し、try-catchやバリデーションで明示対応 |
✅ まとめ
- 想定外の入力=バグや脆弱性の入口
- 特に負の数、極端な値、異常な型は要注意
- Burp Repeaterを活用してサーバーが本当に検証しているか確認せよ
Best regards, (^^ゞ