文件包含漏洞简介

漏洞原理

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用其它函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含。程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

漏洞场景

php中引发文件包含漏洞的通常是以下四个函数:

  1. include() 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。

  2. include_once() 功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。

  3. require() 只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

  4. require_once() 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,php内核并不在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url、也都将作为PHP代码执行。这一特性,在实施攻击时非常有用。

其他常见文件包含函数

jsp: ava.io.file()、java.io.filereader()......

asp: include file、include virtual.......

漏洞危害

  1. 服务器安全风险:攻击者可以利用文件包含漏洞在服务器上执行任意代码,从而控制系统。这可能导致数据泄露、数据篡改、拒绝服务攻击等严重后果。
  2. 数据泄露:攻击者可以利用文件包含漏洞访问敏感数据,如用户个人信息、信用卡信息等。这可能导致严重的隐私泄露和金融欺诈。
  3. 网站可用性下降:攻击者可以利用文件包含漏洞使网站无法正常运行,从而影响用户体验和业务运营。
  4. 法律责任:如果网站未能及时修复文件包含漏洞,导致用户遭受损失,网站可能会面临法律责任。

漏洞利用

漏洞的典型特征

变量的值为一个页面:

  • ?page=a.php

  • ?home=b.html

  • ?file=content.........

漏洞利用的前提条件

  1. web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的

    方式引入;

用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

漏洞获取 webshell 的前提条件

1.攻击者需要知道文件存放的物理路径;

2.对上传文件所在目录拥有可执行权限;

3.存在文件包含漏洞;

分类

文件包含漏洞可以分为RFI(远程文件包含)和LFI(本地文件包含漏洞)两种。

而区分他们最简单的方法就是php.ini 中是否开启了allow_url_include。如果开启 了我们就有可能包含远程文件。

1、本地文件包含LFI(Local File Include)

2、远程文件包含RFI(Remote File Include)(需要php.ini中allow_url_include=on allow_url_fopen = On)

在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。

截断包含

%00截断

PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串的结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串?file=../../../../../../../../../etc/passwd%00(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)

目录长度限制截断

Win 下可以利用 256 位截断,linux 下则需要 4096 位截断,最大值长度之后的字符将被丢弃。 而利用"./"的方式即可构造出超长目录字符串。

php伪协议文件包含

常见的 php 伪协议:

file://协议,php://协议,php://filter ,php://input ,zip://, bzip2://, zlib://协议,data://协议,http:// & https:// 协议

file://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 作用:

    用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopen和allow_url_include的影响。

    include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的。

php://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

zip://, bzip2://, zlib://协议

  • 条件:

    • allow_url_fopen:off/on
    • allow_url_include :off/on
  • 作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

data://协议

  • 条件:

    • allow_url_fopen:on
    • allow_url_include :on
  • 作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

http:// & https:// 协议

  • 条件:

    • allow_url_fopen:on
    • allow_url_include :on
  • 作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。通常用于远程包含。

防护措施

1、包含目标的参数过滤

  1. 文件名后缀固定:在包含的文件名前后加固定后缀;

  2. 文件名过滤:白名单或者黑名单过滤;

2、路径限制

  1. 目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围;

  2. 目录回退符过滤,避免回退符生效导致路径变化;

3、中间件的安全配置

  1. Magic_quotes_gpc(5.4 以后被放弃用)

  2. 限制访问区域:php.ini 中设置 open_basedir 来限制用户访问文件的活动范围

等;apache 也有相关配置

  1. 设置访问权限:限制当前中间件所在用户的访问权限,例如;web 服务器独立

用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;

常见系统默认路径

Windows 系统

C:\boot.ini //查看系统版本

C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件

C:\windows\repair\sam //存储 windows 系统初次安装的密码

C:\Program Files\mysql\my.ini //mysql 配置

C:\Program Files\mysql\data\mysql\user.MYD //Mysql root

C:\windows\php.ini //php 配置信息

Linux 系统

/etc/passwd

/usr/local/app/apache2/conf/httpd.conf //apache2 默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置

/usr/local/app/php5/lib/php.ini //PHP 相关配置

/etc/httpd/conf/httpd.conf //apache

/etc/php5/apache2/php.ini //ubuntu 系统的默认路径

日志默认路径

/etc/httpd/logs/access_log 或者 /var/log/httpd/access_log //apache+Linux 日志默认路径

D:\xampp\apache\logs\access.log

D:\xampp\apache\logs\error.log //apache+win2003 日志默认路径

C:\WINDOWS\system32\Logfiles //IIS6.0+win2003 默认日志文件

%SystemDrive%\inetpub\logs\LogFiles //IIS7.0+win2003 默认日志文件

相关推荐
用户962377954481 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主2 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954484 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机5 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954485 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star5 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954485 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher6 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行9 天前
网络安全总结
安全·web安全