jpskill.com
🛠️ 開発・MCP コミュニティ

php-file-upload-audit

PHPのWebソースコードにおけるファイルアップロードの脆弱性を診断し、アップロード経路やファイル処理のロジックを分析して、任意ファイルアップロードやパス・トラバーサルなどのリスクを検出するSkill。

📜 元の英語説明(参考)

PHP Web 源码文件上传审计工具。识别上传入口与保存路径、文件名处理与校验逻辑,检测任意文件上传/路径穿越/可执行上传风险,输出可利用性分级、PoC 与修复建议(禁止省略)。

🇯🇵 日本人クリエイター向け解説

一言でいうと

PHPのWebソースコードにおけるファイルアップロードの脆弱性を診断し、アップロード経路やファイル処理のロジックを分析して、任意ファイルアップロードやパス・トラバーサルなどのリスクを検出するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o php-file-upload-audit.zip https://jpskill.com/download/6006.zip && unzip -o php-file-upload-audit.zip && rm php-file-upload-audit.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/6006.zip -OutFile "$d\php-file-upload-audit.zip"; Expand-Archive "$d\php-file-upload-audit.zip" -DestinationPath $d -Force; ri "$d\php-file-upload-audit.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して php-file-upload-audit.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → php-file-upload-audit フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[スキル名] php-file-upload-audit

PHP ファイルアップロード監査(php-file-upload-audit)

統一実行ポリシー(必須)

shared/PHP_AUDIT_EXECUTION_POLICY.md に従う必要があります。

実行時には、「デュアルチャネル + 証拠階層化」ルールを統一的に採用します。

  • 高い再現率チャネル:まず静的な source/sink の初期スクリーニングを行い、HTTP ルートと非ルートエントリ(CLI/cron/queue/include)をカバーします。

  • 高い信頼性チャネル:次に trace/EVID を使用して確認とノイズ除去を行います。

状態判定は、✅確認済み / 🟡高確率 / ⚠️検証待ち / ❌利用不可 / 🔍環境依存 に統一されます。

  • 最小証拠セット(到達可能なコード断片 + 制御可能な手がかり + sink トリガーの手がかり)を満たす場合 => 🟡高確率 とマークできます。

  • 完全な trace + EVID を満たす場合 => ✅確認済み とマークします。

  • 証拠が不十分な場合 => ⚠️検証待ち とマークします。

厳密性の要件は変わりませんが、trace が不完全であることを理由に沈黙してはなりません。疑わしい高リスクと欠落している証拠は引き続き出力する必要があります。

PHP プロジェクトのソースコードを分析し、ファイルアップロードロジック($_FILESmove_uploaded_file など)を特定し、保存ディレクトリとファイル名の処理方法を追跡して、以下を検出します。

  • 任意のファイルアップロード(任意のタイプ/任意の拡張子)

  • パス・トラバーサル(元のファイル名を使用した連結)

  • 実行可能ファイルのアップロード(Web アクセス可能なディレクトリにアップロードされ、実行が制限されていない場合)

  • 上書き/同名衝突のリスク

統一監査基準(必須)

shared/PHP_AUDIT_UNIFIED_STANDARD.md に従う必要があります。

状態の順序は ✅確認済み / 🟡高確率 / ⚠️検証待ち / ❌利用不可 / 🔍環境依存 に固定する必要があります。 trace 証拠の判定は階層的に実行する必要があります。

  • 最小証拠セット(エントリ到達可能 + パラメータ制御可能リンク + sink 実行手がかり + 基本的な前提条件)を満たす場合 => 🟡高確率
  • 完全な証拠セット(trace COMPLETE + EVID アライメント + 分岐カバレッジ)を満たす場合 => ✅確認済み
  • 最小証拠セットを満たさない場合 => ⚠️検証待ち

誤検知抑制は、ハードコードされた上書き、ホワイトリストの有効性、到達不能な分岐、サンドボックス/権限境界をチェックする必要があります。 見落とし抑制は、trace 不完全でも沈黙しない、sink-only フォールバックを実行する必要があります。 出力する最小フィールドには、位置、source->sink、前提条件、状態、PoC、修正を含める必要があります。 実行優先順位は、まず発見、次に文書化に従う必要があります。

