文件包含常见php函数

  • include
  • require
  • include_once
  • require_once
  • highlight_file
  • show_source
  • readfile
  • file_get_contents
  • fopen
  • file

关于文件包含是否支持%00截断

  • PHP版本<=5.2 可以使用%00进行截断。
  • 对于特定类型文件上传可使用%00截断绕过 如 :1.php%00.jpg => 1.php

php.ini

  • allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的fopen 封装协议使得可以访问URL对象文件等;
  • allow_url_include:off 默认关闭,该选项为on便是允许包含URL对象文件等。

php支持的伪协议

PHP伪协议事实上就是支持的协议与封装协议

  • php:// — 访问各个输入/输出流(I/O streams)
  • file:// — 访问本地文件系统
  • phar:// — PHP 归档
  • zlib:// — 压缩流
  • data:// — 数据(RFC 2397)
  • http:// — 访问 HTTP(s) 网址
  • ftp:// — 访问 FTP(s) URLs
  • glob:// — 查找匹配的文件路径模式
  • ssh2:// — Secure Shell 2
  • rar:// — RAR
  • ogg:// — 音频流
  • expect:// — 处理交互式的流

常用php伪协议

  1. php://协议
  • php://filter php://filter是我们常常使用的一个伪协议,在任意文件读取,甚至getshell的时候都有利用的机会。在include函数的使用上,经常会造成任意文件读取漏洞file_get_contents()和file_put_contents()这样函数下,常常会构成getshell等更严重的漏洞。在allow_url_fopen、allow_url_include都关闭的情况下可以正常使用,主要用于读取源代码并进行base64编码输出。 使用:传入参数php://filter/read=convert.base64-encode/resource=xxx.php
  • php://input   php://input 是个可以访问请求的原始数据的只读流。因为它不依赖于特定的 php.ini 指令。但是enctype=”multipart/form-data” 的时候 php://input 是无效的。
  1. file://协议
  • file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与 allow_url_include的影响 使用:file:// [文件的绝对路径和文件名]
  1. phar://协议
  • PHP 归档,常常跟文件包含,文件上传结合着考察。说通俗点就是php解压缩包的一个函数,解压的压缩包与后缀无关,文件上传仅仅校验mime类型与文件后缀有关时可使用。
  • 包含方法:include.php?f=phar://./images/1.jpg/1.php (1.jpg是一个里面含有1.php的压缩包,改了后缀名)
  1. zlib://协议 、zip://协议、bzip2://协议
  • zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用。
  • file.php?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

    注:get请求#需进行url编码为%23

  • file.php?file=compress.bzip2://file.bz2
  • file.php?file=compress.zlib://file.gz
  1. data://协议
  • 在allow_url_fopen、allow_url_include都开启的情况下才可以正常使用。
  • file.php?file=data://text/plain,[php代码]
  • file.php?file=data://text/plain,base64,[php代码base64编码]
最后修改:2021 年 08 月 27 日
如果觉得我的文章对你有用,请随意赞赏