> 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 Security Scanner 是一款仅订阅用户可用的静态审查工具，用于在 PHP 应用程序中查找危险的 PHP 函数、薄弱配置、危险的源到汇路径以及权限提升迹象。

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

## 函数查找器

<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>使用受限工作进程和固定命令模板。</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>`backticks`</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>检查动态包含路径和自动加载副作用。</td><td>使用固定包含映射和规范化路径。</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>避免对受用户影响的数据使用多查询 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>报告缺失或不完整的加固，尤其是在存在命令汇点时。</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>动态包含可能加载远程资源。</td><td>当与动态包含路径一起启用时为严重。</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`          |
| Cookies / 会话 | `$_COOKIE`，会话值                          |
| 上传           | `$_FILES`，原始文件名、临时路径                    |
| 请求头          | `$_SERVER['HTTP_*']`, `getallheaders()` |
| 原始正文         | `php://input`，解码后的 JSON/XML             |
| 命令行 / 工作进程   | `$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、流、套接字或 cURL 目标。 |
| `PHP-SQL-001`      | 高   | 被污染的输入到达原始 SQL。                  |
| `PHP-PATH-001`     | 高   | 被污染的路径到达文件读取/写入/删除/移动逻辑。         |
| `PHP-CALLBACK-001` | 高   | 被污染的函数或方法名到达动态分发。                |
| `PHP-CONFIG-001`   | 高   | 危险的 PHP 配置会增加利用难度。               |
| `PHP-PRIV-001`     | 严重  | PHP 执行具有 SUID、sudo、cron 或特权上下文。  |

## 快速分流

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

## 权限提升信号

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

## 报告模板

```json
{
  "id": "PHP-CMD-001",
  "severity": "critical",
  "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、环境、数据库、缓存、队列和基于文件的输入。
* 检测命令执行、代码执行、include、文件、网络、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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