証拠信頼度フィールドと再確認チェックリスト(必須)

証拠信頼度フィールド(必須):shared/PHP_AUDIT_UNIFIED_STANDARD.md に従って HIGH/MEDIUM/LOW を出力し、判定根拠(状態と一致)を提示します。 再確認チェックリスト(必須、最低 5 項目):

  • 高い再現率チャネル(フェーズ0)が実行されたか、または sink-only フォールバックが有効化され、非ルートエントリがカバーされているか
  • 同種の拡張チェックが完了しているか(特定のアップロード sink にヒットした後、同種のエントリ/保存カプセル化を横断的にスキャン)
  • 最小証拠セット/完全証拠セットのルールに従って 🟡高確率/✅確認済み/⚠️検証待ち が提示され、欠落点が説明されているか
  • source->sink データフローがファイル名解析/拡張子浄化/保存場所連結/アクセス可能性に明確にリンクされているか
  • 誤検知抑制について、ハードコード/ホワイトリスト/到達不能/権限境界/形式不成立の説明がされているか
  • 実行可能な PoC と代替可能な修正提案(ランダム化戦略/MIME 検証/アクセス面制限/検索特定要点を含む)が提示されているか

分類と番号付け

  • 詳細は shared/SEVERITY_RATING.md を参照してください。

  • 脆弱性番号:{C/H/M/L}-UPLOAD-{連番}

アップロードエントリの識別(必須)

以下を識別します。

  • $_FILES['{value}'] フィールド

  • move_uploaded_file($_FILES['{value}']['tmp_name'], $dest)

  • 保存パスの連結:$uploadDir.$filenamesprintfjoin など

  • 名前変更:uniqid/random_bytes/タイムスタンプ(filename が依然として制御可能な場合は高リスク)

検証ロジックの監査(必須)

各ポイントをチェックし、証拠を出力する必要があります。

  • 拡張子/ホワイトリスト:サフィックスのみを検証しているか(バイパス可能)

  • 拡張子解析の安全性:「二重拡張子/複数ドット拡張子」のバイパス(例:a.php.jpg.pHp の大文字小文字バイパス、末尾の空白/Unicode 区切り文字)が存在しないか

  • MIME/マジックナンバー:finfo_file/mime_content_type/ファイルヘッダー識別を行っているか

  • MIME/マジックナンバーの一貫性:「サーバー側の実際のコンテンツタイプ」と「拡張子/サフィックス」が一致しているか(Content-Type のみを信頼することを避けるため)

  • ファイル名の浄化:パス区切り文字と危険な文字(../\:、ヌルバイトなど)が除去されているか

  • アップロードディレクトリ:Web ルートディレクトリにあるか、実行権限が制御されているか

  • 書き込み後のアクセス可能性チェーン:アップロードディレクトリの静的マッピング/直接リンクアクセスが存在するか(ルーティングまたは Web サーバーの設定証拠と組み合わせる必要があります)

  • 認証:アップロードインターフェースが保護されているか

tracer トリガー条件(必須)

  • 保存パスまたはファイル名が多層のラッパー関数を経由している場合

  • 検証ロジックに分岐があり、すべてのアップロードパスに適用されることを確認するのが難しい場合

レポート出力

以下に出力します。

{output_path}/vuln_audit/upload_{timestamp}.md

脆弱性項目テンプレート(必須)

