Cyber Security Academy · レッスン

SQLインジェクション:仕組みと発生理由

古典的SQLi、ブラインドSQLi、帯域外SQLiと、パラメーター化クエリで防止できる理由を理解します。

レッスン 1/413 ステップ

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

SQLインジェクションとは

SQLインジェクション(SQLi)は、ユーザー入力が適切にサニタイズされずにSQLクエリへ含まれることで発生し、攻撃者がクエリのロジックを操作できるようになります。これは最も古く、最も被害の大きいWeb脆弱性の一つです。

SQLインジェクションの仕組み

ログインフォームは次のクエリを実行します。SELECT * FROM users WHERE username='INPUT' AND password='INPUT'

攻撃者がユーザー名として' OR 1=1--を入力すると、クエリは次のようになります。SELECT * FROM users WHERE username='' OR 1=1--' AND password='...' — これにより、すべてのユーザーが返されます。

SQLインジェクションの種類

SQLiの種類:

  • インバンド: 結果がレスポンスに直接返されます(クラシック型、エラーベース)
  • ブラインドBoolean: 直接的な出力はなく、真偽のレスポンスからデータを推測します
  • ブラインド時間ベース: レスポンスの遅延からデータを推測します(SLEEP(5))
  • アウトオブバンド: DNSやHTTPリクエストを介してデータを窃取します

UNIONベースのインジェクション

UNION攻撃では、攻撃者が制御するクエリの結果を追加します。

-- Discover number of columns:
id=1 ORDER BY 3--
-- Extract data:
id=1 UNION SELECT username,password,NULL FROM users--

エラーベースのインジェクション

エラーメッセージからデータベースの構造が漏えいします。攻撃者が構文エラーを引き起こすデータを入力すると、そのエラーメッセージからテーブル名、カラム名、データベースのバージョンなどが漏れます。本番環境では詳細なエラーメッセージを無効にしてください。

ブラインドSQLインジェクション

目に見える出力がない場合、攻撃者は真偽条件を使用します。

-- If admin exists, page loads normally:
id=1 AND (SELECT COUNT(*) FROM users WHERE username='admin')=1--
-- Time-based:
id=1; IF(1=1) WAITFOR DELAY '0:0:5'--

sqlmap: SQLインジェクションの自動化

sqlmapはSQLインジェクションの検出と悪用を自動化します。データベースのダンプ、ファイルの読み取り、さらにDBユーザーに十分な権限があればOSコマンドの実行まで可能です。

sqlmap -u "http://target.com/page?id=1" --dbs
sqlmap -u "http://target.com/page?id=1" -D webapp -T users --dump

SQLインジェクションの防止: パラメータ化クエリ

主な防御策はパラメータ化クエリ(プリペアドステートメント)です。ユーザー入力はパラメーターとして渡し、クエリ文字列に連結してはいけません。

# Python (safe):
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
# Node.js (safe):
pool.query("SELECT * FROM users WHERE id = $1", [userId])

ORMによる保護

ORM(SQLAlchemy、Hibernate、Sequelize)を使用すると、安全な抽象化を通じてクエリが構築されるため、通常はSQLインジェクションを防止できます。ただし、文字列補間を使ったrawクエリメソッド(execute()、query())ではORMの保護を回避してしまいます。

入力検証とWAF

追加の防御策:

  • 入力の種類(整数、メールアドレスなど)を検証し、許可リストで制限する
  • インジェクションパターンを検出するWeb Application Firewall(WAF)
  • 最小権限のDBアカウント(読み取り専用クエリではDROPやUNIONを許可しない)
  • ストアドプロシージャ(攻撃対象を減らしますが、完全な解決策ではありません)

SQLインジェクションの影響

SQLインジェクションに成功すると、データベース全体のダンプ、認証のバイパス、データの変更や削除、サーバーファイルの読み取り(LOAD_FILE)、Webシェルの書き込み、xp_cmdshell(MSSQL)によるOSコマンドの実行などにつながる可能性があります。

理解度チェック:SQLインジェクション

SQLインジェクションに対する主な防御策は何ですか?

レッスンのまとめ

SQLインジェクションは、サニタイズされていないユーザー入力を介してデータベースクエリを操作します。攻撃の種類には、クラシック型、ブラインドBoolean型、時間ベース型、UNIONベース型があります。主な防御策はパラメータ化クエリです。ユーザー入力をSQLに連結することは決して避けてください。ORMは慎重に使用し、最小権限のDBアカウントを適用し、詳細なエラーメッセージを無効にしてください。

無料で開始

AI チューターと学ぶ Cyber Security Academy — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
76
レッスン
303

よくある質問

「SQLインジェクション:仕組みと発生理由」レッスンは無料ですか?

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

「SQLインジェクション:仕組みと発生理由」で何を学びますか?

古典的SQLi、ブラインドSQLi、帯域外SQLiと、パラメーター化クエリで防止できる理由を理解します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cyber Security Academyを始めるのに経験は必要ですか?

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

「SQLインジェクション:仕組みと発生理由」レッスンにはどのくらい時間がかかりますか?

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

このCyber Security Academyレッスンでコードを書いて実行できますか?

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

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

  1. SQLインジェクション:仕組みと発生理由
  2. クロスサイトスクリプティング(XSS)
  3. クロスサイトリクエストフォージェリ(CSRF)
  4. セキュリティ設定ミスと公開サービス
← Cyber Security Academyに戻る