> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/zh/hacking-tools/web/php-security-scanner.md).

# PHP 安全扫描器

用于发现危险 PHP 函数、风险模式、利用影响、分流笔记和修复指导的 PHP 安全扫描器函数查找器。

PHP 安全扫描器是一款仅限订阅者使用的静态审查工具，用于查找 PHP 应用中的危险 PHP 函数、薄弱配置、有风险的 source-to-sink 路径以及权限提升迹象。

将函数查找器作为主要分流视图：按函数名、类别、影响或严重性搜索。

## 函数查找器

<table data-view="cards" data-full-width="true" data-search="true"><thead><tr><th>函数 / 模式</th><th>类别</th><th>严重性</th><th>影响</th><th>扫描器检查</th><th>修复</th></tr></thead><tbody><tr><td><code>system()</code></td><td>命令执行</td><td>严重</td><td>以 Web 用户身份执行 RCE</td><td>标记受污染的命令字符串、插值、拼接以及用户可控参数。</td><td>使用原生 PHP API，或严格的白名单命令和参数。</td></tr><tr><td><code>exec()</code></td><td>命令执行</td><td>严重</td><td>RCE，命令输出捕获</td><td>检查请求、Cookie、数据库、文件或 CLI 输入是否到达命令。</td><td>移除 shell 使用，或将固定命令隔离在白名单之后。</td></tr><tr><td><code>shell_exec()</code></td><td>命令执行</td><td>严重</td><td>带返回输出的 RCE</td><td>检测动态命令构造以及渲染到响应中的输出。</td><td>改用安全的库调用。</td></tr><tr><td><code>passthru()</code></td><td>命令执行</td><td>严重</td><td>带原始输出的 RCE</td><td>当可从 Web 路由或文件处理到达时升级严重性。</td><td>避免 shell 调用；验证固定输入集。</td></tr><tr><td><code>proc_open()</code></td><td>进程控制</td><td>严重</td><td>RCE，进程交互</td><td>审查命令、描述符规范、环境和工作目录。</td><td>使用受限 worker 和固定命令模板。</td></tr><tr><td><code>popen()</code></td><td>进程控制</td><td>严重</td><td>通过进程流实现的 RCE</td><td>标记受污染的命令字符串和流读取。</td><td>尽可能改用 PHP 流/文件 API。</td></tr><tr><td><code>pcntl_exec()</code></td><td>进程控制</td><td>严重</td><td>进程替换，提权风险</td><td>在 CLI、cron、SUID、sudo 和 worker 场景中升级严重性。</td><td>移除特权解释器执行路径。</td></tr><tr><td><code>`反引号`</code></td><td>命令执行</td><td>严重</td><td>隐藏的 shell 执行</td><td>检测反引号表达式中的变量插值。</td><td>改用明确且安全的 API。</td></tr><tr><td><code>eval()</code></td><td>代码执行</td><td>严重</td><td>任意 PHP 执行</td><td>标记所有使用；当被求值字符串是动态时升级严重性。</td><td>使用闭包、解析器、固定分发映射或安全模板。</td></tr><tr><td><code>assert()</code></td><td>代码执行</td><td>高</td><td>遗留代码执行风险</td><td>标记旧 PHP 代码库中的字符串断言。</td><td>仅使用布尔断言；移除动态字符串。</td></tr><tr><td><code>create_function()</code></td><td>代码执行</td><td>高</td><td>遗留的已求值代码</td><td>检测旧插件和 PHP 5/7 兼容代码。</td><td>改用匿名函数。</td></tr><tr><td><code>preg_replace()</code> 替换为 <code>/e</code></td><td>代码执行</td><td>高</td><td>遗留的已求值替换</td><td>标记遗留正则替换求值。</td><td>使用 <code>preg_replace_callback()</code>.</td></tr><tr><td><code>mb_ereg_replace()</code> 替换为 <code>e</code></td><td>代码执行</td><td>高</td><td>已求值替换风险</td><td>审查动态模式和替换值。</td><td>使用不涉及求值的回调安全逻辑。</td></tr><tr><td><code>include</code></td><td>文件包含</td><td>严重</td><td>LFI/RFI 导致代码执行</td><td>标记用户可控路径、包装器和扩展技巧。</td><td>将用户选择映射到固定文件。</td></tr><tr><td><code>include_once</code></td><td>文件包含</td><td>严重</td><td>LFI/RFI 导致代码执行</td><td>检查动态 include 路径和自动加载副作用。</td><td>使用固定的 include 映射和规范化路径。</td></tr><tr><td><code>require</code></td><td>文件包含</td><td>严重</td><td>应用程序代码执行</td><td>当路径包含请求数据时升级严重性。</td><td>拒绝动态文件系统输入。</td></tr><tr><td><code>require_once</code></td><td>文件包含</td><td>严重</td><td>应用程序代码执行</td><td>审查框架加载器、插件加载器和模板路径。</td><td>仅使用白名单模块。</td></tr><tr><td><code>file_get_contents()</code></td><td>文件 / 网络读取</td><td>高</td><td>LFI、SSRF、机密泄露</td><td>标记受污染的路径、URL 以及 <code>php://input</code> 解析。</td><td>规范化路径并阻止高风险方案。</td></tr><tr><td><code>readfile()</code></td><td>文件读取</td><td>高</td><td>直接文件泄露</td><td>检测路径遍历和公开下载处理器。</td><td>按 ID 从获准目录提供文件。</td></tr><tr><td><code>fopen()</code></td><td>文件 / 网络访问</td><td>高</td><td>LFI、SSRF、任意写入</td><td>跟踪模式、路径来源和 URL 包装器。</td><td>验证方案、模式和规范化路径。</td></tr><tr><td><code>file()</code></td><td>文件读取</td><td>高</td><td>按行文件泄露</td><td>标记用户可控文件名。</td><td>使用固定存储路径和边界检查。</td></tr><tr><td><code>SplFileObject</code></td><td>文件访问</td><td>高</td><td>LFI、路径遍历</td><td>检测动态构造函数参数。</td><td>应用 <code>realpath()</code> 边界限制。</td></tr><tr><td><code>file_put_contents()</code></td><td>文件写入</td><td>严重</td><td>Web Shell、覆盖、配置投毒</td><td>当文件名和内容受污染，或路径是公开可访问时升级严重性。</td><td>生成文件名并写入 Web 根目录之外。</td></tr><tr><td><code>fwrite()</code></td><td>文件写入</td><td>高</td><td>任意文件修改</td><td>追踪句柄来源自 <code>fopen()</code>.</td><td>限制可写目录和文件类型。</td></tr><tr><td><code>copy()</code></td><td>文件写入 / 移动</td><td>高</td><td>文件植入或覆盖</td><td>检查源和目标的污染情况。</td><td>使用固定目标和避免冲突的名称。</td></tr><tr><td><code>rename()</code></td><td>文件移动</td><td>高</td><td>上传绕过、覆盖</td><td>标记用户可控的目标路径。</td><td>使用生成的存储名称。</td></tr><tr><td><code>unlink()</code></td><td>文件删除</td><td>高</td><td>任意文件删除</td><td>检测受污染路径和路径遍历。</td><td>按对象 ID 删除，而不是原始路径。</td></tr><tr><td><code>chmod()</code></td><td>权限</td><td>高</td><td>权限弱化</td><td>标记过宽的模式，例如 <code>0777</code> 以及受污染的路径。</td><td>使用最小权限模式和固定路径。</td></tr><tr><td><code>chown()</code> / <code>chgrp()</code></td><td>所有权</td><td>高</td><td>权限操纵</td><td>审查部署和管理员脚本。</td><td>不要将所有权更改暴露给应用输入。</td></tr><tr><td><code>mkdir()</code></td><td>文件系统</td><td>中等</td><td>路径遍历、薄弱权限</td><td>标记动态路径和宽松模式。</td><td>规范化路径并设置严格权限。</td></tr><tr><td><code>touch()</code></td><td>文件系统</td><td>中等</td><td>文件创建、时间戳滥用</td><td>在 cron 或特权目录中升级严重性。</td><td>使用固定路径和所有权检查。</td></tr><tr><td><code>unserialize()</code></td><td>反序列化</td><td>严重</td><td>PHP 对象注入</td><td>对所有使用了请求、Cookie、上传、数据库、缓存或队列数据的情况都标记出来。</td><td>使用 JSON 或限制 <code>allowed_classes</code>.</td></tr><tr><td><code>Phar</code> / <code>phar://</code></td><td>反序列化</td><td>高</td><td>元数据触发的对象注入</td><td>标记被接受的 <code>phar://</code> 路径以及触及上传的文件函数。</td><td>阻止包装器并避免含对象元数据的路径。</td></tr><tr><td><code>__wakeup()</code></td><td>魔术方法</td><td>高</td><td>对象注入利用链</td><td>审查文件、SQL、命令和网络操作。</td><td>保持魔术方法无副作用。</td></tr><tr><td><code>__destruct()</code></td><td>魔术方法</td><td>高</td><td>对象注入利用链</td><td>如果它会删除、写入、包含或执行，则升级严重性。</td><td>避免危险的析构副作用。</td></tr><tr><td><code>__toString()</code></td><td>魔术方法</td><td>中等</td><td>隐式利用链执行</td><td>检查模板渲染和日志路径。</td><td>保持转换方法纯净。</td></tr><tr><td><code>curl_exec()</code></td><td>网络 / SSRF</td><td>高</td><td>SSRF、内部服务访问</td><td>跟踪 URL、重定向、头部、代理和协议选项。</td><td>对主机做白名单并阻止私有网段。</td></tr><tr><td><code>fsockopen()</code></td><td>网络</td><td>高</td><td>原始内部网络访问</td><td>标记动态主机和端口值。</td><td>限制目标和出站访问。</td></tr><tr><td><code>pfsockopen()</code></td><td>网络</td><td>高</td><td>持久化的内部网络访问</td><td>审查长连接的服务连接。</td><td>使用固定端点。</td></tr><tr><td><code>stream_socket_client()</code></td><td>网络</td><td>高</td><td>SSRF 和协议滥用</td><td>标记动态方案、主机和端口。</td><td>使用白名单网络目标。</td></tr><tr><td><code>SoapClient</code></td><td>网络</td><td>中等</td><td>类 SSRF 的请求</td><td>审查动态 WSDL 和端点值。</td><td>使用固定 WSDL 并阻止重定向。</td></tr><tr><td><code>mysqli_query()</code></td><td>SQL</td><td>高</td><td>SQL 注入</td><td>标记拼接或插值的 SQL。</td><td>使用预处理语句。</td></tr><tr><td><code>mysqli_multi_query()</code></td><td>SQL</td><td>高</td><td>堆叠式 SQL 注入</td><td>动态多语句查询升级严重性。</td><td>对受用户影响的数据避免使用 multi-query API。</td></tr><tr><td><code>PDO::query()</code></td><td>SQL</td><td>高</td><td>SQL 注入</td><td>标记包含变量的原始查询字符串。</td><td>使用 <code>prepare()</code> 和绑定参数。</td></tr><tr><td><code>PDO::exec()</code></td><td>SQL</td><td>高</td><td>SQL 注入或破坏性 SQL</td><td>审查管理员操作和迁移。</td><td>使用参数化语句。</td></tr><tr><td><code>call_user_func()</code></td><td>动态分发</td><td>高</td><td>回调滥用</td><td>标记受污染的回调名称。</td><td>使用固定的分发映射。</td></tr><tr><td><code>call_user_func_array()</code></td><td>动态分发</td><td>高</td><td>带动态参数的回调滥用</td><td>跟踪回调和参数来源。</td><td>使用显式处理器和有类型输入。</td></tr><tr><td><code>$fn()</code></td><td>变量函数</td><td>高</td><td>任意函数分发</td><td>标记来自请求或数据库数据的函数名。</td><td>将名称映射到固定函数。</td></tr><tr><td><code>$object->$method()</code></td><td>动态方法</td><td>高</td><td>方法分发滥用</td><td>标记来自输入的方法名。</td><td>使用白名单方法映射。</td></tr><tr><td><code>ReflectionFunction</code></td><td>反射</td><td>中等</td><td>动态调用</td><td>审查反射得到的名称和调用。</td><td>将反射限制在内部工具中。</td></tr><tr><td><code>register_shutdown_function()</code></td><td>延迟回调</td><td>中等</td><td>隐藏的执行路径</td><td>标记动态回调和参数。</td><td>使用显式固定回调。</td></tr><tr><td><code>move_uploaded_file()</code></td><td>上传</td><td>高</td><td>Web Shell、覆盖、路径遍历</td><td>检查目标路径、扩展名逻辑、公开存储以及原始文件名的使用。</td><td>重命名文件、对扩展名做白名单限制、存储在 Web 根目录之外。</td></tr><tr><td><code>getimagesize()</code></td><td>上传验证</td><td>中等</td><td>薄弱的内容验证</td><td>当它被作为唯一的上传验证时标记出来。</td><td>结合扩展名、MIME、内容和存储控制。</td></tr><tr><td><code>ZipArchive::extractTo()</code></td><td>归档解压</td><td>高</td><td>Zip Slip、任意写入</td><td>检查归档条目名称和解压目录。</td><td>对每个解压路径进行规范化。</td></tr><tr><td><code>phpinfo()</code></td><td>信息泄露</td><td>中等</td><td>配置、路径、模块和环境泄露</td><td>如果可在本地开发之外访问，则标记出来。</td><td>从生产环境中移除。</td></tr><tr><td><code>var_dump()</code> / <code>print_r()</code></td><td>调试输出</td><td>低</td><td>数据和机密泄露</td><td>当它用于响应或异常路径时升级严重性。</td><td>使用带脱敏的结构化日志。</td></tr><tr><td><code>debug_backtrace()</code></td><td>调试输出</td><td>中等</td><td>路径和参数泄露</td><td>审查错误处理器和调试路由。</td><td>在生产环境中禁用详细调试输出。</td></tr></tbody></table>

