インジェクションとSSRFの対策
インジェクション攻撃は、利用者が入力した文字列をWebアプリケーションがプログラムの命令の一部として解釈してしまい、意図しない処理を実行させる攻撃の総称である。代表的なものはOSコマンドインジェクションとSQLインジェクションであり、対策の基本は入力値を命令の構造から切り離して扱うことにある。SSRF(Server-Side Request Forgery)は、サーバが外部から指定されたアドレスへリクエストを送る仕組みを悪用し、サーバ自身の立場で本来は届かない宛先へアクセスさせる攻撃である。
攻撃が成立する仕組み
OSコマンドインジェクションは、入力された文字列がPHPのexec関数などを経由してOSのシェルに渡され、不正なコマンドやシェルスクリプトを実行させる攻撃である。シェルは入力に含まれる区切り記号を命令の区切りとして解釈するため、利用者の入力が後続のコマンドとして実行されてしまう。URLのパラメータにOSコマンドらしい文字列が含まれている場合、この攻撃が疑われる。
一方、HTTPヘッダインジェクションは、改行などの制御文字をHTTPヘッダに混入させ、応答ヘッダや応答本文を不正に分割・追加させる攻撃である。攻撃の型は、混入した文字列がどの位置に現れ、何として解釈されるかで判別する。
実装における対策
OSコマンドインジェクションへの有効な実装上の対策は、シェルを起動できる言語機能を利用した実装を避けることである。シェルを介さなければ、入力値がコマンドとして解釈される経路そのものがなくなる。
SQLインジェクションの実装上の対策は、プレースホルダを用いたパラメータ化クエリである。入力値をSQL文の構造と分けて値としてのみ扱うため、入力中の引用符や演算子がSQL文の構文を変えることができなくなる。
SQL文の組立てにおいては、利用者の入力を文字列連結で直接埋め込まず、静的プレースホルダで値をバインドすることが基本となる。この方法により、入力が命令として解釈される経路を断てる。
この節の続き
- 実装以外の対策と被害の抑制
- SSRFの特徴と対策
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む