文件包含(File inclusion)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 文件包含(File inclusion)

原理:

文件包含函数包含文件参数没有经过过滤或者严格的定义,并且参数可以被用户控制,就可能包含非预期的文件。如果文件中存在恶意代码,无论文件是什么样的后缀类型,文件内的恶意代码都会被解析执行。


危害:

服务器的网页篡改、网站被挂马、服务器被远程控制、被安装后门等危害。


修复方法:

设置白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。如果需要使用文件包含,则通过使用白名单的方法对要包含的文件进行限制,这样可以做到既使用了文件包含,又可以防止文件包含漏洞。


过滤危险字符:严格限制包含中的参数,取消那些不可控的参数。由于Include Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini)),在Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。

预编译;


设置文件目录:PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。


修改php的配置文件:将open_basedir的值设置为可以包含的特定目录,后面要加/,例如:open_basedir=/var/www/html/。


关闭危险配置:PHP配置中的allow_url_include选项如果打开,PHP会通过Include Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。


禁用相应函数:如果不需要文件包含,则关闭allow_url_include()函数,防止远程文件包含,这是最安全的办法。


分类:

本地文件包含:


可以包含服务器本地文件,在条件允许时甚至能执行代码 读敏感文件,读PHP文件 包含日志文件GetShell 包含data:或php://input等伪协议 若有phpinfo则可以包含临时文件 配合上传图片马,然后包含从而GetShell


远程文件包含:


包含远程的木马或病毒文件,从而GetShell


注意:要实现远程文件包含需要allow_url_fopen和allow_url_include都开启


常见的敏感信息路径:

Windows系统常见敏感文件


c:\boot.ini          查看系统版本


c:\xxx\php.ini        php 配置信息


c:\xxx\my.ini         MySQL配置信息


c:\xxx\httpd.conf      Apache配置信息


Linux系统常见敏感文件


/etc/passwd          Linux系统账号信息


/etc/shadow: Linux系统密码信息


/etc/httpd/conf/httpd.conf Apache配置信息


/etc/my.cnf           MySQL配置文件


/usr/etc/php.ini        PHP配置信息


文件包含的函数和区别:

此函数在识别到传参为空时会停止代码的执行,然后报错,_once()即是指只执行一次


·require()


·require_once()


此函数在识别到传参为空时会发出告警,_once()即是指只执行一次


·include()


·include_once()


用法

c6f7a78a340b04ae90f79c2ec5918fb3_bd140566d3f148ad8eaf7dc0f8591924.png


1.在index.php中取得page的值($_GET[page])。


2.判断$_GET[page]是不是空,若不空(这里 是main.php)就用include来包含这个文件。


3.若$_GET[page]空的话就执行else,来 include "home.php"这个文件。 index.php?page=home.php


相对路径和绝对路径的区别


绝对路径:


从盘符开始逐步进入到目标文件


C:\windows\system32\cmd.exe


相对路径:


是从当前路径开始的路径,假如当前路径为C:\windows


要描述上述路径,只需输入


system32\cmd.exe


相对路径需要用到“../”来访问上一级路径


Php伪协议:

file:// — 访问本地文件系统


http:// — 访问 HTTP(s) 网址


ftp:// — 访问 FTP(s) URLs


php:// — 访问各个输入/输出流(I/O streams)


zlib:// — 压缩流


data:// — 数据(RFC 2397)


glob:// — 查找匹配的文件路径模式


phar:// — PHP 归档


expect:// — 处理交互式的流


伪协议的使用:

file:// 协议:直接读取文件(file://[文件的绝对路径或相对路径和文件名])(而且必须是本地文件)


http:// 通过网络读取文件( [http://网络路径和文件名])(可以读取远程文件)


php://input 将以POST data形式传入的数据作为php代码解析并执行(如果想要执行除了读取以外的命令,需开启 allow_url_include选项)


data://:将对应的字符串当成php代码执行(data://text/plain, php代码 data://text/plain;base64,base64加密后的php代码)

例子:


http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>


http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b


php://filter:通过过滤器来读取文件(php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码)(针对php文件需要base64编码)


zip://:把指定的文件当做zip压缩包进行解压,并在解压后解析指定的文件(zip://[压缩文件绝对路径]%23[压缩文件内的子文件名] )


例子:


http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt (%23就是#)


phar://:负责压缩/解压php archive的专用协议,但可以解压zip文件,可以把指定的文件当做zip压缩包进行解压,在解压后解析指定的文件


例子:


http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.jpg/phpinfo.txt

相关文章
|
C#
C# File、FileInfo、Directory、DirectoryInfo
本文主要介绍文件类、文件信息类、目录类、目录信息类的常用属性和方法
61 0
|
7月前
|
编译器 API C语言
C/C++ 获取文件名的方法:分享一些实用的获取文件名的方法和技巧(__FILE__,__builtin_FILE(),__BASE_FILE__等)
C/C++ 获取文件名的方法:分享一些实用的获取文件名的方法和技巧(__FILE__,__builtin_FILE(),__BASE_FILE__等)
733 0
|
Unix Windows
为什么文件路径 Program Files 可以写成 Progra~1
为什么文件路径 Program Files 可以写成 Progra~1
|
JavaScript
The file is in the program because: Imported via xxx Root file specified for compilation Vetur(1261)
The file is in the program because: Imported via xxx Root file specified for compilation Vetur(1261)
201 0
The file is in the program because: Imported via xxx Root file specified for compilation Vetur(1261)
AndroidStudio:Path is not a readable directory.
AndroidStudio:Path is not a readable directory.
136 0
objdump: ‘1443.14.0)‘: No such file or directory
objdump: ‘1443.14.0)‘: No such file or directory
112 0
curses.h: No such file or directory
curses.h: No such file or directory
133 0
No such file or directory
No such file or directory
324 0
No such file or directory
|
Python
6.2 file 写文件
#!/usr/bin/env python # -*- coding:utf-8 -*- #@Time      :2017/10/27 22:15 #@Author    :zhouyuyao #@File      :file_write.
695 0