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

php-ldap-audit

PHP WebソースコードにおけるLDAP注入を監査し、ユーザーが制御可能なデータがLDAPフィルターやDNの構築に利用され、ldap_searchやldap_readによって実行される脆弱性を特定し、その悪用可能性の評価、PoC、および修正提案を提供するSkill。

📜 元の英語説明(参考)

PHP Web 源码 LDAP 注入审计工具。识别用户可控数据进入 LDAP filter/DN 构造并被 ldap_search/ldap_read 执行,输出可利用性分级、PoC 与修复建议(禁止省略)。

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

一言でいうと

PHP WebソースコードにおけるLDAP注入を監査し、ユーザーが制御可能なデータがLDAPフィルターやDNの構築に利用され、ldap_searchやldap_readによって実行される脆弱性を特定し、その悪用可能性の評価、PoC、および修正提案を提供するSkill。

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

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

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

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

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

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して php-ldap-audit.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → php-ldap-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 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[Skill 名] php-ldap-audit

PHP LDAP インジェクション監査(php-ldap-audit)

PHP プロジェクトのソースコードを分析し、LDAP クエリ関連コード(filter/DN 構築)を特定して、LDAP インジェクションのリスクを検出します。攻撃者は filter または DN フラグメントを制御することで LDAP クエリのセマンティクスを変更し、不正なクエリ、データ漏洩、または認証バイパスを引き起こす可能性があります。

分類と番号付け

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

LDAP Sink(必須)

以下の関数/ステートメントを最終実行点として特定します。

  • ldap_search({value}) / ldap_read({value}) / ldap_list({value})
  • およびそれらのプロジェクトラッパー(最終的に filter/DN 文字列が渡されるもの)

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

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

  1. EVID_LDAP_EXEC_POINT:LDAP クエリ実行点(ldap_* 関数呼び出し/ラッパーへの最終引数渡し箇所)の証拠
  2. EVID_LDAP_FILTER_STRING_CONSTRUCTION:LDAP filter/DN 文字列構築箇所(連結/テンプレート化)の証拠
  3. EVID_LDAP_USER_PARAM_TO_FILTER_FRAGMENT:ユーザー制御可能なパラメータから filter/DN フラグメントへのマッピングの証拠

制御可能性とインジェクション点の確認(必須)

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

  • ユーザー入力の出所:$_GET/$_POST/json/php://input/$_COOKIE/$_FILES またはその派生フィールド
  • filter/DN の構築方法:直接文字列連結か、エスケープされているか、allowlist(ホワイトリスト)が存在するか
  • インジェクションによって変更可能なセマンティクス点:例えば、*() などの LDAP filter 構文関連文字をインジェクションできるか(またはエンコードによってエスケープをバイパスできるか)
  • エスケープ/サニタイズの有無:ldap_escape(または同等のカスタム関数)を優先的に使用し、それが最終的な filter/DN 構築に使用されていることを証明できる必要があります。

tracer トリガー条件(必須)

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

  • filter/DN が複数の変数/関数階層で連結されているか、JSON デコード後に連結されている場合
  • filter/DN が ldap_search/read/list に入る前に分岐(if/switch/try)または早期 return/throw が存在する場合
  • エスケープロジックに条件分岐が存在する場合(一部の分岐でエスケープされていない、または一部のフィールドのみエスケープされている)

レポート出力

以下に出力します。

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

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

各 LDAP 脆弱性は以下の構造を含める必要があります。

### [{等級プレフィックス}-LDAP-{連番}] LDAP インジェクション脆弱性(filter/DN 連結によるクエリセマンティクス変更)

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

#### データフローチェーン(Source → Sink)
(ルートごとに各行に記述:入力読み取り -> 変数連結/変換/エスケープ -> filter/DN 最終生成 -> ldap_* 実行呼び出し、省略禁止)

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

#### 証拠引用(必須:php-route-tracer から)
- `EVID_LDAP_EXEC_POINT`:{対応する証拠要点の概要}
- `EVID_LDAP_FILTER_STRING_CONSTRUCTION`:{対応する証拠要点の概要}
- `EVID_LDAP_USER_PARAM_TO_FILTER_FRAGMENT`:{対応する証拠要点の概要}

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

