以下の性質を持つAPIは、インジェクション脆弱性の影響を受ける恐れがあります:
これまでの経験から、この脆弱性について度々報告してきた事例がございます。特に注目するのは、インポート機能を経由するSQLインジェクションと、予期しない起点からのOSコマンドインジェクションです。まずはSQLiについて説明します。
当該問題は、プライベートなバグバウンティプログラムで発見されました。直接の入力には十分な整形処理が施されていたものの、インポート機能が考慮されていなかったために発生しました。アプリの基本部分は、インポート機能実装の1年前に構築されていたためです。
Upload.csvは次のような内容でした:
name,address,email,phone
',',','
アップロード時にフィールド区切りとしてカンマを選択すると、SQLエラーが表示され、その後詳細を調査することになりました。
エラー内容は次の通りです:
Expects parameter 1 to be string, null given in /var/www/html/import.php
これにより、クエリを中断し、新たなクエリを実行しました。
name,address,email,phone
';select * from users;--,',','
この結果、アプリはエラーメッセージ内にusersテーブル全体を出力しました。これをもって問題を報告し、バウンティを獲得するに至りました。
次の例はやや複雑さが低いものです。'osParam'というパラメータにフラグらしきものが含まれていることに気付き、事前に用意したコマンドインジェクションリストを用いてburp suite intruderを起動したところ、burp suiteの9回目のリクエストでヒットがありました。コマンドの区切り文字として改行コード '\n' を使用し、pingコマンドが応答を遅延させました。
index.php?osParam=\\nping -c 10 127.0.0.1
そこで直ちにwhoamiを試し、その結果を報告、2日後に承認が下りました。
不適切な実装により、XSSなどの脆弱性が生じるphpの例:
$id = $row['id'];
$title = $row['title'];
$des = $row['description'];
$time = $row['date'];
正しい実装例
$id = htmlentities($row['id']);
$title = htmlentities($row['title']);
$des = htmlentities($row['description']);
$time = htmlentities($row['date']);
この種の問題は多様で、自動テストが容易でない場合もあります。目立たないエンドポイントも含め、全てのポイントを把握することが重要です。自動テストだけでは補いきれない部分を、手動テストで補完することが推奨されます。
全エンドポイントの把握は、隠れたパラメータの発見も含め非常に煩雑となり得ます。新規APIエンドポイントは文書に追加し、既存のものも可能な限りインデックス化してください。この課題はAPI Security Companyを活用することで解決可能です。
統計によれば、この脆弱性は2021年のOWASP Top 10で最上位に位置すると考えられます。
最新情報を購読