0Pricing
Cloud & IT Cert Prep · レッスン

SQLインジェクションとコマンドインジェクション

攻撃者がデータベースクエリやOSコマンドを操作するインジェクションペイロードを作成する方法と、パラメーター化クエリや入力検証による防止方法を学びます。

「SQLインジェクションとコマンドインジェクション」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

SQL Injectionとは

SQL injection (SQLi)は、攻撃者が入力フィールドに悪意のあるSQLコードを挿入、つまり「インジェクション」し、その入力が後でデータベースクエリに渡されると発生します。アプリケーションがユーザー入力をSQL文に直接連結するため、データベースは正規のデータと攻撃者が提供したコマンドを区別できません。SQLiは、OWASP Top 10で最も危険なWeb脆弱性の1つとして常に上位に挙げられています。

典型的なSQLiペイロードの例

脆弱なログインクエリは、次のようになります。SELECT * FROM users WHERE username='INPUT' AND password='INPUT'。攻撃者がユーザー名として' OR '1'='1を入力すると、クエリが変形し、WHERE句が常に真になるため、認証が完全に回避されます。これは典型的な恒真式ベースのインジェクションです。

-- Vulnerable query (DO NOT use in production)
SELECT * FROM users
WHERE username = '' OR '1'='1'
  AND password = 'anything';
-- Returns ALL rows — auth bypassed

SQL Injectionの種類

SQL injection攻撃には、いくつかの形式があります。In-band SQLiは、HTTPレスポンスに結果を直接返します(エラーベースまたはユニオンベース)。Blind SQLiは、真偽値のレスポンスや意図的な時間遅延(SLEEP(5))を通じてデータを推測します。Out-of-band SQLiは、レスポンスを確認できない場合に、DNSルックアップなどの二次チャネルを使ってデータを外部に流出させます。

-- Time-based blind SQLi example
SELECT * FROM users
WHERE id = '1' AND SLEEP(5)--';
-- If response is delayed 5s, injection succeeded

SQLiの防止:Parameterized Queries

SQL injectionに対する主要な防御策はParameterized Queries(prepared statementsとも呼ばれます)です。Parameterized Queryでは、まずSQLの構造をコンパイルし、ユーザー入力を別のパラメーターとして渡します。そのため、入力によってクエリの構造が変更されることはありません。この方法は言語に依存せず、入力のサニタイズだけに頼るよりもはるかに信頼性が高くなります。

# Python example — parameterized query (safe)
import sqlite3
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
username = 'admin'
password = 'secret'
cursor.execute(
    'SELECT * FROM users WHERE username=? AND password=?',
    (username, password)  # parameters, never concatenated
)

多層防御としての入力検証

Parameterized Queriesが主要な防御策である一方、入力検証は重要な二次防御層になります。Allowlist検証では、想定される文字だけを受け付けます(たとえば、ユーザー名フィールドでは英数字のみ)。それ以外はすべて拒否します。Denylist検証では既知の危険な文字をブロックしますが、攻撃者はペイロードをエンコードしたり難読化したりしてDenylistを回避することがよくあります。そのため、Allowlistのほうがはるかに強力です。

Command Injectionとは

Command injection(OS command injection)は、アプリケーションがサニタイズされていないユーザー入力をシステムシェルに渡すと発生します。データベースを標的にするSQL injectionとは異なり、Command injectionはオペレーティングシステム自体を標的にします。これにより攻撃者は、Webサーバープロセスの権限で任意のコマンドを実行できるようになります。深刻度はCriticalと評価され、システム全体の侵害につながることがよくあります。

Command Injectionの例

ユーザーが指定したIPアドレスに対してpingを実行するWebアプリは、次のような処理を行うことがあります。ping -c 1 INPUT。攻撃者が8.8.8.8; cat /etc/passwdを入力すると、シェルは;をコマンド区切り文字として解釈し、両方のコマンドを実行します。一般的なインジェクション演算子には、;、&&、||、|、バッククォートによるコマンド置換があります。

