Instagramはこちら

攻撃で見る『SQLインジェクション』

『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インジェクション』の脅威への理解の一助となっていれば幸いです。