## 配置查找器

<table data-view="cards" data-full-width="true" data-search="true"><thead><tr><th>指令</th><th>严重性</th><th>风险</th><th>扫描器检查</th></tr></thead><tbody><tr><td><code>disable_functions</code></td><td>高</td><td>危险的执行函数仍然可用。</td><td>报告缺失或不完整的加固，尤其是存在命令 sink 时。</td></tr><tr><td><code>open_basedir</code></td><td>中等</td><td>PHP 可以访问更广泛的文件系统路径。</td><td>标记缺失、为空或过于宽泛的值。</td></tr><tr><td><code>allow_url_fopen</code></td><td>中等</td><td>文件 API 可以获取 URL。</td><td>对基于 URL 的文件读取和易受 SSRF 影响的函数升级严重性。</td></tr><tr><td><code>allow_url_include</code></td><td>严重</td><td>动态 include 可能加载远程资源。</td><td>当与动态 include 路径一起启用时，这是严重问题。</td></tr><tr><td><code>display_errors</code></td><td>中等</td><td>堆栈跟踪、路径和机密可能泄露。</td><td>标记已启用的生产环境配置。</td></tr><tr><td><code>expose_php</code></td><td>低</td><td>PHP 版本泄露。</td><td>建议在生产环境中禁用。</td></tr><tr><td><code>file_uploads</code></td><td>信息</td><td>存在上传攻击面。</td><td>结合上传路径、大小、扩展名和内容验证检查。</td></tr><tr><td><code>upload_max_filesize</code></td><td>中等</td><td>过大的上传和存储滥用。</td><td>标记大于应用所需的值。</td></tr><tr><td><code>session.cookie_httponly</code></td><td>中等</td><td>客户端脚本窃取会话 cookie 更容易。</td><td>建议启用。</td></tr><tr><td><code>session.cookie_secure</code></td><td>中等</td><td>Cookie 可能通过 HTTP 发送。</td><td>建议在 HTTPS 网站上启用。</td></tr><tr><td><code>session.cookie_samesite</code></td><td>低</td><td>CSRF 暴露可能增加。</td><td>建议显式设置 <code>宽松</code> 或 <code>严格</code>.</td></tr></tbody></table>

