『SQLインジェクション』
WEB業界においてはあまりにも有名なこの攻撃手法。
それだけ被害が甚大ということですが、対策も多くの著名な先達が公開しています。
その記事だけを読んで
「はいはい、エスケープ処理しとけばいいんでしょ?」
と思っていませんか?
そう僕のことです。
今回は「攻撃でみる『SQLインジェクション』」ということで、
どういった仕組みを悪用しているのかを理解することで、根本を一緒に理解していきましょう。
『SQLインジェクション』の仕組み
『SQLインジェクション』はSQL文をなんとかして自分に都合のいいように改造することで
データベースを思い通りに操作する攻撃です。
下記のようなシステムを考えてみましょう。
$userid = $_POST['userid']
$password = $_POST['password']
$sql="SELECT user_id,password FROM users WHERE user_id='$userid' AND password='$password';";
このシステムのuseridに
' OR 1=1--
が入っていたとしましょう。すると3行目のSQL文はどうなるでしょうか?
<?php
$sql="SELECT user_id,password FROM users WHERE user_id='' OR 1=1--' AND password='$password';";
?>
パスワードを確認する処理がコメントアウトされてしまいました。
これで攻撃者は簡単にログインすることができるというわけです。
『SQLインジェクション』の怖さ
『SQLインジェクション』の恐ろしいところは脆弱性があった場合、SQL文でできる操作はほぼすべてできてしまう。ということです。
同様のシステムで下記のような入力を考えてみましょう。
' OR 1=1; SELECT FROM USERS; --
すると実行されるSQL文は
<?php
$sql="SELECT user_id,password FROM users WHERE user_id='' OR 1=1; SELECT FROM USERS; --' AND password='$password';";
?>
となり、すべてのユーザーの情報を取得することができてしまいます。
いかがだったしょうか?
攻撃の原理を知ると、データベースにパスワードを平文で載せるなんて論外ですし、プレスホルダーでの組み立てが重要であることがよくわかります。
『SQLインジェクション』の脅威への理解の一助となっていれば幸いです。