SQLインジェクション脆弱性診断|実施方法と診断ツールの選び方

SQLインジェクションの脆弱性診断方法を完全解説。手動診断の実施手順、診断ツール5製品の比較、CVSS評価による優先順位付け、外部診断サービスの選定基準まで。効果的な診断でSQLインジェクションリスクを可視化し、適切な対策を実施するための実践ガイド。

脆弱性診断の種類と特徴

脆弱性診断は、SQLインジェクションを含むWebアプリケーションの脆弱性を体系的に発見するための重要なセキュリティ対策です。診断手法を適切に選択することで、効率的かつ網羅的な脆弱性の発見が可能になります。

ブラックボックステストとホワイトボックステスト

セキュリティ診断には、診断対象の情報開示度に応じて、異なるアプローチがあります。それぞれの特性を理解し、目的に応じて使い分けることが重要です。

ブラックボックステストの実施方法

ブラックボックステストは、実際の攻撃者と同じ視点から診断を行う手法です。

定義
内部構造を知らない状態での外部からの診断です。実際の攻撃者と同じ条件で、公開されている情報のみを使用してテストを実施します。システムの設計書やソースコードにアクセスできない状況を想定し、純粋に外部から観察できる振る舞いのみで脆弱性を探索します。これにより、現実的な脅威を最も正確にシミュレートできます。
メリット
現実的な脅威の発見が可能で、実際の攻撃者が発見しうる脆弱性を効果的に特定できます。先入観なしの診断により、設計者が想定していない攻撃経路を発見できることもあります。実装非依存のため、使用技術やフレームワークを問わず適用可能です。また、外部委託しやすく、機密情報の開示を最小限に抑えられます。
デメリット
網羅性に限界があり、すべての機能やコードパスをテストすることは困難です。時間効率が悪く、手探りでの探索となるため、診断に長時間を要します。深層の問題発見が困難で、複雑なビジネスロジックの脆弱性や、特定の条件下でのみ発生する問題を見逃す可能性があります。また、診断者のスキルに大きく依存し、経験豊富な診断者でないと重要な脆弱性を見逃すリスクがあります。

ホワイトボックステストの実施方法

ホワイトボックステストでは、システムの内部構造を完全に把握した上で診断を行います。

ソースコード解析により、SQLインジェクションが発生しうるすべての箇所を特定します。データベースアクセス層のコードを精査し、動的SQL生成箇所、パラメータ化されていないクエリ、不適切なエスケープ処理を発見します。

設計書レビューでは、アーキテクチャ設計、データベース設計、API仕様書を確認し、構造的な脆弱性を特定します。特に、権限設計の不備や、信頼境界の誤認識による問題を発見できます。

データフロー分析により、ユーザー入力がデータベースクエリに到達するまでのすべての経路を追跡します。これにより、間接的なSQLインジェクションや、二次的な攻撃経路を発見できます。

権限設計の検証では、データベースユーザーの権限が最小権限の原則に従っているか確認します。過剰な権限は、SQLインジェクション発生時の被害を拡大させる要因となります。

グレーボックステストの活用

グレーボックステストは、ブラックボックスとホワイトボックスの中間的アプローチで、バランスの取れた診断が可能です。

項目 ブラックボックス グレーボックス ホワイトボックス
情報開示度 0% 30-70% 100%
診断時間 長い(2-4週間) 中程度(1-2週間) 短い(3-5日)
脆弱性発見率 60% 85% 95%
コスト 高(200万円~) 中(100万円~) 低(50万円~)
必要スキル 高度な攻撃技術 バランス型 コード解析能力
現実性 最も現実的 現実的 理論的

グレーボックステストでは、アプリケーションの基本的なアーキテクチャ情報、使用技術スタック、主要な機能一覧などの限定的な情報を提供します。これにより、効率的な診断が可能になりながら、外部攻撃者視点も維持できます。

静的解析と動的解析の組み合わせ

最も効果的な診断は、静的解析(SAST)と動的解析(DAST)を組み合わせることで実現されます。

SAST(静的アプリケーションセキュリティテスト)

SASTツールは、ソースコードを解析して潜在的な脆弱性を検出します。

# SASTツールが検出する典型的な脆弱なコード例
def vulnerable_function(user_input):
	# 脆弱:文字列連結でSQL構築
	# SASTツールはこのパターンを「高リスク」として検出
	query = "SELECT * FROM users WHERE id = '" + user_input + "'"
	cursor.execute(query)  
	return cursor.fetchall()

# SASTツールが推奨する修正後のコード
def secure_function(user_input):
	# 安全:パラメータ化クエリを使用
	query = "SELECT * FROM users WHERE id = ?"
	cursor.execute(query, (user_input,))
	return cursor.fetchall()

# より複雑な例:SASTが検出する間接的な脆弱性
def indirect_vulnerability(request):
	# ユーザー入力を一時変数に格納
	temp_value = request.GET.get('search')
	# 別の関数でSQL構築(データフロー分析が必要)
	result = build_query(temp_value)
	return execute_query(result)

SASTの主な利点は、開発早期での問題発見、全コードパスの網羅的検査、修正箇所の正確な特定です。

DAST(動的アプリケーションセキュリティテスト)