## 源到汇输入

| 源           | 示例                                      |
| ----------- | --------------------------------------- |
| 请求          | `$_GET`, `$_POST`, `$_REQUEST`          |
| Cookie / 会话 | `$_COOKIE`，会话值                          |
| 上传          | `$_FILES`，原始文件名、临时路径                    |
| 请求头         | `$_SERVER['HTTP_*']`, `getallheaders()` |
| 原始请求体       | `php://input`，解码后的 JSON/XML             |
| CLI / 工作进程  | `$argv`, `STDIN`，环境变量                   |
| 存储数据        | 数据库行、缓存条目、队列、序列化列                       |
| 本地文件        | 配置文件、CSV 导入、临时文件                        |

## 规则 ID

| 规则 ID              | 严重性 | 含义                                   |
| ------------------ | --- | ------------------------------------ |
| `PHP-CMD-001`      | 严重  | 受污染的输入到达命令执行。                        |
| `PHP-EVAL-001`     | 严重  | 受污染的输入到达 PHP 代码求值。                   |
| `PHP-INCL-001`     | 严重  | 受污染的输入控制 include/require 路径。         |
| `PHP-DESER-001`    | 严重  | 受污染的输入到达 `unserialize()`.            |
| `PHP-WRITE-001`    | 严重  | 用户可控的文件写入会到达可执行或公开路径。                |
| `PHP-UPLOAD-001`   | 高   | 上传验证或存储可能允许可执行文件。                    |
| `PHP-SSRF-001`     | 高   | 受污染的 URL 到达 HTTP、流、socket 或 cURL 汇点。 |
| `PHP-SQL-001`      | 高   | 受污染的输入到达原始 SQL。                      |
| `PHP-PATH-001`     | 高   | 受污染的路径到达文件读取/写入/删除/移动逻辑。             |
| `PHP-CALLBACK-001` | 高   | 受污染的函数或方法名到达动态分发。                    |
| `PHP-CONFIG-001`   | 高   | 危险的 PHP 配置增加了可利用性。                   |
| `PHP-PRIV-001`     | 严重  | PHP 执行具有 SUID、sudo、cron 或特权上下文。      |

