sqlmapの使い方

SQLインジェクションの脆弱性が存在する兆候がある場合、sqlmapを使うことがあります。

ただし、脆弱性を報告する予定で既にSQLインジェクションを確認できているのであればsqlmapは使わない方が無難です。というのも、SQLインジェクションの脆弱性が存在する事を確認できているにも関わらずsqlmapでデータベースをダンプするなど情報漏洩につながる行為をすると敵対行為と見なされる場合があるためです。トラブルを避けるためにも必要以上の攻撃は避けた方が無難です。

基本的な使い方

最低限必要なのはURLを指定する「u」オプションです。

sqlmap -u "https://example.com/login.php?id=x"

POSTメソッドの場合は「data」オプションでデータを指定します。

sqlmap -u https://example.com/login.php --data="id=x"

SQLインジェクションを検出できない場合は「level」と「risk」を調整します。

level

初期値は「1」で1~5まで指定できます。

leve 2からCookieヘッダーがテストに追加され、level 3ではユーザーエージェントやリファラがテストに追加されます。level 5は最も高いレベルでHostヘッダーをテストに追加します。

脆弱性の有無を確認する場合はlevel 5でチェックする事をおすすめします。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --level=5

risk

初期値は「1」で1~3まで指定できます。

risk 1はデータベースに影響を与える事がありません。risk 2は大量のクエリ時間ベースの SQL インジェクションのテストが追加されます。risk 3はORベースの SQL インジェクション テストが追加されます。

risk 3はWEBアプリケーションのSQL文によりますがテーブルを破壊してしまう場合があるため注意が必要です。risk 3はテーブル破壊が許されている検証環境やCTFに限定する事をおすすめします。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --level=5 --risk=2

データベースをダンプする

SQLインジェクションを実行可能と判断したら「dbs」オプションでデータベース名を列挙します。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --dbs

データベース名を列挙できたら「tables」オプションでデータベースのテーブルを列挙します。データベース名は「D」オプションで指定します。

sqlmap -u https://example.com/login.php --data="user=x&password=y" -D users --tables

データベースをダンプしたい場合は「dump」オプションを使いますが、本当にこのオプションを使ってデータベースをダンプする必要があるのか検討してください。冒頭に書いたようにバグ報告する場合は必要以上の攻撃は避けた方が無難です。

データベースとテーブルを指定してダンプする場合は「D」オプションでデータベース名を指定し「T」オプションでテーブル名を指定します。

sqlmap -u https://example.com/login.php --data="user=x&password=y" -D users -T login --dump

アクセス可能なすべてのデータベースをダンプしたい場合はデータベース名とテーブル名を指定せずに実行します。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --dump

知っていると役に立つTIPSなど

スレッド数を変更する

sqlmapは終了するまでに非常に時間がかかる場合がありますが、スレッド数を増やすと処理時間を短縮できる場合があります。スレッド数の最大値は10となっていて、-tオプションもしくは--threadsオプションでスレッド数を変更できます。

ただしスレッド数を最大値にして実行すると不安定になる場合があるため、そのような場合はスレッド数を下げる必要があります。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --dump --threads=10

テクニックオプション

sqlmapは6つのテクニックを使ってSQLインジェクションのテストを実行しますが、どのテクニックを使うのか指定することもできます。テクニックオプションの初期値は「BEUSTQ」です。「BEUSTQ」はそれぞれ次のテクニックを指します。

  • B: Boolean-based blind
  • E: Error-based
  • U: Union query-based
  • S: Stacked queries
  • T: Time-based blind
  • Q: Inline queries

通信環境が不安定な場合や時間を節約したい場合は「T」を外してTime-based blindをスキップさせる、といった事ができます。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --technique=BEUSQ

ファイルダウンロード

バックエンド データベース管理システムが MySQL、PostgreSQL、または Microsoft SQL Server である場合、権限が許す範囲内でファイルをダウンロードできます。ファイルはテキストベースでもバイナリベースでも問題ありません。

sqlmap -u https://example.com/login.php --data="user=x&password=y" --file-read=/etc/passwd

HTTPリクエストをファイルから読み込む

sqlmapはファイルからHTTPリクエストを読み込むことができます。クッキーや複雑なPOSTデータなど、コマンドラインでは難しい指定をファイルから簡単に読み込ませる事ができます。

たとえばBurp Suiteを通じてやりとりしているセッションを利用できます。Burp SuiteのRequestの画面で右クリックし「Copy to file」でHTTPリクエストをファイルに保存します。

保存したファイルを「r」オプションで読み込みます。

sqlmap -r login.req

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。