DASTは実行中のアプリケーションに対して攻撃をシミュレートします。

実行時の振る舞い検証により、実際の動作環境でのみ発生する脆弱性を発見できます。例えば、特定のデータベース設定や、実行時の権限設定に起因する問題などです。

設定ミスの発見では、デフォルト設定のまま運用されているデータベース、エラーメッセージの詳細表示、デバッグモードの有効化などを検出します。

認証・認可の問題検出により、セッション管理の不備、権限昇格の可能性、認証バイパスなど、実際の攻撃シナリオに基づいた脆弱性を発見します。


手動診断の実施手順

手動診断は、自動ツールでは発見困難な複雑な脆弱性を発見するために不可欠です。体系的なアプローチにより、効率的かつ網羅的な診断を実現します。

診断準備フェーズ

適切な準備により、診断の効率と精度が大幅に向上します。

事前情報収集

診断開始前の情報収集は、攻撃対象の理解と効率的な診断計画の立案に重要です。

# 1. 技術スタック調査
# Webサーバー、フレームワーク、CMS等の特定
whatweb https://target.example.com
wappalyzer https://target.example.com

# 2. ディレクトリ構造調査
# 公開されているディレクトリとファイルの列挙
gobuster dir -u https://target.example.com \
	-w /usr/share/wordlists/dirb/common.txt \
	-x php,asp,aspx,jsp,html,js \
	-t 50

# 3. パラメータ収集
# URLパラメータの自動収集
python3 paramspider.py -d target.example.com --level high

# 4. エンドポイント列挙
# 過去のクロール結果から脆弱な可能性のあるURLを抽出
cat urls.txt | waybackurls | grep "=" | sort -u > params.txt

# 5. サブドメイン列挙
# 関連サービスの発見
subfinder -d example.com -o subdomains.txt
amass enum -d example.com

# 6. ポートスキャン(許可がある場合のみ)
nmap -sV -sC -p- target.example.com

収集した情報を基に、SQLインジェクションが発生する可能性の高い箇所を特定し、診断計画を立案します。

手動テストの実施手順

体系的なアプローチにより、効率的に脆弱性を発見します。

Step 1:エントリーポイントの特定

SQLインジェクションは、ユーザー入力がデータベースクエリに影響を与えるすべての箇所で発生する可能性があります。

