54 lines
2.6 KiB
Markdown
54 lines
2.6 KiB
Markdown
### PHP 原生的敏感函数有哪些
|
|
|
|
**1. 代码执行 / 命令执行**
|
|
|
|
这些函数可以直接执行系统命令或 PHP 代码,是最高危的一类函数
|
|
|
|
- **`eval()`**: 将字符串作为 PHP 代码执行
|
|
- **`assert()`**: 检查一个字符串是否为合法的 PHP 代码,如果是则执行
|
|
- **`shell_exec()`**: 通过 shell 执行命令并返回所有输出
|
|
- **`exec()`**: 执行一个外部程序
|
|
- **`system()`**: 执行外部程序并显示输出
|
|
- **`passthru()`**: 执行外部程序并直接将原始输出传递给浏览器
|
|
- **`proc_open()`**: 执行一个命令,并打开指向其标准输入/输出/错误的文件指针
|
|
- **`popen()`**: 打开一个指向进程的管道。
|
|
|
|
**2. 文件包含 / 读取 / 写入**
|
|
|
|
这些函数如果参数可控,可能导致任意文件读取、写入,甚至是远程代码执行(RCE)
|
|
|
|
- **`include()` / `include_once()`**: 包含并执行指定文件
|
|
- **`require()` / `require_once()`**: 包含并执行指定文件,若失败则抛出致命错误
|
|
- **`file_get_contents()`**: 将整个文件读入一个字符串
|
|
- **`file_put_contents()`**: 将一个字符串写入文件
|
|
- **`fopen()` / `fread()` / `fwrite()`**: 用于打开、读取和写入文件
|
|
- **`unlink()`**: 删除文件
|
|
- **`move_uploaded_file()`**: 将上传的文件移动到新位置
|
|
- **`readfile()`**: 读取文件并写入到输出缓冲
|
|
|
|
**3. 数据处理与反序列化**
|
|
|
|
这些函数在处理用户输入时如果不加限制,可能导致反序列化漏洞
|
|
|
|
- **`unserialize()`**: 将字符串反序列化为 PHP 值
|
|
- **`json_decode()`**: 将 JSON 字符串解码为 PHP 变量
|
|
- **`gzuncompress()` / `gzinflate()`**: 解压压缩字符串,可能引发内存溢出或拒绝服务。
|
|
|
|
**4. 变量操作与反射**
|
|
|
|
- **`extract()`**: 从数组中导入变量到当前符号表。如果数组内容可控,可能覆盖现有变量
|
|
- **`parse_str()`**: 将字符串解析成变量,同样可能导致变量覆盖
|
|
- **`create_function()`**: 创建一个匿名函数。在 PHP 7.2.0 之后已被废弃,但旧版本中可能存在代码执行风险
|
|
|
|
**5. 数据库操作**
|
|
|
|
尽管大多数现代框架都有自己的 ORM 和查询构造器,但仍需注意原生数据库函数的使用,尤其是拼接 SQL 语句时
|
|
|
|
- **`mysql_query()`**: 执行 SQL 查询(已废弃)
|
|
- **`mysqli_query()`**: 执行 SQL 查询
|
|
- **`PDO::query()`**: 执行 SQL 查询
|
|
|
|
**6. 其他**
|
|
|
|
- **`header()`**: 用于设置 HTTP 头信息。如果参数可控,可能导致 CRLF 注入或重定向漏洞
|
|
- **`die()` / `exit()`**: 终止脚本执行。在某些情况下,可能导致逻辑漏洞 |