[第一回]SQLインジェクション

SQLとは

SQLというのはデータベース管理システムにおいて、データ操作や定義を行うためのデータベース言語のこと。

データベースってなんだ?と思うかもしれないが、意外とデータベースは身近にあります。

例えばTwitterでのあなたのツイートは全てデータベース化されているし、登録制のサイトにログインするときの処理には必ずデータベースでのユーザ名とパスワードの照合が行われます。

利用しているぶんには目立つことがないですが、もはやデータベースは我々のインターネット利用において切っても切り離せない関係なのです。

SQLインジェクションとは

SQLインジェクションというのはそんなもはや殆どのウェブサイトで使われているデータベースに対する攻撃手法のことです。

データベースに対する攻撃ってどういうことなんだ?っていう人もいると思うので簡単に解説します。

先程も述べたように、データベースはログインシステムなどで使われています。

ログインシステム

ログインする際にブラウザにユーザ名とパスワードを入力しているのですが、それらがどのように使われているかを示しましょう。

サイトを管理しているサーバには以下のようにユーザの情報が登録されています。

実際にはパスワードはこのように平文ではなく、ハッシュ化されていますがここでは平文で保存されていた場合を考えます。

このパスワード認証を突破しようとしたとします。

覚えておいてほしいことは、仮に乗っ取りたいアカウントのユーザ名がtanakaであるのがわかっていたとしても、パスワードの桁数が長ければパスワードの組み合わせが膨大となりとても不正ログインすることはできません。

さらに、サーバには普通何回かログインに失敗するとアクセスを拒否するような仕組みがあるため、このようにたった4桁のパスワードだったとしても正攻法で正面から突破するのは容易ではありません。

じゃあ不正ログインは無理でこのシステムは安全なんじゃないの?というのは間違いです。

ログイン認証の仕組みの例

フォームにユーザ名とパスワードを入力してログインボタンを押すとSQL文と言われるコードが出力されます。

ここで紹介しているのは擬似コードですし、ツイッターは安全なログインシステムを利用しているので同じような攻撃を仕掛けても無意味です。

まず最初にユーザ名が登録されているかどうかを調べるので、入力された “tanaka” を使ってデータベースを検索します。

すると、ユーザ名 “tanaka” 、パスワードが “1234” で登録されているユーザが見つかりました。

見つかったので次にパスワードが正しいか調べるために入力されたパスワード “1234” と比較し、一致しているのでログインに成功するというわけです。

不正なクエリを送る

では、実際にこのログインシステムをSQLインジェクションで破る方法を考えてみましょう。

ここでもやはり乗っ取りたいアカウントのユーザ名が “tanaka” であることはわかっていたとします。

不正なリクエストの一例

ユーザ名は “tanaka” のまま、パスワードを “t’ OR ‘t’ = ‘t” のような文字列に変換します。

つまり、SQLインジェクションとはパラメータがSQL文内で変数展開されることを利用した攻撃手法だということです。

このコードに対してちゃんと対策をおこなっていないと不正なログインを許してしまいます。

なぜなら “tanaka” というユーザ名は存在するのでパスワードが一致するかどうかのチェックを行うのですが、その時のチェック方法がマズいためです。

IF password = ‘t’ OR ‘t’ =‘t’ RETURN 0

が管理者の意図しないどのような動きをするかを見てみましょう。

これはIF文の中身がTrueであればログインを許可するというコードなのですが、パスワード入力欄にSQL文の一部を書くことで自分でログイン認証を書き換えてしまうことができるためです。

上のコードは「データベースに登録されているパスワードが “t” であるか、”t” = “t” の場合にログインを許可する」という意味を持ってしまっています。

登録されているパスワードは “1234” であって “t” ではないので一つ目の条件文はFalseなのですが、次の “t” = “t” はデータベースのパスワードに関わらず常にTrueを返します。

従って、これはどんなに長くて強固なパスワードを設定していたとしても不正ログインを許してしまうのです。

実際、探せばこの程度の脆弱性を持つウェブサイトはまだまだあると思います(特に個人運営の場合)

まとめ

つまり、SQLインジェクションされるというのはパスワードの強固性とは全く関係がない問題だということです。

どんなに強力なパスワード保護システムや、暗号化を施していたとしてもSQLインジェクションされてしまうと全て無効だということです。

オービスに対するSQLインジェクション

上の画像はオービスがナンバープレートを読み取って違反者などのデータを登録していることを逆手に取って、ナンバープレートの代わりにSQL文を書くことで全てのデータベースを削除するコードを実行するものです。

もしこれが動作してしまうと違反者全てのデータが消えるのでスピード違反し放題ですね!!(違う

次回はもうちょっと深いSQLインジェクションの知識について参考サイトを交えて紹介していきたいと思います。