サイト攻撃 SQL Injection@PHP技術

さて、次はSQLInjectionです。

SQLInjectionとは、フォームのテキスト入力などにSQLを書くことでサイトの意図としないデータベース操作を行う攻撃手法です。
前期のXSSやScriptInsertionよりは成功しづらいですが、成功するとダメージが大きい特徴を持っています。

  • SQL Injection攻撃側

まず、さきほどの掲示板でパスワードは設定されていれば、パスワードを認証することで投稿レスを削除できる機能があります。


その機能に乗じて、HTMLに以下のコードを含ませます

<form action="http://localhost/2-1.php" method="post">
<input type="hidden" name="id" value="0 OR 1 #" />
<input type="hidden" name="pass" value="" />
<input type="submit" name="delete" value="実行" />
</form>

この実行ボタンを押すと、php側で以下のSQLが実行されます。

DELETE FROM bbs WHERE id=0 OR 1 # AND pass='' LIMIT 1

ここで注目してほしいのは、"id=0 OR 1 # "のところです。この文には2つ役割があって、
"id=0 OR 1" で全てのレコードを対象とする役割と、
"#"(コメントアウト) でそれ以降のSQL文が全て無効にする役割です。
結果、1行だけ削除しようとしたオペレーションは、
コメントアウトでパスワード認証と削除限界数が無効化され、
全てのレコードを削除してしまうことになります。

  • SQL Injection防御側

防御側としては、SQLサニタイズをします。
具体的には、整数型にはintval()関数、文字列型にはaddslashes()関数を利用すると有効です。


では、先ほどのSQLに各関数を適用してみます。

DELETE FROM bbs WHERE id=0 AND pass='A' LIMIT 1

おお、まともなSQLになりました。


他にもPDOのプリペアドステートメントがSQLInjectionに対して有効です。