欢迎新同学的光临
… …
人若无名,便可专心练剑
我不是一条咸鱼,而是一条死鱼啊!
前言
文件包含漏洞严格来说,属于"代码注入"的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行, 来完成恶意攻击
开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的,造成文件包含漏洞。
常见的文件包含相关函数有:
include()
require()
include_once()
require_once()
-
include()
执行到include时才包含文件,找不到被包含文件时只会产生警告,代码会继续执行
-
require()
程序开始运行就预先包含文件,找不到被包含的文件时会产生致命错误,并停运行
-
include_once()和require_once()
功能和上面一样,但文件中代码已被包含则不会再次包含
文件包含漏洞分类
本地文件包含:包含本地文件,主要出现在模块加载、模板加载和cache调用之处
远程文件包含:包含的文件位于远程服务器上,需要设置allow_url_include = on
本地文件包含漏洞实例
代码如下:
把一下几个php放在同一个目录文件里面fileinclude.php、fileinclude_black.php、fileinclude_white.php、remotefile.php、file.php、local.php、right.php、file.txt
fileinclude.php
if (isset($_GET['file'])) {
include($_GET['file']);
}
else{
echo "使用 file 参数包含文件";
}
?>
fileinclude_black.php
<?php
header("Content-Type: text/html; charset=utf-8");
if (isset($_GET['file'])) {
$file = $_GET['file'];
$file = str_replace("http:", "", $file);
$file = str_replace("https:", "", $file);
include($file);
}
else{
echo "使用 file 参数包含文件";
}
?>
fileinclude_white.php
<?php
header("Content-Type: text/html; charset=utf-8");
if (isset($_GET['file'])) {
$file = $_GET['file'];
if($file != "right.php")
{
echo "错误!不能加载此文件!";
exit;
}
include($file);
}
else{
echo "使用 file 参数包含文件";
}
?>
remotefile.php
<?php
include($_GET['file']);
?>
file.php
<?php
echo '你已成功加载file.php';
?>
local.php
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
if (isset($_GET['file'])) {
$f =$_GET['file'];
if ($f){
}
else{
print("No File Included");
}
}
?>
right.php
<?php
echo "right.php 加载成功";
?>
创建一个file.txt 文本,里面存在跟file.php 一样的内容
<?php
echo '你已成功加载file.php';
?>
访问fileinclude.php
输入?file=file.php,加载同目录下的file.php文件中的代码
成功执行了file.php文件中的代码,使用echo输出了字符串,如果file.php中的代码是一些通用的函数模块,这种代码复用方式无疑会给开发者代码非常大的便捷,而且后期修改也不同到每个文件中修改,只需修改file.php就可以了,类似于配置文件得作用。 但是这里未对用户的输入过滤,所以会出现意料之外的危险。
比如包含一些linux系统上的敏感文件:
输入?file=/etc/passwd:
以看到成功执行/etc/passwd 命令
值得注意的是,被包含的文件无论是不是以.php结尾,服务器都会以php代码的方式解析它。
比如我们输入?file=file.txt(和file.php内容一样):
这个特点使得文件包含漏洞经常和文件上传漏洞结合使用。
比如有些地方可以上传头像,图片等,但是由于上传的限制,一般只能上传jpg,png的图片格式,代码无法被直接加载执行,所以这里先上传.jpg .png等结尾的图片,图片的内容为一句话木马,然后通过本地文件包含的方式将图片包含进来,代码就执行了
参考链接:https://www.shiyanlou.com/courses/895
我自横刀向天笑,去留肝胆两昆仑