什么是文件包含
为了更好使用代码的重用性 , 引入了文件包含函数 , 可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
文件包含漏洞的成因是什么
在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,
用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
<?php
$file= $_GET['file'];
include($file);
?>
PHP 文件包含函数
Include
include语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中
Include_once
include_once() 语句是指在脚本执行期间包含并运行指定文件
require
运行指定文件, 文件只处理一次(实际上,文件内容替换 require() 语句)
require_once
运行指定文件, 文件只处理一次 ,会检查该文件是否已经被包含过,如果是则不会再次包含。
highlight_file
highlight_file() 函数对文件进行 PHP 语法高亮显示。语法通过使用 HTML 标签进行高亮。
提示:用于高亮的颜色可通过 php.ini 文件进行设置或者通过调用 ini_set() 函数进行设置。
注释:当使用该函数时,整个文件都将被显示,包括密码和其他敏感信息!
show_source
show_source() 函数对文件进行语法高亮显示
语法 show_source(filename,return)
filename 必需。要进行高亮处理的 PHP 文件的路径。
return 可选。如果设置 true,则本函数返回高亮处理的代码。
readfile
readfile() 函数读取一个文件,并写入到输出缓冲。
如果成功,该函数返回从文件中读入的字节数。如果失败,该函数返回 FALSE 并附带错误信息。
您可以通过在函数名前面添加一个 '@' 来隐藏错误输出。
语法 readfile(filename,include_path,context)
file_get_contents
把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
file_get_contents(path,include_path,context,start,max_length)
fopen
函数打开一个文件或 URL。
file
file() 函数把整个文件读入一个数组中。
file(path,include_path,context)
本地文件包含
本地文件包含漏洞利用(也称为 LFI)是通过利用应用程序中实施的易受攻击的包含过程来包含服务器本地已经存在的文件的过程。例如,当页面接收到必须包含的文件的路径作为输入,并且此输入未正确清理时,就会发生此漏洞,从而允许注入目录遍历字符(例如点-点-斜线) . 尽管大多数示例都指向易受攻击的 PHP 脚本,但我们应该记住,它在 JSP、ASP 等其他技术中也很常见
远程文件包含
远程文件包含(也称为 RFI)是通过利用应用程序中实施的易受攻击的包含程序来包含远程文件的过程。例如,当页面接收到必须包含的文件的路径作为输入,并且此输入未正确清理,从而允许注入外部 URL 时,就会发生此漏洞。
- allow_url_fopen: 为ON时,能读取远程文件 ,例如file_get_contents()就能读取远程文件
- allow_url_include : 为ON时,就可以使用include和requrire 等方式包含远程文件
常见的敏感信息路径:
Windows系统
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
日志文件路径
(1) apache+Linux日志默认路径
/etc/httpd/logs/access_log 或 /var/log/httpd/access_log
(2) apache+win2003日志默认路径
D:xampp apachelogsaccess.log
D:xampp apachelogserror.log
(3) IIS6.0+win2003默认日志文件
C:WINDOWSsystem32Logfiles
(4) IIS7.0+win2003 默认日志文件
%SystemDrive%inetpublogsLogFiles
(5) nginx 日志文件z
日志文件在用户安装目录logs目录下
如安装路径为/usr/local/nginx,
则日志目录在/usr/local/nginx/logs
伪协议
- php://filter 是一种元封装器 , 设计用于数据流打开时的筛选过滤应用
- data:// 同样类似与php://input 可以让用户来控制输入流
- php://input 可以访问请求的原始数据的只读流 ,将post请求的数据当作php代码执行
- phar://xxx.png/shell.php 解压缩包的一个函数 ,不管后缀是什么 ,都会当作压缩包来解压