文件包含时涉及PHP伪协议总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在做CTF题的时候文件包含题出现多次使用伪协议,学习了下伪协议就顺便写个博客防止以后忘记
参考这篇文章:PHP伪协议总结

一、file:// 协议

1. 条件:

allow_url_fopen:off/on
allow_url_include :off/on

2. 作用:

用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。

include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的。

3. 说明:

file:// 文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。在很多情况下是脚本所在的目录,除非被修改了。使用 CLI 的时候,目录默认是脚本被调用时所在的目录。在某些函数里,例如 fopen() 和 file_get_contents(),include_path 会可选地搜索,也作为相对的路径。

4. 用法:

/path/to/file.ext
relative/path/to/file.ext
fileInCwd.ext
C:/path/to/winfile.ext
C:\path\to\winfile.ext
\\smbserver\share\path\to\winfile.ext
file:///path/to/file.ext

5. 示例:

file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
在这里插入图片描述

② [文件的相对路径和文件名]

http://127.0.0.1/include.php?file=./phpinfo.txt

在这里插入图片描述

③ [http://网络路径和文件名]

http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

在这里插入图片描述

· 参考:http://php.net/manual/zh/wrappers.file.php

二、php:// 协议

1. 条件:


                
### PHP 文件包含漏洞使用伪协议复现 #### 利用 `file://` 伪协议读取本地文件 当应用程序允许通过用户输入指定要包含的文件路径,攻击者可以尝试利用 `file://` 协议来访问服务器上的敏感文件。例如,在 phpMyAdmin 中可能存在未正确过滤用户输入的情况。 ```php <?php // 假设此代码片段来自有缺陷的应用程序逻辑 $filename = $_GET['page']; include($filename); ?> ``` 如果上述代码没有适当的安全措施,则可以通过如下 URL 来触发漏洞并读取 `/etc/passwd` 文件的内容: ``` http://example.com/vulnerable_page.php?page=file:///etc/passwd ``` 这将导致 Web 应用程序试图加载操作系统级别的配置文件而不是预期的有效页面[^1]。 #### 使用 `php://filter` 进行数据流操作 PHP 提供了一种特殊类型的封装器——`php://filter`,它能够应用于不同的 I/O 流以执行转换或编码/解码工作。对于某些版本中的 phpMyAdmin 或其他应用而言,可能被用来绕过简单的黑名单防护机制从而实现命令注入或其他恶意行为。 例如,下面的例子展示了如何创建一个经过 base64 编码后的字符串作为虚拟文件,并让 PHP 解析其内容当作正常的 PHP 脚本运行: ``` http://target/path/index.php?import=php://filter/read=convert.base64-decode/resource=dataPD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+ ``` 其中 `dataPD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+` 是 Base64 编码形式下的 PHP 反序列化有效载荷 `<?php system($_GET['cmd']); ?>`. 请注意实际环境中应当避免直接展示完整的攻击向量;这里仅用于说明目的[^2]. #### 数据库连接字符串 (`mysql:` 和 `pgsql:`) 虽然这些不是传统意义上的 "伪协议",但在特定条件下它们也可以成为潜在的风险点。比如在一个不安全地处理数据库 URI 的场景下, 攻击者可能会操纵参数去指向另一个不受信任的数据源. 然而, 更常见的是看到像这样的错误实践: ```sql $dbconn = pg_connect("host=localhost dbname=mydb user=someone password=secret"); if (!$dbconn) { die('Could not connect: ' . pg_last_error()); } ``` 假设这里的主机名是从外部可控渠道获得的话(如 GET 请求), 那么就有可能遭受 SQL 注入式的攻击变体或者是更复杂的中间人(MitM)攻击模式[^3]. #### ZIP 归档内嵌资源(`zip://`) ZIP 封装器使得可以从压缩包内部提取单个成员项作为独立实体对待。考虑到这一点之后, 如果某个 webapp 接受了一个由客户端提交过来 zip 文件并且基于该档案里的条目来进行动态导入动作... 那么只要构造好相应的 payload 并将其打包成 .zip 格式发送给目标站点即可完成整个过程. 具体来说就是先准备好含有恶意脚本的一组文件结构,再把它们全部塞进同一个容器里形成最终产物; 当服务端解析到这个特殊的请求就会按照预设好的方式依次打开每层包裹直至触发展示隐藏深处的东西为止[^4]. #### HTTP(S) 请求重定向(`http(s)://`) 最后一种情况涉及到跨域资源共享(CORS)策略不当设置所引发的问题。假如某处功能模块依赖于远程地址提供的模板或者其他可执行组件来做渲染决策依据之一, 而此又缺乏必要的身份验证环节或是权限校验流程设计得不够严谨周密, 则很容易造成未经授权的信息泄露风险甚至是完全控制权旁落他人之手的局面发生. 因此建议开发者们务必重视起这方面的工作,确保任何涉及网络通信的操作都遵循最佳实践经验指南行事[^5].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值