0x00:文件包含漏洞定义

文件包含漏洞的产生原因是在通过 PHP的函数引入文件里,由于传入的文件名称没有经过合理的检验。
从而导致引入了开发者预想之外的文件。(注:包含的文件会被当成脚本文件来解析)

漏洞原因:
文件包含所加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。

0x02:文件包含的相关函数

相关的PHP函数 功能解释 错误时的操作
include 语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中 引入的文件有错误时,只生成警告(E_WARNING),并且脚本会继续执行脚本
include_once 此行为和 include 语句功能类似,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
require 语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 require 语句的文件中 引入的文件有错误时,会生成致命错误(E_COMPILE_ERROR)并停止脚本运行
require_once 与 require 语句功能类似,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。

PHP函数 功能解释
highlight_file 函数对文件进行语法高亮显示
show_source 函数对文件进行语法高亮显示
readfile 函数读取一个文件,并写入到输出缓冲
如果成功,该函数返回从文件中读入的字节数。如果失败,该函数返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 ‘@’ 来隐藏错误输出
file_get_contents 函数把整个文件读入一个字符串中
fopen 函数打开文件或者 URL
file 函数把整个文件读入一个数组中

0x03:常见的文件包含函数示例

(1)include()

  1. http://www.php.net/manual/en/function.include.php

image.png
include()函数包含出错的话,只会提出警告,不会影响后续语句的执行。
image.png

(2)require()

  1. http://php.net/manual/en/function.require.php

image.png

require()函数包含出错的话,则直接退出,后续语句不执行。
image.png

(3)include_once() 和 require_once()

require_once() 和 include_once()功能与require()和include()类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once()则不会在包含它,避免函数重定义或变量重赋值问题。

  1. http://php.net/manual/en/function.include-once.php
  2. http://php.net/manual/en/function.require-once.php

二次包含
image.png

一次包含:
image.png

(4)file_get_contents()

file_get_contents()函数将整个文件读入一个字符串中
测试代码:

  1. <?php
  2. $file = $_GET['file'];
  3. if(file_get_contents($file,'r') == "Avenue")
  4. { echo "you are Admin!!!";}
  5. ?>

利用条件:无
利用姿势:
file_get.php?file=php://input POST:Qftm
php://input可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data” 的时候 php://input 是无效的
image.png

0x04: 漏洞危害

  • 执行任意代码
  • 读取文件源码或敏感信息