## 快速分流

| 问题                               | 严重性提升      |
| -------------------------------- | ---------- |
| 请求数据是否能到达该函数？                    | 提升为高或严重。   |
| 该函数是否执行命令、PHP 代码、包含操作或反序列化？      | 严重。        |
| 它是否会操作 Web 根目录下的文件？              | 高或严重。      |
| 它是否接受 URL、包装器、主机或端口？             | 高。         |
| 它是否由 cron、sudo、SUID、工作进程或部署钩子运行？ | 严重。        |
| 验证是否仅基于黑名单、仅基于扩展名，或仅基于 MIME？     | 提升一级。      |
| 值是否从严格的允许列表中选择？                  | 降低置信度或严重性。 |

## 权限提升信号

| 信号                     | 风险                   |
| ---------------------- | -------------------- |
| SUID PHP 二进制文件         | PHP 可以以提升的文件所有者权限执行。 |
| sudo 规则允许 PHP          | 用户可能以其他用户身份运行 PHP。   |
| root 拥有的 cron 运行可写 PHP | 可写脚本可能变成特权执行。        |
| 可写 Web 根目录             | 文件写入或上传漏洞可能导致代码执行。   |
| 所有人可读的机密               | 应用凭据可用于横向移动。         |
| Composer 脚本以特权用户运行     | 依赖或脚本执行可能影响部署。       |

## 报告模板

```json
{
  "id": "PHP-CMD-001",
  "severity": "严重",
  "function": "shell_exec",
  "file": "app/Controllers/ReportController.php",
  "line": 84,
  "source": "$_POST['format']",
  "impact": "以 Web 服务器用户身份进行远程命令执行",
  "fix": "用原生 PHP 库替换 shell 执行，或仅使用严格允许列表中的参数。"
}
```

## 扫描清单

* 解析 `.php`, `.inc`, `.phtml`, `.module`, `.theme`，框架路由、控制器、任务和 CLI 脚本。
* 跟踪请求、Cookie、上传、头部、原始请求体、CLI、环境、数据库、缓存、队列和基于文件的输入。
* 检测命令执行、代码执行、包含、文件、网络、SQL、反序列化、上传、回调、调试和配置汇点。
* 根据可达性、净化、PHP 版本、配置、Web 根目录、权限和执行上下文对发现进行评分。
* 导出函数名、类别、严重性、来源、汇点、文件、行、影响、置信度和修复。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/zh/hacking-tools/web/php-security-scanner.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
