SQLインジェクションとは
ウェブアプリケーションの中にはデータベースを操作する言語であるSQLを用いている場合がある。
攻撃者が不正なSQLのリクエストを送信することで、SQLによりデータベースの不正操作などをされてしまう脆弱性である。
脆弱性の原理
攻撃者がSQLの不正なリクエストを送信、サーバ側が実行できてしまうことが原因で脆弱性が存在している。
ウェブページ上の入力欄に加え、GET方式で送信している場合はURL中のクエリストリングも不正なリクエストの送信に用いられる。
攻撃の対象により2つに分類できる。
文字列リテラルに対するSQLインジェクション
入力されたデータ中に不正なSQL文を構成する文字列が含まれており、不正な動作を起こしてしまう。
数値リテラルに対するSQLインジェクション
文字列は異なりクォートしないため、文字列リテラルのエスケープ(後述)に相当する処理はない。
脆弱性が悪用された際の影響
この脆弱性を利用した攻撃では、サーバ側に不正な操作がされる。
- データベースに蓄積された非公開情報の閲覧
- データベースに蓄積された情報の改ざん、消去
- 認証回避による不正なログイン
- ストアドプロシージャなどを利用したOSコマンドの実行
サーバ側は情報を閲覧されるだけではなく、情報の改ざん、消去に加えOSコマンドの実行といった攻撃により深刻な被害を被る可能性がある。
他の利用者はこの攻撃だけで直接被害を被ることはないが、窃取された情報によっては他の不正な攻撃に利用されてしまう可能性がある。
対策方法
SQLで用意されている静的プレースホルダに入力された値を格納する。
静的プレースホルダを利用する場合、パラメータを指定する前に実行される構文が確定しているため、不正なスクリプトを含む文字列が入力されていても、不正なSQL文は実行されない。
文字列リテラルの場合、入力された値やURL中のクエリストリングの値など、SQLで実行されるパラメータに適切なエスケープ処理を行うことでも回避が可能。