GETパラメータ
URLに含まれる`?id=1`、`?search=keyword`などのパラメータは、最も一般的な攻撃対象です。まず、各パラメータに単一引用符(')を追加して、エラーメッセージやレスポンスの変化を観察します。`page.php?id=1'`のようにテストし、データベースエラーが表示されれば、SQLインジェクションの可能性が高いです。
POSTデータ
フォーム送信データ、特にログインフォーム、検索フォーム、登録フォームは重要な診断対象です。Burp SuiteやOWASP ZAPのプロキシ機能を使用して、POSTリクエストを傍受・改変し、各フィールドに攻撃ペイロードを挿入します。隠しフィールドも忘れずにテストすることが重要です。
Cookie値
セッションID、ユーザー設定、言語選択などのCookie値も、データベースクエリに使用される可能性があります。特に、ユーザーIDやロール情報を含むCookieは、権限昇格攻撃の標的となりやすいです。Base64エンコードされたCookieもデコードしてテストします。
HTTPヘッダー
User-Agent、Referer、X-Forwarded-For、Accept-Languageなどのヘッダーは、アクセスログやセッション管理で使用されることがあります。これらのヘッダーに攻撃ペイロードを挿入し、遅延型SQLインジェクション(Second-Order SQLi)の可能性も検証します。

Step 2:脆弱性の確認

段階的にペイロードの複雑度を上げながら、脆弱性の存在と影響範囲を確認します。

【基本的なテストペイロード(段階的アプローチ)】

1. エラーベースの検出
   ' 
   " 
   ') 
   ")) 
   
2. 論理演算による検証
   ' OR '1'='1
   ' OR '1'='1' --
   ' OR '1'='1' #
   admin' --
   
3. UNION句による情報取得
   ' UNION SELECT NULL--
   ' UNION SELECT NULL,NULL--
   ' UNION SELECT NULL,NULL,NULL--
   
4. 時間遅延による確認(ブラインドSQLi)
   '; WAITFOR DELAY '00:00:05'--     (SQL Server)
   '; SELECT SLEEP(5)--               (MySQL)
   '; SELECT pg_sleep(5)--            (PostgreSQL)
   
5. エラーベースの情報取得
   ' AND 1=CONVERT(int, @@version)--  (SQL Server)
   ' AND extractvalue(1,concat(0x7e,version()))-- (MySQL)
   
6. ブール演算による確認
   ' AND 1=1--  (真の場合の応答)
   ' AND 1=2--  (偽の場合の応答)
   
7. スタック化クエリ
   '; INSERT INTO logs VALUES('test')--
   '; DROP TABLE test--

各ペイロードをテストする際は、正常な応答との違いを詳細に記録し、脆弱性の種類と影響度を判断します。

診断証跡の記録方法

適切な記録は、再現性の確保と修正確認に不可欠です。

記録項目 内容 重要度 記録例
URL 完全なURLパス 必須 https://example.com/search.php?q=test
パラメータ 脆弱なパラメータ名 必須 q(GETパラメータ)
ペイロード 使用した攻撃文字列 必須 ' OR '1'='1' --
レスポンス エラーメッセージ全文 必須 MySQL Error 1064: You have an error...
スクリーンショット 画面キャプチャ 推奨 error_screenshot_001.png
HTTPリクエスト/レスポンス 完全な通信内容 推奨 request_001.txt
再現手順 詳細なステップ 必須 1.ログイン 2.検索画面へ 3.ペイロード入力
影響範囲 取得可能な情報 必須 全ユーザー情報(10万件)

自動診断ツールの比較と選定

自動診断ツールは、効率的な脆弱性発見に不可欠ですが、適切な選定と設定が重要です。

商用診断ツールTOP5

2025年現在の主要な商用診断ツールの特徴と価格を比較します。

詳細機能比較

製品名 価格(年間) SQLi検出率 誤検知率 特徴 推奨用途
Acunetix $4,500~ 95% 5% 高速スキャン、CI/CD統合、AcuSensor技術 DevOps環境
IBM AppScan $30,000~ 93% 3% エンタープライズ統合、詳細レポート、コンプライアンス対応 大企業
Invicti(旧Netsparker) $5,000~ 94% 2% 自動検証機能、Proof-Based Scanning 中規模組織
Micro Focus WebInspect $25,000~ 92% 4% Fortify連携、コンプライアンステンプレート 規制産業
Burp Suite Pro $449~ 90% 8% 手動テスト併用、拡張機能豊富 セキュリティ専門家

各ツールには特徴があり、組織の規模、技術レベル、予算に応じて選定する必要があります。

Acunetixは、最新のJavaScriptフレームワークやSPAにも対応し、DeepScan技術により複雑なSQLインジェクションも検出可能です。

IBM AppScanは、大規模環境での統合管理に優れ、複数のアプリケーションを一元的に診断・管理できます。

Invictiの自動検証機能は、誤検知を大幅に削減し、開発チームの負担を軽減します。

オープンソース診断ツール

無償で利用可能な高機能ツールも、適切に活用すれば効果的な診断が可能です。

OWASP ZAPの詳細設定

OWASP ZAPは、最も人気のある無料の脆弱性診断ツールです。

# ZAP Python APIを使用した自動診断スクリプト
from zapv2 import ZAPv2
import time

class ZAPScanner:
	def __init__(self, target_url, api_key='your-api-key'):
		self.zap = ZAPv2(apikey=api_key)
		self.target = target_url
		
	def full_scan(self):
		print(f'[*] ターゲット設定: {self.target}')
		
		# スパイダーリング(サイト構造の探索)
		print('[*] スパイダーリング開始...')
		spider_scan_id = self.zap.spider.scan(
			self.target,
			maxchildren='10',  # 各ノードの最大子要素数
			recurse='true',     # 再帰的探索
			subtreeonly='false' # サブツリーのみでなく全体を探索
		)
		
		# スパイダーリング完了待ち
		while int(self.zap.spider.status(spider_scan_id)) < 100:
			print(f'スパイダー進捗: {self.zap.spider.status(spider_scan_id)}%')
			time.sleep(5)
		
		print('[*] スパイダーリング完了')
		
		# アクティブスキャン設定(SQLインジェクション重視)
		print('[*] SQLインジェクションスキャン設定...')
		
		# 攻撃強度を最高に設定
		self.zap.ascan.set_option_attack_strength('HIGH')
		
		# SQLインジェクション関連のスキャナーを有効化
		sql_scanner_ids = [40018, 40019, 40020, 40021, 40022, 40024]
		for scanner_id in sql_scanner_ids:
			self.zap.ascan.enable_scanners(scanner_id)
		
		# ターゲットパラメータを全て注入可能に設定
		self.zap.ascan.set_option_target_params_injectable(31)
		
		# アクティブスキャン開始
		print('[*] アクティブスキャン開始...')
		ascan_id = self.zap.ascan.scan(
			self.target,
			recurse='true',
			inscopeonly='false'
		)
		
		# スキャン完了待ち
		while int(self.zap.ascan.status(ascan_id)) < 100:
			print(f'スキャン進捗: {self.zap.ascan.status(ascan_id)}%')
			time.sleep(10)
		
		print('[*] アクティブスキャン完了')
		
		# 結果の取得と分析
		alerts = self.zap.core.alerts(baseurl=self.target)
		sql_alerts = []
		
		for alert in alerts:
			if 'SQL' in alert['name'].upper():
				sql_alerts.append({
					'リスク': alert['risk'],
					'名称': alert['name'],
					'URL': alert['url'],
					'パラメータ': alert['param'],
					'詳細': alert['description']
				})
		
		return sql_alerts

# 使用例
scanner = ZAPScanner('https://target.example.com')
results = scanner.full_scan()
for result in results:
	print(f"\n[!] SQLインジェクション発見:")
	for key, value in result.items():
		print(f"    {key}: {value}")

sqlmapの高度な使用法

sqlmapは、SQLインジェクションに特化した最も強力な診断ツールです。

# 基本的なスキャン
sqlmap -u "http://target.com/page.php?id=1" --batch --random-agent

# 認証が必要なサイトのスキャン
sqlmap -u "http://target.com/page.php?id=1" \
	--cookie="PHPSESSID=abc123def456" \
	--level=3 \    # テストレベル(1-5、高いほど詳細)
	--risk=3 \     # リスクレベル(1-3、高いほど危険なテスト)
	--threads=10   # 並列処理数

# WAF/IPSバイパステクニック
sqlmap -u "http://target.com/page.php?id=1" \
	--tamper=space2comment,between,charencode \
	--random-agent \
	--delay=2 \
	--timeout=30 \
	--retries=3 \
	--safe-url="http://target.com/" \
	--safe-freq=5

# POSTデータのテスト
sqlmap -u "http://target.com/login.php" \
	--data="username=admin&password=test" \
	--method=POST \
	--level=5 --risk=3

# 特定のデータベースを想定した最適化
sqlmap -u "http://target.com/page.php?id=1" \
	--dbms=MySQL \
	--technique=BEUQ \  # B:Boolean, E:Error, U:Union, Q:Stacked
	--dump-all \        # 全データダンプ(注意:実環境では使用禁止)
	--exclude-sysdbs    # システムDBは除外

# プロキシ経由での診断(Burp Suite連携)
sqlmap -u "http://target.com/page.php?id=1" \
	--proxy="http://127.0.0.1:8080" \
	--force-ssl

ペネトレーションテストとの違い

脆弱性診断とペネトレーションテストは、しばしば混同されますが、目的と手法が異なります。

診断とペンテストの目的の違い

それぞれの目的を明確に理解することで、適切な選択が可能になります。

脆弱性診断の目的

既知の脆弱性発見
OWASP Top 10等の一般的な脆弱性を網羅的にチェックします。SQLインジェクション、XSS、CSRF等の技術的脆弱性を体系的に発見し、リスト化します。主に自動ツールを使用し、効率的に広範囲をカバーします。定期的に実施することで、新たに発生した脆弱性を早期発見できます。
コンプライアンス確認
PCI DSS、ISO 27001、個人情報保護法等の規制要求事項への適合性を確認します。監査証跡として診断レポートを提出し、セキュリティ対策の実施状況を証明します。多くの規制では、定期的な脆弱性診断の実施が義務付けられています。
定期的な健全性確認
月次・四半期での継続的なセキュリティ状態監視を行います。新規リリースや機能追加時の回帰テストとして、既存のセキュリティレベルが維持されているか確認します。セキュリティメトリクスの収集により、改善状況を定量的に把握できます。

ペネトレーションテストの目的

ペネトレーションテストは、より実践的で包括的な評価を行います。

実際の侵入可能性検証では、発見した脆弱性を実際に悪用し、どこまで侵入可能かを検証します。

ビジネスインパクトの評価により、技術的な脆弱性が実際のビジネスにどのような影響を与えるかを明確にします。

複合的な攻撃シナリオの検証では、複数の脆弱性を組み合わせた高度な攻撃を実施し、単体では低リスクな問題が組み合わさることで生じる重大なリスクを発見します。

インシデント対応能力の確認により、攻撃を検知し、対応する組織の能力を評価します。

実施手法と成果物の違い

脆弱性診断とペネトレーションテストの実施方法と成果物には大きな違いがあります。

項目 脆弱性診断 ペネトレーションテスト
実施期間 1-3日 1-4週間
自動化率 80%(ツール中心) 20%(手動中心)
攻撃深度 表層(技術的脆弱性) 深層(ビジネスロジック含む)
スコープ 特定システム 組織全体も対象
報告書 脆弱性リスト形式 シナリオベース、物語形式
修正提案 技術的対策 組織的対策含む
費用 30-100万円 200-1000万円
実施頻度 月次~四半期 年1-2回

診断結果の評価と優先順位付け

発見された脆弱性を適切に評価し、優先順位を付けることで、効率的な対策が可能になります。

CVSS v3.1による重要度評価

CVSS(Common Vulnerability Scoring System)は、脆弱性の深刻度を定量的に評価する業界標準です。

スコア計算方法

# CVSS v3.1 Base Score計算の実装例
class CVSSCalculator:
	def __init__(self):
		# 攻撃元区分(Attack Vector)の値
		self.AV_VALUES = {
			'N': 0.85,  # Network(ネットワーク経由)
			'A': 0.62,  # Adjacent(隣接ネットワーク)
			'L': 0.55,  # Local(ローカル)
			'P': 0.2    # Physical(物理)
		}
		
		# 攻撃条件の複雑さ(Attack Complexity)
		self.AC_VALUES = {
			'L': 0.77,  # Low(低い)
			'H': 0.44   # High(高い)
		}
		
		# 必要な特権レベル(Privileges Required)
		self.PR_VALUES = {
			'N': {'U': 0.85, 'C': 0.85},  # None(不要)
			'L': {'U': 0.62, 'C': 0.68},  # Low(低)
			'H': {'U': 0.27, 'C': 0.5}    # High(高)
		}
		
		# ユーザ関与の必要性(User Interaction)
		self.UI_VALUES = {
			'N': 0.85,  # None(不要)
			'R': 0.62   # Required(必要)
		}
		
		# 影響度(Impact)
		self.IMPACT_VALUES = {
			'N': 0,     # None(なし)
			'L': 0.22,  # Low(低)
			'H': 0.56   # High(高)
		}
	
	def calculate_base_score(self, av, ac, pr, ui, s, c, i, a):
		"""
		CVSS v3.1 Base Score計算
		
		Parameters:
		av: Attack Vector (N/A/L/P)
		ac: Attack Complexity (L/H)
		pr: Privileges Required (N/L/H)
		ui: User Interaction (N/R)
		s: Scope (U/C)
		c: Confidentiality Impact (N/L/H)
		i: Integrity Impact (N/L/H)
		a: Availability Impact (N/L/H)
		"""
		
		# Exploitability計算
		av_value = self.AV_VALUES[av]
		ac_value = self.AC_VALUES[ac]
		pr_value = self.PR_VALUES[pr][s]
		ui_value = self.UI_VALUES[ui]
		
		exploitability = 8.22 * av_value * ac_value * pr_value * ui_value
		
		# Impact計算
		c_value = self.IMPACT_VALUES[c]
		i_value = self.IMPACT_VALUES[i]
		a_value = self.IMPACT_VALUES[a]
		
		isc_base = 1 - ((1 - c_value) * (1 - i_value) * (1 - a_value))
		
		if s == 'U':  # Unchanged
			impact = 6.42 * isc_base
		else:  # Changed
			impact = 7.52 * (isc_base - 0.029) - 3.25 * ((isc_base - 0.02) ** 15)
		
		# Base Score計算
		if impact <= 0:
			return 0
		
		if s == 'U':
			base_score = min(10, exploitability + impact)
		else:
			base_score = min(10, 1.08 * (exploitability + impact))
		
		return round(base_score, 1)
	
	def get_severity(self, score):
		"""重要度レベルの判定"""
		if score == 0:
			return "None"
		elif score < 4.0:
			return "Low"
		elif score < 7.0:
			return "Medium"
		elif score < 9.0:
			return "High"
		else:
			return "Critical"

# SQLインジェクション脆弱性の評価例
calculator = CVSSCalculator()

# 典型的なSQLインジェクション(認証バイパス)のスコア
auth_bypass_score = calculator.calculate_base_score(
	av='N',  # ネットワーク経由で攻撃可能
	ac='L',  # 攻撃の複雑さは低い
	pr='N',  # 権限不要
	ui='N',  # ユーザ操作不要
	s='C',   # スコープ変更(他のコンポーネントに影響)
	c='H',   # 機密性への影響:高
	i='H',   # 完全性への影響:高
	a='H'    # 可用性への影響:高
)

print(f"認証バイパスSQLi: {auth_bypass_score} ({calculator.get_severity(auth_bypass_score)})")

# ブラインドSQLインジェクションのスコア
blind_sqli_score = calculator.calculate_base_score(
	av='N',  # ネットワーク経由
	ac='H',  # 攻撃は複雑(時間がかかる)
	pr='L',  # 低権限が必要
	ui='N',  # ユーザ操作不要
	s='U',   # スコープ変更なし
	c='H',   # 機密性への影響:高
	i='N',   # 完全性への影響:なし(読み取りのみ)
	a='N'    # 可用性への影響:なし
)

print(f"ブラインドSQLi: {blind_sqli_score} ({calculator.get_severity(blind_sqli_score)})")

リスクマトリックスの作成

発見された脆弱性を、ビジネスインパクトを考慮して評価します。

脆弱性タイプ CVSS 悪用難易度 影響度 優先度 対応期限
SQLi(認証バイパス) 9.8 容易(5分) 致命的(全データアクセス) 緊急 24時間以内
SQLi(データ窃取) 7.5 中(30分) 高(顧客情報流出) 高 3日以内
SQLi(ブラインド) 6.5 困難(数時間) 中(限定的情報) 中 1週間以内
SQLi(エラーベース) 5.3 中(1時間) 低(システム情報) 低 1ヶ月以内

修正計画の策定

リスクレベルに応じた段階的な修正計画を立案します。

緊急(24時間以内)
CVSS 9.0以上、または認証バイパス、全データ露出リスクがある脆弱性は即座に対応が必要です。一時的な対策として、該当機能の停止、WAFルール追加、IPアドレス制限などを実施します。その後、根本的な修正としてプレースホルダの実装を行います。
重要(1週間以内)
CVSS 7.0-8.9、個人情報漏洩リスク、限定的な権限昇格が可能な脆弱性が該当します。計画的な修正スケジュールを立て、テスト環境での検証後に本番環境へ適用します。修正期間中は、監視を強化し、異常なアクセスパターンを検知できる体制を整えます。
中(1ヶ月以内)
CVSS 4.0-6.9、限定的な情報露出、条件付き攻撃が可能な脆弱性です。定期メンテナンスのタイミングで修正を実施します。優先順位は、外部公開サービス、認証後のページ、内部システムの順で対応します。
低(計画的対応)
CVSS 4.0未満、理論的脆弱性、影響が極めて限定的な問題です。次期バージョンアップやシステム更新のタイミングで対応します。ただし、複数の低リスク脆弱性が組み合わさることで高リスクになる可能性も考慮します。

外部診断サービスの選び方

専門的な診断サービスを活用することで、高度な脆弱性の発見と適切な対策が可能になります。

診断会社の評価基準

信頼できる診断サービスを選定するための評価ポイントを解説します。

技術力の確認ポイント

【診断会社評価チェックリスト】

□ 診断員の保有資格(3つ以上該当で優良)
  ✓ CEH(Certified Ethical Hacker)
  ✓ OSCP(Offensive Security Certified Professional)  
  ✓ GWAPT(GIAC Web Application Penetration Tester)
  ✓ 情報処理安全確保支援士(登録セキスペ)
  ✓ CISSP(Certified Information Systems Security Professional)
  
□ 診断実績(2つ以上該当で信頼可)
  ✓ 年間診断件数:100件以上
  ✓ 業界実績:同業他社での実績3社以上
  ✓ 重大脆弱性の発見実績(CVE登録等)
  ✓ 上場企業での診断実績
  
□ 診断手法(すべて該当が理想)
  ✓ 手動診断の割合:40%以上
  ✓ 使用ツール:商用ツール+独自開発ツール
  ✓ 診断プロセス:OWASP Testing Guide準拠
  ✓ 品質管理:ISO 9001認証取得
  
□ 診断体制(2つ以上該当で適切)
  ✓ 専任診断チーム:5名以上
  ✓ ダブルチェック体制
  ✓ 24時間対応可能(緊急時)
  ✓ 海外拠点との連携

契約時の注意事項

診断サービス契約時に確認すべき重要事項です。

項目 確認内容 推奨条件 注意点
再診断 修正後の確認テスト 1回無料含む 追加は有償が一般的
報告書 詳細度と言語 再現手順付き、日本語 英語版は追加料金の場合あり
サポート期間 質問対応期間 診断後3ヶ月間 メール/電話サポート確認
守秘義務 NDA締結 双方向NDA必須 情報管理体制も確認
損害保険 賠償責任保険 1億円以上加入 診断による障害時の補償
診断環境 本番/検証の選択 検証環境推奨 本番は要事前協議

診断費用の相場

2025年現在の診断サービスの料金相場です。

診断種別料金表

【Webアプリケーション診断】

■ 簡易診断(自動ツール中心、手動10%)
  10画面まで:30-50万円
  50画面まで:100-150万円
  100画面まで:200-300万円
  ※納期:3-5営業日

■ 標準診断(手動30-40%含む)
  10画面まで:50-80万円
  50画面まで:200-300万円
  100画面まで:400-600万円
  ※納期:5-10営業日

■ 詳細診断(手動60%以上、ソースコード解析含む)
  10画面まで:100-150万円
  50画面まで:400-600万円
  100画面まで:800-1,200万円
  ※納期:10-20営業日

【オプションサービス】
- ソースコード診断(SAST):+50-200万円
- 負荷テスト併用:+30-100万円
- 24時間緊急対応:+基本料金の30%
- オンサイト報告会:+10-20万円
- 英語版レポート:+20-50万円

【年間契約割引】
- 四半期診断(年4回):20%割引
- 月次診断(年12回):30%割引
- 包括サポート契約:要個別見積

【中小企業向けパッケージ】
- スタートアップ診断:20万円~
  (5画面、自動ツール中心、簡易レポート)
- ライト診断:50万円~
  (10画面、手動20%、標準レポート)

診断レポートの活用方法

診断結果を効果的に活用することで、組織全体のセキュリティ向上を実現できます。

経営層向けサマリーの作成

技術的な診断結果を、経営判断に活用できる形に変換します。

エグゼクティブサマリー例

## 脆弱性診断結果 エグゼクティブサマリー

### 総合評価:C(要改善)

#### 診断概要
- 診断期間:2025年1月10日~15日
- 対象システム:ECサイト(www.example.com)
- 診断手法:ブラックボックス+自動ツール

#### 発見された脆弱性
| 重要度 | 件数 | 主な内容 |
|--------|------|----------|
| 致命的(Critical) | 2件 | SQLインジェクション(認証バイパス) |
| 重要(High) | 5件 | SQLインジェクション(データ窃取) |
| 中(Medium) | 12件 | 不適切な入力検証 |
| 低(Low) | 23件 | 情報開示、設定不備 |

#### ビジネスリスク評価
**最悪シナリオ**
- 全顧客データ(10万件)の流出
- クレジットカード情報の不正取得
- サービス完全停止

**想定被害額**
- 直接損害:2億円(賠償、対応費用)
- 間接損害:3億円(信用失墜、顧客離れ)
- 合計:5億円

**発生確率**
- 現状維持の場合:1年以内に50%
- 緊急対策実施後:5%以下に低減可能

#### 推奨対策と投資
| 対策レベル | 実施期限 | 費用 | リスク低減効果 |
|------------|----------|------|-----------------|
| 緊急対応 | 1週間以内 | 200万円 | 致命的リスク90%削減 |
| 短期対策 | 1ヶ月以内 | 500万円 | 重要リスク80%削減 |
| 中期改善 | 3ヶ月以内 | 1,000万円 | 全体リスク95%削減 |

#### 投資対効果
- 総投資額:1,700万円
- リスク回避額:5億円
- ROI:2,841%(投資の28倍のリターン)

#### 結論と提言
1. 致命的脆弱性は24時間以内に応急処置必須
2. 1ヶ月以内に主要な脆弱性の修正完了を推奨
3. 四半期ごとの定期診断体制の構築を提案

技術チーム向け詳細情報

開発チームが実際に修正作業を行うための詳細情報を提供します。

脆弱性詳細
CVSS v3.1スコア、CWE分類(CWE-89: SQLインジェクション等)、影響を受けるコンポーネント、攻撃シナリオの詳細、悪用された場合の技術的影響を記載します。各脆弱性について、攻撃の前提条件、必要なアクセスレベル、想定される攻撃者像も明記します。
再現手順
具体的なHTTPリクエスト、使用したツールとコマンド、攻撃ペイロード、期待される応答、実際の応答結果をステップバイステップで記載します。開発者が自身で脆弱性を確認できるよう、詳細かつ明確な手順を提供します。
修正方法
推奨される修正コード例、設定変更の具体的手順、使用すべきセキュリティライブラリ、フレームワークの機能活用方法を提示します。短期的な緩和策と長期的な根本対策の両方を提案し、実装の優先順位も示します。
検証方法
修正が適切に実施されたことを確認するためのテスト手順、使用すべき診断ツール、期待される結果、回帰テストの実施方法を説明します。修正後の再診断で確認すべきポイントも明記します。

継続的な診断体制の構築

一時的な診断だけでなく、継続的なセキュリティ診断体制の構築が重要です。

診断頻度の決定

システムの重要度とリスクレベルに応じた適切な診断頻度を設定します。

システム重要度 診断頻度 診断種別 想定コスト(年間)
ミッションクリティカル 月次 自動+手動(簡易) 600万円
重要システム 四半期 自動+手動(標準) 400万円
一般システム 半期 自動のみ 100万円
開発環境 リリース前 自動(CI/CD統合) 50万円
外部公開API 月次 自動+API特化 300万円

DevSecOpsへの統合

開発プロセスにセキュリティ診断を組み込むことで、脆弱性の早期発見と修正を実現します。

# GitHub Actions での自動セキュリティスキャンパイプライン
name: Security Scan Pipeline

on:
  push:
	branches: [ main, develop ]
  pull_request:
	branches: [ main ]
  schedule:
	- cron: '0 2 * * 1'  # 毎週月曜日午前2時に定期実行

jobs:
  security-scan:
	runs-on: ubuntu-latest
	
	steps:
	- name: Checkout code
	  uses: actions/checkout@v3
	
	- name: Setup Python
	  uses: actions/setup-python@v4
	  with:
		python-version: '3.9'
	
	# 静的解析(SAST)
	- name: Run Bandit (Python Security Linter)
	  run: |
		pip install bandit
		bandit -r . -f json -o bandit-report.json
		
	- name: SonarQube Scan
	  uses: sonarsource/sonarqube-scan-action@master
	  env:
		GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
		SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
	
	# 依存関係チェック
	- name: Dependency Check
	  run: |
		pip install safety
		safety check --json > safety-report.json
		
	# 動的解析(DAST)- ステージング環境に対して
	- name: OWASP ZAP Baseline Scan
	  run: |
		docker run -v $(pwd):/zap/wrk/:rw \
		  -t owasp/zap2docker-stable \
		  zap-baseline.py \
		  -t ${{ secrets.STAGING_URL }} \
		  -J zap-report.json
	
	# SQLインジェクション特化テスト
	- name: SQLMap Security Test
	  if: github.event_name == 'schedule'  # 定期実行時のみ
	  run: |
		docker run --rm \
		  -v $(pwd)/sqlmap-reports:/reports \
		  sqlmap/sqlmap \
		  -u "${{ secrets.STAGING_URL }}/api/search?q=test" \
		  --batch \
		  --level=3 \
		  --risk=1 \
		  --output-dir=/reports
	
	# レポート集約
	- name: Upload Security Reports
	  uses: actions/upload-artifact@v3
	  with:
		name: security-reports
		path: |
		  *-report.json
		  sqlmap-reports/
		retention-days: 30
	
	# 重大な脆弱性が発見された場合はビルドを失敗させる
	- name: Check for Critical Vulnerabilities
	  run: |
		python scripts/check_vulnerabilities.py
		if [ $? -ne 0 ]; then
		  echo "Critical vulnerabilities found!"
		  exit 1
		fi

よくある質問(FAQ)

Q: 脆弱性診断とペネトレーションテストはどちらを実施すべきですか?
A: 目的と予算によって選択が変わります。定期的な健全性確認が目的なら、脆弱性診断を年4回(各30-50万円)実施することで、基本的なセキュリティレベルを維持できます。新サービスのリリース前や、重大な変更を行った後は、ペネトレーションテスト(200-500万円)により実際の侵入可能性を検証することを推奨します。理想的には、四半期ごとの脆弱性診断で継続的な監視を行い、年1回のペネトレーションテストで包括的な評価を実施する組み合わせが効果的です。中小企業の場合は、まず年2回の脆弱性診断から始めることをお勧めします。
Q: 診断で本番環境に影響はありませんか?
A: 適切に実施すれば影響は最小限に抑えられますが、完全にリスクがないわけではありません。事前準備として、診断対象と除外項目を明確に定義し、DoS攻撃系のテストは除外します。診断時間帯を業務影響の少ない夜間や休日に調整し、Rate Limiting(1秒あたり5リクエスト程度)で負荷を制御します。また、診断中はシステム監視を強化し、CPU使用率やメモリ使用率の異常を即座に検知できる体制を整えます。万が一の場合に備え、診断の即時中断手順と緊急連絡先を準備しておくことも重要です。可能であれば、本番環境と同等の検証環境で診断を実施することが理想的です。
Q: 無料ツールだけで十分な診断ができますか?
A: OWASP ZAPやsqlmapなどの優秀な無料ツールを使用すれば、基本的な脆弱性の約70%は発見可能です。特にSQLインジェクションの基本的なパターンは、これらのツールで十分検出できます。しかし、ビジネスロジックの脆弱性、複雑な認証フロー、多段階の攻撃シナリオは、自動ツールでは見逃す可能性が高いです。また、誤検知の判定や、脆弱性の実際の影響度評価には専門知識が必要です。最低限の対策として無料ツールを月次で実行しながら、年1回は専門家による手動診断を含む包括的な診断を受けることで、コストとセキュリティのバランスを取ることができます。
Q: 診断結果の脆弱性をすべて修正する必要がありますか?
A: すべての脆弱性を即座に修正する必要はありませんが、リスクベースでの対応が重要です。CVSS 7.0以上の高・致命的な脆弱性は、ビジネスに重大な影響を与える可能性があるため、優先的に修正すべきです。中程度(CVSS 4.0-6.9)の脆弱性は、外部公開されている機能から順次対応します。低リスク(CVSS 4.0未満)の脆弱性は、次期システム更新時にまとめて対応するなど、計画的に処理します。ただし、複数の低リスク脆弱性が連鎖して高リスクになる可能性もあるため、全体的な視点での評価が必要です。また、コンプライアンス要件がある場合は、リスクレベルに関わらず対応が必要な場合があります。
Q: 診断会社はどのように選べばよいですか?
A: 診断会社の選定では、技術力、実績、サポート体制を総合的に評価します。まず、診断員が CEH、OSCP、情報処理安全確保支援士などの資格を保有しているか確認します。次に、同業他社での診断実績や、年間の診断件数(100件以上が目安)を確認します。手動診断の割合が40%以上であることも重要な指標です。また、診断後のサポート期間(3ヶ月以上推奨)、再診断の無料実施、日本語での詳細レポート提供なども確認ポイントです。価格だけでなく、これらの要素を総合的に判断し、自社のニーズに最も適した診断会社を選定することが重要です。

まとめ

SQLインジェクションの脆弱性診断は、Webアプリケーションセキュリティの要となる重要な対策です。適切な診断により、潜在的なリスクを可視化し、効果的な対策を実施できます。

脆弱性診断実施の重要ポイント:

  1. 診断手法の適切な選択

    • ブラックボックス、ホワイトボックス、グレーボックスの使い分け
    • 静的解析(SAST)と動的解析(DAST)の組み合わせ
    • 自動ツールと手動診断のバランス
  2. 体系的な診断プロセス

    • 事前の情報収集と計画立案
    • 段階的なペイロード投入による確実な検証
    • 詳細な証跡記録と再現手順の文書化
  3. 適切なツールの活用

    • 商用ツール:高い検出率と低い誤検知率
    • オープンソース:OWASP ZAP、sqlmap等の効果的活用
    • 用途に応じた使い分けと組み合わせ
  4. 継続的な診断体制

    • システム重要度に応じた診断頻度の設定
    • DevSecOpsへの統合による早期発見
    • 定期診断による継続的な改善
  5. 診断結果の効果的活用

    • CVSS評価による優先順位付け
    • 経営層向けと技術者向けの適切な報告
    • リスクベースでの修正計画策定

脆弱性診断は一度実施すれば終わりではありません。新たな脅威や攻撃手法が日々発見される中、継続的な診断と改善のサイクルを確立することが、真のセキュリティ確保につながります。

SQLインジェクション対策全体の中で、脆弱性診断は「現状把握」という重要な役割を担います。診断で発見された脆弱性に対して、WAF導入による即座の防御と、プレースホルダ実装による根本的な修正を組み合わせることで、包括的なセキュリティ対策が実現できます。


【重要なお知らせ】

  • 本記事は一般的な情報提供を目的としており、個別の状況に対する助言ではありません
  • 脆弱性診断は必ず対象システムの所有者の許可を得て実施してください
  • 診断ツールの使用は、適切な環境と権限のもとで行ってください
  • 記載内容は作成時点の情報であり、ツールや手法は常に進化しています

更新履歴

初稿公開

京都開発研究所

システム開発/サーバ構築・保守/技術研究

CMSの独自開発および各業務管理システム開発を行っており、 10年以上にわたり自社開発CMSにて作成してきた70,000以上のサイトを 自社で管理するサーバに保守管理する。