SQLインジェクション:仕組みと発生理由
古典的SQLi、ブラインドSQLi、帯域外SQLiと、パラメーター化クエリで防止できる理由を理解します。
「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 --dumpSQLインジェクションの防止: パラメータ化クエリ
主な防御策はパラメータ化クエリ(プリペアドステートメント)です。ユーザー入力はパラメーターとして渡し、クエリ文字列に連結してはいけません。
# 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SQLインジェクション:仕組みと発生理由
- クロスサイトスクリプティング(XSS)
- クロスサイトリクエストフォージェリ(CSRF)
- セキュリティ設定ミスと公開サービス