文件包含

超级超级详细的参考博客

注意区分文件上传和文件包含,伪协议很重要

简介

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:// 协议