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

php-expr-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-expr-audit.zip https://jpskill.com/download/6004.zip && unzip -o php-expr-audit.zip && rm php-expr-audit.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/6004.zip -OutFile "$d\php-expr-audit.zip"; Expand-Archive "$d\php-expr-audit.zip" -DestinationPath $d -Force; ri "$d\php-expr-audit.zip"

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

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して php-expr-audit.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → php-expr-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 表达式注入(非テンプレート)監査(php-expr-audit)

PHP プロジェクトのソースコードを分析し、「式評価/コンパイル」のエントリポイントを特定します。ユーザーが制御可能な式文字列が式エンジン(または PHP 言語レベルのコード実行関数)に渡され、条件判断、ルーティング決定、権限式を変更したり、機密性の高いセマンティクスを実行したりする可能性があります(式インジェクション/コードインジェクションの類)。

分類と番号付け

  • 詳細については、shared/SEVERITY_RATING.md を参照してください。
  • 脆弱性番号:{C/H/M/L}-EXPR-{連番}

EXPR Sink(必須)

式エンジンの評価/コンパイルのエントリポイント(優先)と、PHP 言語レベルの「文字列がコード」である実行関数を特定します。

  • ExpressionLanguage->evaluate({value})
  • ExpressionLanguage->compile({value}) の後の実行/評価の使用箇所
  • eval($code)$code がユーザーによって制御可能な場合)
  • assert($assertion)$assertion が文字列で、ユーザーによって制御可能な場合)
  • preg_replace({value}, $replacement, {value}) で非推奨の /e 修飾子を使用する場合(replacement が制御可能な場合)
  • および同等の「式解析/評価」エンジン(プロジェクトでカプセル化された evaluate/parse/compile メソッドで、最終的に式文字列を入力として受け取るもの)

必須検査証拠点(必須、trace 契約の整合性)

各 EXPR 疑わしい脆弱性について、php-route-tracer トレースの ## 9) Sink Evidence Type ChecklistEXPR 行に対応する証拠点 ID を項目ごとに引用する必要があります。

  1. EVID_EXPR_EVAL_ENTRY:式解析/コンパイル/評価のエントリポイント位置の証拠
  2. EVID_EXPR_EXPR_CONTROL:式文字列がユーザー制御可能な入力からのものであるかどうかのマッピング証拠
  3. EVID_EXPR_EXEC_CHAIN_ENTRY:式評価チェーンのその後の使用証拠(評価結果がどのように機密性の高いセマンティクス/セキュリティ上重要な分岐に入るか、または最終的な実行点)

制御可能性と注入セマンティクスの確認(必須)

以下を出力し、判断する必要があります。

  • 式文字列の出所:リクエストフィールド/JSON フィールド/パラメータ連結後、式入力として使用されるか
  • ホワイトリスト/サンドボックスの存在:関数、変数、定数、型が制限されているか。式構文が拒否または置換されているか
  • 「評価結果がセキュリティ上重要なロジックに入る」ことの存在:例えば、if/フィルタリング条件、権限判定、テンプレート外の式実行など
  • 分岐の回避の存在:特定の分岐で式が制限されていない、または一部の入力のみがサニタイズされているか

tracer トリガー条件(必須)

以下のいずれかの条件が満たされた場合、php-route-tracer(または同等の深度追跡)をトリガーします。

  • 式文字列が多層の関数/JSON デコード/連結を経てから evaluate/compile に入る場合
  • 式エンジンの評価結果がセキュリティ上重要な条件または機密性の高い操作に関与する場合(トレースで追跡できる必要があります)
  • 式制限ロジックに条件分岐が存在する場合(特定の分岐で制限がない、または制限が回避可能である場合)

レポート出力

以下に出力します。

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

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

各 EXPR 注入脆弱性には、以下の構造を含める必要があります。

### [{等級プレフィックス}-EXPR-{連番}] 表达式注入漏洞(非テンプレート)

| 項目 | 情報 |
|------|------|
| 深刻度 | {🔴/🟠/🟡/🔵} (CVSS {score}) |
| 到達可能性 (R) | {0-3} - {理由} |
| 影響範囲 (I) | {0-3} - {理由} |
| 悪用複雑度 (C) | {0-3} - {理由} |
| 悪用可能性 | ✅ 確認済み / ⚠️ 検証待ち / ❌ 悪用不可 / 🔍 環境依存 |
| 位置 | {file}:{line} ({Function}) |