{Payload}

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

  • まず「プローブペイロード」を使用して filter/DN が評価されることを証明します(返される数/ステータスコード/応答の差異)。
  • 次に「インジェクションペイロード」を使用してクエリセマンティクスを変更できることを証明します(例:マッチング範囲の拡大/条件のバイパス)。

推奨される修正

  • ldap_escape($value, '', LDAP_ESCAPE_FILTER)(または同等の関数)を使用して、filter のユーザー入力を厳密にエスケープします。
  • 制御可能なフィールドに対して allowlist(許可リスト)を適用します(合法な文字セット、固定属性名のみを許可し、長さを制限します)。
  • filter/DN の直接的な文字列連結を禁止します。パラメータ化/テンプレート化された安全な組み立てに変更します(PHP にネイティブな LDAP パラメータ化がない場合でも、コードレベルで厳密に組み立てる必要があります)。
  • すべての filter/DN 連結箇所を特定するためのコード検索ステートメント(rg)を提示します。

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

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

PHP LDAP 注入审计(php-ldap-audit)

分析 PHP 项目源码,识别 LDAP 查询相关代码(filter/DN 构造),检测 LDAP 注入风险:攻击者可通过控制 filter 或 DN 片段改变 LDAP 查询语义,从而导致未授权查询、数据泄露或认证绕过。

分级与编号

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

LDAP Sink(必做)

识别以下函数/语句作为最终执行点:

  • ldap_search({value}) / ldap_read({value}) / ldap_list({value})
  • 以及它们的项目封装(只要最终还是传入 filter/DN 字符串)

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

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

  1. EVID_LDAP_EXEC_POINT:LDAP 查询执行点(ldap_* 函数调用/封装最终传参处)证据
  2. EVID_LDAP_FILTER_STRING_CONSTRUCTION:LDAP filter/DN 字符串构造位置(拼接/模板化)证据
  3. EVID_LDAP_USER_PARAM_TO_FILTER_FRAGMENT:用户可控参数到 filter/DN 片段的映射证据

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

必须输出并判断:

  • 用户输入从哪里来:$_GET/$_POST/json/php://input/$_COOKIE/$_FILES 或其衍生字段
  • filter/DN 是如何构造:是否直接字符串拼接、是否经过转义、是否存在 allowlist 白名单
  • 注入可改变的语义点:例如可否注入 *() 等 LDAP filter 语法相关字符(或通过编码绕过转义)
  • 是否存在转义/净化:优先使用 ldap_escape(或自定义等价函数),且必须能证明用于最终 filter/DN 构造

tracer 触发条件(必做)

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

  • filter/DN 由多个变量/函数层级拼接或经过 JSON 解码后拼接
  • filter/DN 进入 ldap_search/read/list 之前存在分支(if/switch/try)或提前 return/throw
  • 转义逻辑存在条件分支(某些分支没转义、或仅转义部分字段)

报告输出

输出到:

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

漏洞条目模板(强制)

每条 LDAP 漏洞必须包含以下结构:

### [{等级前缀}-LDAP-{序号}] LDAP 注入漏洞(filter/DN 拼接导致查询语义被改变)

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

#### 数据流链(Source → Sink)
(按路由逐行写出:输入读取 -> 变量拼接/转换/转义 -> filter/DN 最终生成 -> 调用 ldap_* 执行,禁止省略)

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

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

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

{Payload}

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

  • 先用“探测 payload”证明 filter/DN 被求值(返回数量/状态码/响应差异)
  • 再用“注入 payload”证明可改变查询语义(如扩大匹配范围/绕过条件)

建议修复

  • 使用 ldap_escape($value, '', LDAP_ESCAPE_FILTER)(或等价函数)对 filter 用户输入做严格转义
  • 对可控字段做 allowlist(仅允许合法字符集、固定属性名、限制长度)
  • 禁止直接字符串拼接 filter/DN;改用参数化/模板化安全拼装(即使 PHP 无原生 LDAP 参数化,也要在代码层严格拼装)
  • 给出代码搜索语句(rg)用于定位所有 filter/DN 拼接点

tracer 证据缺失处理(强制)

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