パスワードをクラッキングしたり、不正にウェブサービスにアクセスすることは法律で禁止されています。
しかし、「Hack me」というサービスでは疑似的にパスワードクラッキングを体験することが可能です。
今回は、前回に引き続きこの「Hack me」に挑戦します。
前回はソースコードにパスワードが書かれているという簡単な問題でしたが、今回のレベル2はどうでしょうか。
まだレベル1をご覧になってない方は、まずそちらからご覧ください。
Lv2に挑戦
今回もクラッキングするための方法を、まず探っていきます。
レベル1と違い今回は右クリックも普通に使えます。
ソースコードを見てもパスワードは表示されていませんでした。
ページの作りにおかしいところはなく、これは何かしらのクラッキング方法を用いてパスワードを見つけるしかなさそうです。
今回は代表的なクラッキング方法をまずは説明していきます。
SQLインジェクション
SQLインジェクションとは、数あるクラッキングの方法の中でも代表的なものとなります。
SQLインジェクションとは
そもそもSQLとはデータベースに入っている情報を取得したり、データの作製や更新、削除といった操作をするための言語です。
データベースというのは例えばブログなら投稿の内容やコメント、ショッピングサイトなら商品や購入履歴など、ウェブサービスでは様々な情報を持っています。
こういった情報はすべてデータベースという場所で管理されており、このデータベースから、欲しい情報を取得するのにSQLという言語が使われています。
そして、SQLインジェクションというのは、このSQLを入力ホームなどからうまく悪用して、データベースから情報を抽出したり、破壊することまで可能な方法となっています。
レベル2でSQLインジェクション
試しにこのSQLインジェクションが使えるのかを試してみましょう。
検証方法はSQLを使う上で意味をもつ記号を入力した場合、どうなるのかを確かめればよいのです。
試しにIDは適当に入力して、パスワードにSQLに文字列として認識させる役割がある「'(シングルクォーテーション)」を入力してみると…
ページの左上に謎のメッセージが表示されました。
シンタックスエラーとは、日本語で言うと、構文エラーの意味があります。
要するに「'(シングルクオーテーション)」によってSQL文が書き換えられて、処理がバグった、ということが、ページ左上に表示されたのです。
このようにフォームにSQLとして意味がある文字を入力して、プログラムを変更させてしまうのがSQLインジェクションです。
やっと手掛かりは見つかりました。
ここまで来ればゴールはもう少しです。
SQLインジェクションができることが分かったので、あとはどのようにしてログインを成功させるかです。
結論としては、間違ったパスワードでも認証をOKとさせればよいのです。
IDは適当に入力して、パスワード「 a ‘ or 1 = 1 — 」を入力します。
ログインボタンを押すと、
ログインができてしまいました。一体なぜでしょうか。
Hack meレベル2の解説
何をしたのかを解説していきます。
サイト側で、入力されたパスワードが正しいかを確かめるために、以下のようなSQLが実行されていたとします。
SELECT password FROM users WHERE password = ‘入力された値’
これは入力された値と一致しているパスワードがデータベースの中にあるかを確かめて、あったらログインOKとする処理になっています。
ただ、これでは一致するパスワードを見つけない限りログインができません。
そこで今回入力した値で以下のように内容を書き換えています。
SELECT password FROM users WHERE password = ‘a’ or 1 = 1
このSQL文は、パスワードがaのユーザーがいるか,もしくは1=1だったらログインOK、という意味になっています。
つまり、パスワードが間違っていても、1=1ということが正しければ、ログインできてしまうということです。
1=1というのは当然成り立っているので、今回の場合だと、パスワードが何であってもログインができてしまうのですね。
SQLインジェクションは、このようにSQLの脆弱性を突いて、処理自体を改変してしまうという恐ろしいクラッキング方法になります。
まとめ
今回はレベル1と違い、本格的なクラッキング方法でログインに成功させました。
SQLインジェクションはデータが盗まれたり、処理が改ざんされるなど、重大なセキュリティ事故になる恐れがあるので、実際には様々な対策がされています。
したがって今回のようにデータを抜くことは実質不可能といってもよいです。
注意点として、他のサービスでSQLインジェクションを試して不正アクセスを試みると、犯罪行為に当たりますので、絶対にやらないようにしてください。
今回はここまでになります。
レベル3にはどんな難題が待っているのか楽しみですね。
次回もぜひご覧ください。