#### データフローチェーン(Source → Sink)
(ルートごとに一行ずつ記述:入力読み取り -> 式文字列構築 -> evaluate/compile エントリ -> 評価結果が機密性の高いセマンティクスに入る、省略禁止)

#### 悪用可能な前提条件
- 認証要件:{不要/ログイン必要/特定権限必要}
- 入力制御可能性:{完全に制御可能/条件付きで制御可能/制御不可}
- トリガー条件:{分岐/例外/環境依存}
- サンドボックス/ホワイトリストの信頼性:{信頼できる保護あり/保護欠如/保護回避可能}

#### 証拠引用(必須:php-route-tracer から)
- `EVID_EXPR_EVAL_ENTRY`:{対応する証拠要点の要約}
- `EVID_EXPR_EXPR_CONTROL`:{対応する証拠要点の要約}
- `EVID_EXPR_EXEC_CHAIN_ENTRY`:{対応する証拠要点の要約}

#### 検証 PoC(必須:実行可能なリクエストを提示)
```http
{HTTP Method} {実際のルートと完全なパラメータ} HTTP/1.1
Host: {host}
{必要な Cookie/Auth}

{Payload}

PoC 生成戦略(明確に記述する必要があります):

  • ステップ 1:”プローブペイロード”を使用して、式が実際に評価されることを証明します(例:算術結果、条件分岐結果の変化、戻り値の差異)。
  • ステップ 2:プローブが成功した後、”注入ペイロード”を構築して、セキュリティ上重要なセマンティクスを変更できることを証明します(例:フィルタリングの回避/権限判断結果の変更)。具体的なエンジン関数のホワイトリストに依存する必要がある場合は、🔍環境依存/⚠️検証待ち とマークしますが、実行可能な試行方法も提示します。

推奨される修正

  • ユーザー入力を直接式文字列として evaluate/compile に渡すことを禁止します。
  • 厳格なアローリストを使用します:固定の式テンプレート + パラメータプレースホルダーのみを許可し(パラメータの型/範囲検証も行います)。
  • 式エンジンにサンドボックスポリシーを有効にします:関数/変数/アクセス範囲を制限し、危険な操作を無効にします(エンジンがサポートしている場合)。
  • 式構文に対して拒否ポリシー(例:制御文字の注入を拒否)を適用し、拒否点の位置を説明します。
  • すべての evaluate/compile エントリと式文字列構築点を特定するためのコード検索ステートメント(rg)を提示します。

tracer 証拠欠如の処理(必須)

  • trace 契約の EXPR 行において、いずれかの重要な証拠点(EVID_EXPR_EVAL_ENTRY / EVID_EXPR_EXPR_CONTROL / EVID_EXPR_EXEC_CHAIN_ENTRY)が欠如しているか、この脆弱性に対応できない場合:ステータスは ⚠️検証待ち とマークされるだけであり、直接 ✅悪用可能と確認済み とすることはできません。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PHP 表达式注入(非模板)审计(php-expr-audit)

分析 PHP 项目源码,识别“表达式求值/编译”入口点:用户可控表达式字符串被传入表达式引擎(或 PHP 语言级代码执行函数),从而改变条件判断、路由决策、权限表达式或执行敏感语义(Expression Injection/代码注入类)。

分级与编号

  • 详见:shared/SEVERITY_RATING.md
  • 漏洞编号:{C/H/M/L}-EXPR-{序号}

EXPR Sink(必做)

识别表达式引擎的求值/编译入口点(优先),以及 PHP 语言级“字符串即代码”的执行函数:

  • ExpressionLanguage->evaluate({value})
  • ExpressionLanguage->compile({value}) 后续的执行/求值使用点
  • eval($code)(当 $code 可由用户控制时)
  • assert($assertion)(当 $assertion 为字符串且可由用户控制时)
  • preg_replace({value}, $replacement, {value}) 中使用 deprecated 的 /e 修饰符(当 replacement 可控时)
  • 以及等价的“表达式解析/求值”引擎(项目封装的 evaluate/parse/compile 方法,只要最终把表达式字符串作为输入)

必检证据点(必做,trace 契约对齐)

每条 EXPR 疑似漏洞必须逐项引用 php-route-tracer trace 中 ## 9) Sink Evidence Type ChecklistEXPR 行对应证据点 ID:

  1. EVID_EXPR_EVAL_ENTRY:表达式解析/编译/求值入口点位置证据
  2. EVID_EXPR_EXPR_CONTROL:表达式字符串是否来自用户可控输入的映射证据
  3. EVID_EXPR_EXEC_CHAIN_ENTRY:表达式求值链的后续使用证据(求值结果如何进入敏感语义/安全关键分支,或最终执行点)

可控性与注入语义确认(必做)

必须输出并判断:

  • 表达式字符串从哪里来:请求字段/JSON 字段/参数拼接后作为表达式输入
  • 是否存在白名单/沙箱:是否限制函数、变量、常量、类型;是否对表达式语法进行拒绝或替换
  • 是否存在“求值结果进入安全关键逻辑”:例如进入 if/过滤条件、权限判定、模板外表达式执行等
  • 是否存在分支绕过:某些分支对表达式不做限制、或仅对部分输入做净化

tracer 触发条件(必做)

当满足任一条件时触发 php-route-tracer(或同等深度追踪):

  • 表达式字符串经过多层函数/JSON 解码/拼接后才进入 evaluate/compile
  • 表达式引擎求值结果参与安全关键条件或敏感操作(必须能在 trace 中追踪)
  • 表达式限制逻辑存在条件分支(某些分支没限制、或限制可被绕过)

报告输出

输出到:

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

漏洞条目模板(强制)

每条 EXPR 注入漏洞必须包含以下结构:

### [{等级前缀}-EXPR-{序号}] 表达式注入漏洞(非模板)

| 项目 | 信息 |
|------|------|
| 严重等级 | {🔴/🟠/🟡/🔵} (CVSS {score}) |
| 可达性 (R) | {0-3} - {理由} |
| 影响范围 (I) | {0-3} - {理由} |
| 利用复杂度 (C) | {0-3} - {理由} |
| 可利用性 | ✅ 已确认 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖 |
| 位置 | {file}:{line} ({Function}) |

#### 数据流链(Source → Sink)
(按路由逐行写出:输入读取 -> 表达式字符串构造 -> evaluate/compile 入口 -> 求值结果进入敏感语义,禁止省略)

#### 可利用前置条件
- 鉴权要求:{无需/需登录/需特定权限}
- 输入可控性:{完全可控/条件可控/不可控}
- 触发条件:{分支/异常/环境依赖}
- 沙箱/白名单可靠性:{已可靠防护/防护缺失/防护可绕过}

#### 证据引用(强制:来自 php-route-tracer)
- `EVID_EXPR_EVAL_ENTRY`:{对应证据要点简述}
- `EVID_EXPR_EXPR_CONTROL`:{对应证据要点简述}
- `EVID_EXPR_EXEC_CHAIN_ENTRY`:{对应证据要点简述}

#### 验证 PoC(强制:给出可执行请求)
```http
{HTTP Method} {真实路由与完整参数} HTTP/1.1
Host: {host}
{必要 Cookie/Auth}