# Vulnerable Python (subprocess with shell=True)
import subprocess
user_ip = '8.8.8.8; cat /etc/passwd'  # attacker input
subprocess.run('ping -c 1 ' + user_ip, shell=True)

# Safe alternative — avoid shell=True, pass args as list
subprocess.run(['ping', '-c', '1', '8.8.8.8'])

Command Injectionの防止

Command injectionに対する最も安全な防御策は、ユーザー入力からOSコマンドを呼び出すことを完全に避けることです。同じ目的を達成できるライブラリ関数を使用してください。シェル呼び出しを避けられない場合は、引数をリストとして渡し(連結した文字列は決して使用しないでください)、シェルによる解釈を無効にし、厳格なAllowlistに基づいて入力を検証し、可能な限り最小権限のユーザーアカウントでプロセスを実行してください。

OWASP Top 10におけるインジェクション

OWASP Top 10では、インジェクション(SQL、NoSQL、OS、LDAPインジェクションを含みます)を、最も重大なアプリケーションセキュリティリスクの一つとして挙げています。OWASPは、多層防御のアプローチを推奨しています。具体的には、インタープリターを使用せずに済む安全なAPIを使うこと、サーバー側で肯定的検証(許可リスト)による入力検証を行うこと、インタープリター固有の構文に従って特殊文字をエスケープすること、さらに大量の情報漏えいを防ぐためにLIMITなどのSQL制御を使用することです。

検知:WAFとログ記録

Webアプリケーションファイアウォール(WAF)は、HTTPリクエストをシグネチャパターンと照合することで、一般的なインジェクションペイロードを検知してブロックできます。ただし、WAFはエンコーディングの細工によって回避される可能性があり、安全なコーディングの代わりにはなりません。適切なアプリケーションログ(クエリパラメーター、レスポンスコード、エラーメッセージを記録すること)を残すと、セキュリティチームはインシデントの調査時にインジェクションの試行を特定できます。

インジェクション攻撃がもたらす現実の影響

インジェクション攻撃は、史上最大規模のデータ侵害のいくつかを引き起こしています。2017年のEquifaxの侵害では、Webアプリケーションの脆弱性を通じて1億4,700万件のレコードが漏えいしました。2011年には、Sony PlayStation NetworkへのSQLインジェクション攻撃によって7,700万件のアカウントが侵害されました。これらのインシデントは、インジェクションの脆弱性が極めて大きなビジネス上の影響をもたらすことを示しています。インジェクション攻撃が成功すると、データ窃取、規制当局による罰金、評判の低下、法的責任などが発生します。

クイックチェック

このレッスンで扱ったCompTIA Security+(SY0-701)の概念を理解できているか確認します。

レッスンのまとめ

このレッスンでは、SQLインジェクションは、サニタイズされていない入力をデータベースクエリに連結することで悪用されること、コマンドインジェクションは、;や|などの演算子を介して悪意のある入力をOSシェルに渡すこと、そしてパラメーター化クエリの使用とshell=Trueの回避が主要な防御策であることを学びました。次は、クロスサイトスクリプティング(XSS)とCSRF攻撃について学びます。

よくある質問

「SQLインジェクションとコマンドインジェクション」レッスンは無料ですか?

はい。「SQLインジェクションとコマンドインジェクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

「SQLインジェクションとコマンドインジェクション」で何を学びますか?

攻撃者がデータベースクエリやOSコマンドを操作するインジェクションペイロードを作成する方法と、パラメーター化クエリや入力検証による防止方法を学びます。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cloud & IT Cert Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「SQLインジェクションとコマンドインジェクション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?

はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. SQLインジェクションとコマンドインジェクション
  2. クロスサイトスクリプティング(XSS)とCSRF
  3. 認証の不備と安全でないデシリアライゼーション
  4. セキュアSDLC、SAST、DASTツール
← Cloud & IT Cert Prepに戻る