以下を含める必要があります。

  • 位置証拠(保存/検証関数の位置)

  • データフローチェーン(filename/path ソース -> 検証 -> ターゲットパス -> 書き込み)

  • 証拠参照(php-route-tracer 出力からの引用、各項目を引用する必要があります):trace の ## 9) Sink Evidence Type Checklist(UPLOAD 行)の証拠要点に対応し、引用する必要があります。

    • EVID_UPLOAD_DESTPATH:destPath(保存ディレクトリの最終的な保存場所)

    • EVID_UPLOAD_FILENAME_EXTENSION_PARSING_SANITIZE:file name/extension parsing & sanitization(ファイル名/拡張子の解析と浄化ロジック)

    • EVID_UPLOAD_ACCESSIBILITY_PROOF:アクセス可能性の証拠(書き込み後にアクセス可能な面が形成されるか:静的直接リンク証拠/マッピング証拠)

    • EVID_UPLOAD_EXEC_DISABLE_STRATEGY:実行無効化戦略の証拠(サーバー側の実行無効化戦略、もしあれば)

  • 利用可能な前提条件(認証/ディレクトリのアクセス可能性/バイパス条件)

  • 検証 PoC(実際のアップロードルートを含み、必要な multipart リクエスト構造を提示)

  • 修正提案(ホワイトリスト + マジックナンバー検証 + ディレクトリ隔離 + ファイル名のランダム化 + 上書きポリシー + Web サーバーの実行無効化要点)

tracer 証拠欠落処理(必須、統一基準に従う)

  • trace の ## 9) Sink Evidence Type Checklist(UPLOAD 行)に上記の主要な証拠要点が欠落している場合:
    • 最小証拠セットを満たす(到達可能性 + パラメータ制御可能性の手がかり + Sink 実行の手がかり + 基本的な前提条件):🟡高確率 とマークでき、レポートに欠落している EVID ポイントと補完提案を明記します。
    • 最小証拠セットを満たさない⚠️検証待ち としかマークできません(直接 ✅確認済み利用可能 とはできません)。
    • 完全な証拠セットを満たす(すべての EVID が一致 + 完全な trace + 分岐カバレッジ):✅確認済み利用可能 とマークできます。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PHP 文件上传审计(php-file-upload-audit)

统一执行策略(强制)

必须遵循:shared/PHP_AUDIT_EXECUTION_POLICY.md

执行时统一采用“双通道 + 证据分层”规则:

  • 高召回通道:先做静态 source/sink 初筛,覆盖 HTTP 路由与非路由入口(CLI/cron/queue/include)

  • 高置信通道:再用 trace/EVID 做确认与降噪

状态判定统一为:✅已确认 / 🟡高概率 / ⚠️待验证 / ❌不可利用 / 🔍环境依赖

  • 满足最小证据集(可达片段 + 可控线索 + sink 触发线索)=> 可标记 🟡高概率

  • 满足完整 trace + EVID => 标记 ✅已确认

  • 证据不足 => 标记 ⚠️待验证

严谨性要求保持不变,但不得因 trace 不完整而沉默:仍需输出疑似高危与缺失证据。

分析 PHP 项目源码,识别文件上传逻辑:$_FILESmove_uploaded_file 等,追踪保存目录与文件名处理方式,检测:

  • 任意文件上传(任意类型/任意扩展名)

  • 路径穿越(使用原始文件名拼接)

  • 可执行文件上传(上传到 Web 可访问目录且未限制执行)

  • 覆盖/同名冲突风险

统一审计标准(强制)

必须遵循:shared/PHP_AUDIT_UNIFIED_STANDARD.md

状态顺序必须固定为:✅已确认 / 🟡高概率 / ⚠️待验证 / ❌不可利用 / 🔍环境依赖。 trace 证据判定必须分层执行:

  • 满足最小证据集(入口可达 + 参数可控链路 + sink 执行线索 + 基本前置条件)=> 🟡高概率
  • 满足完整证据集(trace COMPLETE + EVID 对齐 + 分支覆盖)=> ✅已确认
  • 不满足最小证据集 => ⚠️待验证

误报抑制必须检查:硬编码覆盖、白名单生效、不可达分支、沙箱/权限边界。 漏报抑制必须执行:trace 不全不沉默、sink-only 回退。 输出最小字段必须包含:位置、source->sink、前置条件、状态、PoC、修复。 执行优先级必须遵循:先发现、后文档。

证据置信度字段与复核清单(强制)