{Payload}

PoC 生成策略(必须写清楚):

  • 第一步:使用“探测 payload”证明表达式确实被求值(例如算术结果、条件分支结果变化、返回值差异)
  • 第二步:在探测成立后,构造“注入 payload”证明可改变安全关键语义(如绕过过滤/更改权限判断结果),若必须依赖具体引擎函数白名单,则标注为 🔍环境依赖/⚠️待验证,但仍给出可落地尝试方式

建议修复

  • 禁止将用户输入直接作为表达式字符串传入 evaluate/compile
  • 使用严格 allowlist:仅允许固定表达式模板 + 参数占位符(并对参数做类型/范围校验)
  • 为表达式引擎启用沙箱策略:限制函数/变量/访问范围;禁用危险操作(若引擎支持)
  • 对表达式语法做拒绝策略(例如拒绝注入控制字符)并说明拒绝点位置
  • 给出代码搜索语句(rg)定位所有 evaluate/compile 入口与表达式字符串构造点

tracer 证据缺失处理(强制)

  • 若 trace 契约的 EXPR 行中任一关键证据点(EVID_EXPR_EVAL_ENTRY / EVID_EXPR_EXPR_CONTROL / EVID_EXPR_EXEC_CHAIN_ENTRY)缺失或无法对应到本条漏洞:状态只能标记为 ⚠️待验证,不得直接给出 ✅已确认可利用