文件包含
注意区分文件上传和文件包含,伪协议很重要
简介
allow_url_fopen和allow_url_include
这两个都是php.ini的配置项
allow_url_fopen On 默认开启
该选项为on便是激活了URL形式的fopen封装协议使得可以访问URL对象文件
注意: 此选项只能在 php.ini 中设置
allow_url_include off 默认关闭
该选项为on便是允许包含URL对象文件
注意: 此设置需要启用allow_url_fopen
相关内容
require 找不到被包含的文件时会产生致命错误,并停止脚本运行。
include 找不到被包含的文件时只会产生警告,脚本将继续运行。
include_once 与include类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
require_once 与require类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含
被包含的文件中含有效的php代码(php标签),则引入当前文件执行,若不含有效php代码,则直接输出文件内容
伪协议
只要是能包含文件的地方几乎都可以使用php伪协议,所以很多时候可以利用文件包含来进行ssrf攻击,来获取服务器的本地资源
file协议
需要注意的是,php中涉及到文件以及协议的地方,默认都是使用的file协议。也就是说,如果你没有显式的写出协议名或者协议不存在,都会被当成file协议来解析。
- 用法
- 示例
php协议
- 这个很重要,php://input常用来执行php代码,php://filter常用来读取源码
- php://filter
- 转换过滤器
convert.iconv.UTF-8.UTF-16 实现任意两种编码之间的转换
convert.base64-encode & convert.base64-decode 等同于base64_encode()和base64_decode(),base64编码解码
convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串与 8-bit 字符串编码解码
read,常用于读取源码。php://filter/read=convert.base64-encode/resource=phpinfo.php
input
php://input是个可以访问请求的元数据的只读流,可以读取到POST没有解析的原始数据。
注:entype="multipart/form-data"的时候php://input是无效的。
使用条件:
allow_url_fopen: Off/On
allow_url_include: Off/On
需要特别注意的是,当allow_url_include为On的时候,会将POST请求中的数据作为PHP代码执行。
其他协议
- zip:// & bzip2:// & zlib:// 协议
- data:// 协议
- http:// & https:// 协议
- phar:// 协议