如何防范针对php.ini配置缺陷的本地包含漏洞_LFI加固指南

夜瑶大大_7055

夜瑶大大_7055

2026-04-10

464人浏览

原创

allow_url_include 和 allow_url_fopen 必须设为 Off,前者可直接导致 RCE,后者降低 SSRF 风险;需禁用危险流包装器、限制 include_path、配置 open_basedir 并严格核对各层级实际生效值。

php.ini 中 allow_url_include 和 allow_url_fopen 必须关掉

这两个配置项是 lfi 升级为远程代码执行(rce)的关键跳板。只要 allow_url_include 开着,攻击者就能用 php://input、data:// 或 expect:// 协议直接执行任意代码,根本不需要文件上传或写权限。

实操建议:

  • allow_url_include = Off —— 这条必须设为 Off,没有例外场景;On 状态下,哪怕 include() 参数做了白名单过滤,也可能被绕过
  • allow_url_fopen = Off —— 虽然不直接导致 RCE,但会禁用 file_get_contents("http://...") 类行为,减少 SSRF 和二次包含风险
  • 修改后必须重启 PHP 服务(如 systemctl restart php-fpm 或 apachectl graceful),仅 reload 不生效
  • 检查是否被 .htaccess 或 user.ini 覆盖:在 Web 目录放一个 info.php,内容为 <?php phpinfo(); ?>,搜索这两项的实际值

禁用危险的伪协议和流包装器

PHP 默认启用一堆能读取/执行内容的流,比如 php://filter 可用来泄露源码(Base64 编码绕过 ?> 截断),phar:// 在反序列化场景中可触发任意类加载。

实操建议:

  • 在 php.ini 中设置 disable_functions = system,exec,passthru,shell_exec,proc_open,popene,parse_ini_file,show_source,highlight_file —— 注意不要漏掉 parse_ini_file,它常被用于读取配置泄露
  • 用 stream_wrapper_unregister("phar") 在启动脚本中注销 phar 流(PHP 7.4+ 支持),比单纯依赖 disable_functions 更彻底
  • 避免在生产环境启用 extension=expect.so —— 这个扩展一旦存在,expect:// 就能直接执行 shell 命令,且无法通过 disable_functions 屏蔽

限制 include_path 和默认工作目录

当开发者用相对路径包含文件(如 include "$lang.".php),而 include_path 设置过宽(比如含 . 或 /tmp),攻击者可能通过目录遍历把恶意文件拖进包含链。

实操建议:

  • include_path = "/var/www/app/includes" —— 明确指定唯一可信路径,去掉 . 和 /tmp 等高危位置
  • 在入口脚本开头加 chdir("/var/www/app"),再配合 open_basedir = /var/www/app:/tmp(注意:/tmp 仅保留必要日志写入,不含可执行逻辑)
  • 如果用了 Composer 自动加载,确认 vendor/autoload.php 不在 Web 可访问路径下;否则 ?f=vendor/autoload.php 可能直接暴露 autoloader 行为,辅助路径猜测

用 open_basedir 划清文件操作边界

这个配置不是万能,但它能硬性阻止 PHP 脚本访问指定目录之外的任何文件 —— 包括 include、file_get_contents、fopen 等所有文件 I/O 操作。

实操建议:

  • open_basedir = /var/www/app:/tmp —— 多路径用冒号分隔(Linux)或分号(Windows),不能留空或设为 /
  • 若应用需访问多个独立目录(如上传目录、模板目录、日志目录),全部列出来,别图省事只写父目录
  • Apache 用户注意:open_basedir 在虚拟主机配置里用 php_admin_value open_basedir 设置才不可被 .htaccess 覆盖;Nginx + PHP-FPM 则需在 pool 配置里加 php_admin_value[open_basedir]
  • 开启后,getcwd() 返回值受限制,某些依赖当前路径的旧代码会报 Warning: getcwd(): open_basedir restriction in effect,得改用绝对路径

最麻烦的不是配错哪一项,而是不同层级配置互相覆盖 —— php.ini、pool 配置、.htaccess、user.ini、ini_set() 都可能干预同一参数。上线前务必用 php -i | grep -E "(allow_url|open_basedir|disable_functions)" 和 Web 端 phpinfo() 双向核对实际生效值。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2625

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3861

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2871

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

927

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2547

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2547

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2853

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2341

3

mdf文件导入数据库的方法
mdf文件导入数据库的方法

mdf文件导入数据库的方法有使用SQL Server Management Studio、使用SQL Server命令行工具、使用SQL Server Integration Services等方法。想了解更多mdf文件导入数据库的方法的相关内容,可以阅读本专题下面的文章。

2023.10.23

2513

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习