跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP目录遍历漏洞
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP目录遍历漏洞 = '''目录遍历漏洞'''(Directory Traversal,也称路径遍历漏洞)是PHP安全编程中常见的一种漏洞,攻击者通过构造恶意输入访问服务器上本应受限的文件或目录。这种漏洞通常出现在文件操作函数未正确过滤用户输入的情况下,可能导致敏感数据泄露、文件篡改或服务器入侵。 == 基本概念 == 目录遍历漏洞的核心问题是程序未对用户提供的路径进行充分验证,导致攻击者可以通过特殊字符(如`../`)跳出预期的目录范围,访问上级目录或其他敏感路径。例如: * 预期访问:`/var/www/uploads/userfile.txt` * 攻击者构造路径:`../../../etc/passwd`,最终访问系统密码文件 === 漏洞原理 === <mermaid> graph LR A[用户输入文件名] --> B{是否过滤../?} B -->|否| C[拼接完整路径] C --> D[读取敏感文件] B -->|是| E[安全访问] </mermaid> 数学表达上,漏洞产生的原因是路径拼接时未对输入进行规范化处理: <math> \text{最终路径} = \text{基础路径} + \text{用户输入} \quad \text{且} \quad \text{用户输入包含} \backslash..\backslash </math> == 漏洞示例 == === 基础示例 === 以下是一个存在漏洞的PHP代码片段: <syntaxhighlight lang="php"> <?php $file = $_GET['file']; // 用户可控输入 $base_path = '/var/www/uploads/'; // 直接拼接路径 - 危险! readfile($base_path . $file); ?> </syntaxhighlight> '''攻击方式:''' <pre> http://example.com/script.php?file=../../../etc/passwd </pre> '''输出结果:''' 显示系统的`/etc/passwd`文件内容 === 安全修复方案 === 使用`realpath()`和`basename()`组合验证: <syntaxhighlight lang="php"> <?php $file = $_GET['file']; $base_path = '/var/www/uploads/'; // 规范化路径并检查是否在基础目录内 $real_path = realpath($base_path . basename($file)); if (strpos($real_path, realpath($base_path)) === 0) { readfile($real_path); } else { die("非法访问!"); } ?> </syntaxhighlight> == 进阶防护技术 == === 1. 白名单验证 === 只允许特定扩展名的文件: <syntaxhighlight lang="php"> $allowed_ext = ['jpg', 'png', 'txt']; $ext = pathinfo($file, PATHINFO_EXTENSION); if (!in_array($ext, $allowed_ext)) { die("文件类型不允许"); } </syntaxhighlight> === 2. PHP内置函数防护 === 使用`SplFileInfo`类: <syntaxhighlight lang="php"> $file = new SplFileInfo($base_path . $file); if ($file->getRealPath() && strpos($file->getRealPath(), realpath($base_path)) === 0) { // 安全操作 } </syntaxhighlight> == 真实案例 == '''案例1:CMS系统漏洞(2018年)''' 某流行CMS的1.2.3版本中,文件下载功能未过滤`../`,导致攻击者能下载配置文件`config.inc.php`,获取数据库凭证。 '''攻击payload:''' <pre> /download.php?file=../../config/config.inc.php </pre> '''案例2:云存储服务漏洞(2020年)''' 某云服务API在处理文件路径时,URL解码后未验证路径,允许这样的攻击: <pre> GET /api/file?name=%2e%2e%2f%2e%2e%2fkey.pem (解码后:../../key.pem) </pre> == 防御总结 == {| class="wikitable" ! 危险做法 !! 安全替代方案 |- | 直接拼接路径 | 使用`realpath()`+目录前缀检查 |- | 信任`$_GET`/`$_POST` | 白名单验证文件类型 |- | 手动过滤`../` | 使用`basename()`或`SplFileInfo` |} == 延伸阅读 == * 永远不要仅依赖客户端验证 * 考虑使用chroot环境限制PHP访问范围 * 定期进行安全审计,使用工具如`phpstan`检测潜在漏洞 通过理解目录遍历漏洞的原理和防护方法,开发者可以显著提高PHP应用的安全性。记住:'''所有用户输入都不可信''',必须进行严格验证和过滤。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP安全编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)