flawopen.com/command-injection/Php

● CWE-918 · 緊急
セキュリティ研究 · FlawOpen

脆弱性の解説:Command Injection in PHP

Learn how to fix Command Injection (CWE-78) in PHP. Side-by-side vulnerable vs secure code examples for proc_open(), escapeshellarg(), and shell_exec hazards.

💡 わかりやすい解説 (ELI5)

オフィスのアシスタントに「report.pdf」という書類の印刷を頼む場面を想像してください。攻撃者が「report.pdf; whoami」というファイル名を渡すと、アシスタントはそのメモ全体をそのまま端末の窓口に提出してしまい、書類の印刷に加えて管理者バッジの読み取りまで実行してしまいます。

主要な概念と専門用語

Web Application Security
主要概念 (Web Application Security):Core architecture component affected by CWE-918.
CWE-918
主要概念 (CWE-918):Standard Common Weakness Enumeration classification for command-injection-php.
Defense-in-Depth
主要概念 (Defense-in-Depth):Multi-layered engineering verification and runtime boundary isolation.

ステップ・バイ・ステップの攻撃フロー

Step 1

信頼できない入力の受信

アプリケーションがHTTPリクエストから診断用ホスト名やファイル名などの入力を直接受け取ります。

Step 2

シェルコマンド文字列の安全でない連結

バックエンドが引数リストを使わず、生文字列の結合によってシェルコマンドを構築します。

Step 3

コマンド区切り文字の挿入

攻撃者が ';' や '&&'、'|'、バッククォートなどのメタ文字(例: '127.0.0.1; id')を挿入して構文を脱出します。

Step 4

サブシェルでの実行とホスト侵害

OSシェルがWebサーバー権限で追加されたコマンドを実行し、任意のリモートコード実行に至ります。

ソースコード比較:脆弱 vs 堅牢化

✕ 脆弱な実装
<?php
// shell_exec with string concatenation
$ip = $_GET['ip'];
// Attacker input: "127.0.0.1 && cat /etc/shadow"
$output = shell_exec("ping -c 1 " . $ip);
echo $output;
?>
✓ 堅牢化されたセキュアパッチ
<?php
// escapeshellarg escapes quotes and metacharacters
$ip = $_GET['ip'];

// Validate format first
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
    die("Invalid IP address");
}

// Ensure argument is escaped and isolated
$safe_ip = escapeshellarg($ip);
$output = shell_exec("ping -c 1 " . $safe_ip);
echo htmlspecialchars($output);
?>

エンジニアリング&システム堅牢化チェックリスト

References