证据置信度字段(强制):按 shared/PHP_AUDIT_UNIFIED_STANDARD.md 输出 HIGH/MEDIUM/LOW,并给出判定依据(与状态一致)。 复核清单(强制,至少 5 项):

  • 是否已执行高召回通道(阶段0)或已启用 sink-only 回退,并覆盖非路由入口
  • 是否完成同类扩展检查(命中某类 upload sink 后横向扫同类入口/保存封装)
  • 是否按最小证据集/完整证据集规则给出 🟡高概率/✅已确认/⚠️待验证,并说明缺失点
  • 是否明确 source->sink 数据流链到文件名解析/扩展名净化/落点拼接/访问可达性
  • 是否对误报抑制做了硬编码/白名单/不可达/权限边界/格式不成立说明
  • 是否给出可执行 PoC 与可替换修复建议(含随机化策略/MIME 校验/访问面限制/搜索定位要点)

分级与编号

  • 详见:shared/SEVERITY_RATING.md

  • 漏洞编号:{C/H/M/L}-UPLOAD-{序号}

上传入口识别(必做)

识别:

  • $_FILES['{value}'] 字段

  • move_uploaded_file($_FILES['{value}']['tmp_name'], $dest)

  • 保存路径拼接:$uploadDir.$filenamesprintfjoin

  • 重命名:uniqid/random_bytes/时间戳(若仍可控 filename 仍高危)

校验逻辑审计(必做)

必须逐点检查并输出证据:

  • 扩展名/白名单:是否只校验后缀(可绕过)

  • 扩展名解析安全:是否存在“双后缀/多点后缀”绕过(如 a.php.jpg.pHp 大小写绕过、尾部空白/Unicode 分隔符)

  • MIME/魔数:是否做 finfo_file/mime_content_type/文件头识别

  • MIME/魔数一致性:是否检查“服务端实际内容类型”与“扩展名/后缀”是否一致(避免仅信任 Content-Type

  • 文件名净化:是否去除路径分隔符与危险字符(../\:、空字节等)

  • 上传目录:是否在 Web 根目录;是否有执行权限控制

  • 写入后可访问性链:是否存在上传目录的静态映射/直链访问(需要结合路由或 webserver 配置证据)

  • 鉴权:上传接口是否受保护

tracer 触发条件(必做)

  • 保存路径或文件名经过多层封装函数

  • 校验逻辑存在分支,难以确认对所有上传路径生效

报告输出

输出到:






{output_path}/vuln_audit/upload_{timestamp}.md




漏洞条目模板(强制)

必须包含:

  • 位置证据(保存/校验函数位置)

  • 数据流链(filename/path 来源 -> 校验 -> 目标路径 -> 写入)

  • 证据引用(来自 php-route-tracer 输出,必须逐项引用):必须对应并引用 trace 的 ## 9) Sink Evidence Type Checklist(UPLOAD 行)中的证据要点

    • EVID_UPLOAD_DESTPATH:destPath(保存目录最终落点)

    • EVID_UPLOAD_FILENAME_EXTENSION_PARSING_SANITIZE:file name/extension parsing & sanitization(文件名/扩展名解析与净化逻辑)

    • EVID_UPLOAD_ACCESSIBILITY_PROOF:可访问面证据(写入后是否形成可访问面:静态直连证据/映射证据)

    • EVID_UPLOAD_EXEC_DISABLE_STRATEGY:执行禁用策略证据(服务端执行禁用策略,如有)

  • 可利用前置条件(鉴权/目录可访问性/绕过条件)

  • 验证 PoC(包含真实上传路由,给出必要的 multipart 请求结构)

  • 修复建议(白名单 + 魔数校验 + 目录隔离 + 随机化文件名 + 覆盖策略 + Webserver 执行禁用要点)

tracer 证据缺失处理(强制,遵循统一标准)

  • 若 trace 的 ## 9) Sink Evidence Type Checklist(UPLOAD 行)中上述关键证据要点缺失:
    • 满足最小证据集(可达性 + 参数可控性线索 + Sink 执行线索 + 基本前置条件):可标记为 🟡高概率,在报告中注明缺失的 EVID 点与补全建议。
    • 不满足最小证据集:只能标记为 ⚠️待验证(不得直接给出 ✅已确认可利用)。
    • 满足完整证据集(全部 EVID 对齐 + 完整 trace + 分支覆盖):可标记为 ✅已确认可利用