【PHP代码审计】本地文件包含漏洞


欢迎新同学的光临
… …
人若无名,便可专心练剑


我不是一条咸鱼,而是一条死鱼啊!


前言

文件包含漏洞严格来说,属于"代码注入"的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行, 来完成恶意攻击

开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。

开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的,造成文件包含漏洞。

常见的文件包含相关函数有:

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


我自横刀向天笑,去留肝胆两昆仑


猜你喜欢

转载自blog.csdn.net/Ananas_Orangey/article/details/120549217
今日推荐