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()
http://www.php.net/manual/en/function.include.php
include()函数包含出错的话,只会提出警告,不会影响后续语句的执行。
(2)require()
http://php.net/manual/en/function.require.php
require()函数包含出错的话,则直接退出,后续语句不执行。
(3)include_once() 和 require_once()
require_once() 和 include_once()功能与require()和include()类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once()则不会在包含它,避免函数重定义或变量重赋值问题。
http://php.net/manual/en/function.include-once.php
http://php.net/manual/en/function.require-once.php
二次包含
一次包含:
(4)file_get_contents()
file_get_contents()函数将整个文件读入一个字符串中
测试代码:
<?php
$file = $_GET['file'];
if(file_get_contents($file,'r') == "Avenue")
{ echo "you are Admin!!!";}
?>
利用条件:无
利用姿势:
file_get.php?file=php://input POST:Qftm
php://input可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data” 的时候 php://input 是无效的
0x04: 漏洞危害
- 执行任意代码
- 读取文件源码或敏感信息