浅析文件包含漏洞

发布于 2021-08-06  97 次阅读


文件包含漏洞

什么是文件包含

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

​ 简单来说就是为了增加代码的复用性,将重复使用的代码写入一个文件后,通过文件包含函数,在一个文件中包含另一个文件。

文件包含漏洞形成的原因。

​ 随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,就造成了文件包含漏洞。

示例:

<?php
$filename = $_GET['filename'];
include($filename);
?>

$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改

$_GET['filename']的值,执行非预期的操作。

文件包含漏洞所使用的函数

  • include( )
    当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
    进来,发生错误时之给出一个警告,继续向下执行。
  • include_once( )
    功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次
  • require( )
    require()与 include()的区别在于 require()执行如果发生错误,函数会输出
    错误信息,并终止脚本的运行。
  • require_once( )
    功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。

当出现上述四个函数是,就可能出现文件包含漏洞

文件包含漏洞的危害

  • 读取本地文件,获取主机上的敏感信息。例如:配置文件,日志,密码
    • 常见的敏感信息路径:Windows系统c:\boot.ini // 查看系统版本c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件c:\windows\repair\sam // 存储Windows系统初次安装的密码c:\ProgramFiles\mysql\my.ini // MySQL配置c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码c:\windows\php.ini // php 配置信息Linux/Unix系统/etc/passwd // 账户信息/etc/shadow // 账户密码文件/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置/usr/local/app/php5/lib/php.ini // PHP相关配置/etc/httpd/conf/httpd.conf // Apache配置文件/etc/my.conf // mysql 配置文件
  • 远程文件包含:攻击者访问玩不地址来加载远程的代码,需要php.iniallow_url_fopenallow_url_include要为On。而且所包含远程服务器的文件后缀不能与目标服务器语言相同。(比如目标服务器是php脚本语言解析的,那么包含的远程服务器文件后缀不能是php)
    • 可以包含木马文件进行getshell

文件包含漏洞的利用

  • 读取本地文件

在同级目录下创建index.phpflag.php两个文件

sX4BwD.png

sX5lct.png

可以读取flag.php文件里面的内容

  • 远程文件包含:包含远程文件地址中的木马,使用蚁剑等工具进行连接

文件包含漏洞的小技巧

  1. 大小写绕过
  2. 文件后加入特殊字符绕过
    利用工具,将访问路径后加入%00,可以绕过后缀检查。
    或者后面加一些特殊字符例如 斜杠 点之类。
  3. 省略后缀
    有些程序会将传入参数指引到其他位置,或者修改后缀名,先访问文件判断,例如不需要写后缀名。
  4. 双写绕过
    当写入文件时,发现删除某些特殊字符,我们可以判断是删除了其中字符,例如”php”,”…/“,只需再增加一个使其删除后得到我们需要的,需要注意绝对路径与相对路径。
  5. nginx目录解析漏洞
    当判断到中间件是nginx时,我们可以利用nginx目录解析,当我们只能上传.jpg文件时,我们无法利用,只能原文读取出来,但是发现在shell.jpg后加/xxx.php,他就能以php方式读取文件,这就是目录解析漏洞。
  6. 包含日志文件
  7. 伪协议包含
    当不能直接访问目录下文件时,可以选择利用伪协议来访问文件,伪协议有以下几种:(allow_url_fopen和allow_url_include)都为On
    (1)page=file://[绝对路径]
    当页面有file1,file2……后台会判断是否已file开头,我们可以使用此协议。
    (2)php:// 访问各个输入/输出流(I/O streams)
    php://filter用于读取源码
    php://input用于执行php代码,或者直接将代码写入执行。
    (3)zip://[绝对路径], bzip2://[绝对路径], zlib://[绝对路径]协议,都属于压缩楼,访问压缩文件中的子文件,不需要指定后缀
    phar:// 可以查找指定压缩包内的文件,相对路径与绝对路径都可以写
    (4)data: text/plain,与input类似,当我们想查看源代码时,可以将其先转换为base64文件在传到页面上就不会执行PHP了
    (5)http协议
    也可以传入外部链接,自己服务器的钓鱼网站。

文件包含漏洞如何防护

设置白名单代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
过滤危险字符由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。
设置文件目录PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
关闭危险配置PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。