この記事では、SQLMAP侵入テストツールを使用して、WebサイトがSQLインジェクションから安全かどうかをテストする方法を説明します。
SQLインジェクションとは何ですか?
SQL Injectionとはコード注入技術で、攻撃者はWebアプリケーションのデータベースを制御する不正SQLクエリーを実行します。 適切なクエリのセットを使用すると、ユーザーはデータベースに格納されている情報にアクセスすることができます。 SQLMAP は、’GET’ パラメーターが SQL インジェクションに対して脆弱かどうかをテストします。
たとえば、次の php コード セグメントを考えてみましょう。 したがって、ユーザーはデータベースを操作するために必要な SQL クエリを入力できるようになります。
Where can you use SQLMAP?
If you observe a web url that is a form http://testphp.vulnweb.com/listproducts.php?cat=1, where the ‘GET’ parameter is bold, then the website may be vulnerable to this mode of SQL injection, and a attacker may be able to get access to information in the database. さらに、SQLMAP は php ベースの場合に機能します。
ウェブサイトが脆弱かどうかを確認する簡単なテストは、get 要求パラメータの値をアスタリスク (*) で置換することです。 たとえば、
http://testphp.vulnweb.com/listproducts.php?cat=*
この結果、上記のようなエラーが発生した場合、そのウェブサイトは脆弱であると決定的に言えます。
SQLMAPのインストール
SQLMAPにはあらかじめkali linuxが入っていて、ほとんどの侵入テスト者がこれを選択することが推奨されています。 しかし、コマンド
sudo apt-get install sqlmap
Usage
この記事では、デモ目的で脆弱性が設計されているウェブサイトを使用します。 つまり、このウェブサイトはこの種のSQLインジェクションに対して脆弱であるかもしれません。
これをテストするために、SQLMAPを使用します。
sqlmap -h
基本的なSQLインジェクションに使用するパラメータは、上の図のとおりです。 これらに加えて、-dbsと-uパラメータを使用します。これらの使用方法は、ステップ1で説明しました。
Using SQLMAP to test a website for SQL Injection vulnerability:
- Step 1: List information about the existing databases
そこでまず、-uパラメータとともにチェックしたいウェブurlを入力する必要があります。 プロキシを使用してWebサイトをテストしたい場合は、-torパラメータを使用することもできます。 さて、一般的には、データベースへのアクセスが可能かどうかをテストしたいと思うでしょう。 そこで、-dbsオプションを使用して、これを行います。 -dbs は利用可能なすべてのデータベースを一覧表示します。sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
次の出力は、利用可能なデータベースが 2 つあることを示しています。 時々、アプリケーションはデータベースを特定したことを伝え、他のデータベース タイプをテストするかどうかを尋ねます。 そのまま「Y」を入力してください。
we observe that they are two databases, acuart and information_schema
- Step 2: List information about Tables present in a particular Database
To try and access any of the database, we have to slightly modify our command. ここでは、-D を使用してアクセスしたいデータベースの名前を指定し、データベースにアクセスできたら、テーブルにアクセスできるかどうかを確認したいと思います。 そのためには、-tablesクエリーを使用します。 Acuartデータベースにアクセスしてみましょう。sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tables
上の画像では、8つのテーブルが取得されていることがわかります。
- ステップ3:特定のテーブルの列に関する情報をリストアップする
特定のテーブルの列を表示したい場合は、次のコマンドを使用できます。 ここでは、’artists’ テーブルにアクセスしてみる。
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Columns
- ステップ4: 3806>同様に、次のコマンドを使用して、特定の列の情報にアクセスできます。ここで、-Cはカンマで区切られた複数の列名を指定でき、-dumpクエリはデータを取得します
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
上の図から、データベースからデータにアクセスしていることがわかります。 同様に、このような脆弱なウェブサイトでは、文字通りデータベースを探って情報を取り出すことができます
Prevent SQL Injection
SQL インジェクションは、一般に準備されたステートメントを使用することによって防ぐことができます。 プリペアドステートメントを使用する場合、基本的にコードのテンプレートを使用し、コードとユーザー入力を別々に分析します。 ユーザーが入力したクエリとコードを混在させることはありません。 冒頭の例では、ユーザーが入力した内容がそのままコードに挿入され、それらが一緒にコンパイルされるため、悪意のあるコードを実行することができるのです。 準備されたステートメントでは、基本的にユーザー入力用のプレースホルダーを含む sql クエリを送信し、実際のユーザー入力を別のコマンドとして送信します。
次の php コードセグメントを考えてみましょう。 これらは別々にコンパイルされます。 そのため、悪意のあるコードがユーザー入力として入力されたとしても、プログラムはコードの悪意のある部分をコマンドではなく、単に文字列として扱います。
Note: このアプリケーションはテスト目的でのみ使用すること
関連記事
Basic SQL injection and mitigation
Referece:stackoverflow.com
This article is contributed by Deepak Srivatsav. GeeksforGeeks が気に入って寄稿したい場合は、contribute.geeksforgeeks.org を使用して記事を書くか、[email protected] に記事を郵送することもできます。 あなたの記事が GeeksforGeeks のメインページに掲載され、他の Geeks を助けることができます
。