【web安全】——文件包含漏洞
1. 文件包含基础
和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
1.1. 文件包含简介
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
1.2. 文件包含的作用
文件包含可以更好的提高代码的重用性,引入文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
1.3. 文件包含函数
require():找不到被包含的文件会产生致命错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
1.4. 文件包含案例
1.4.1. include函数
1.4.2. Include_once函数
1.4.3. require函数
因为2.php不存在,执行错误终止,不会执行下面的语句与include不同
Include会产生告警,但是会继续执行下面的语句。
1.4.4require_once函数
只会进行一次包含
2. 文件包含漏洞
2.1文件包含漏洞成因
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
2.2.文件包含漏洞的危害
读取文件
远程文件读取实现网站挂马
包含日志文件getshe11
利用php://input伪协议可以执行任意脚本代码(即时没有文件上传也能执行脚本代码)配合文件上传漏洞getshe11
2.3.文件包含漏洞利用
2.3.1.本地文件包含(LFI)
在name出传参就可以看到对应的本地文件
2.3.2.远程文件包含
2.3.2.1.远程文件包含的条件
allow_url_fopen = 0n #本地文件包含,如果此项设置为off就表示禁止本地文件包含
allow_url_include = 0n #远程文件包含,如果设置为off则表示禁止远程文件包含
2.4.文件包含漏洞特点
2.4.1.无视文件扩展名
在PHP中当使用上面的一些函数的时候,这个文件就会被当作PHP代码进行执行,PHP内核并不会在意包含的文件是什么类型的,也就是说当发过来的是.png的文件也会被当作PHP执行。
将文件后缀改为.txt .jpg仍然能够执行代码
2.4.2.无条件解析PHP代码
文件包含洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。
3.文件包含漏洞综合利用
3.1.本地文件包含漏洞利用技巧
3.1.1配合文件上传使用
以dvwa靶场为例,先写一个图片马
上传到服务器
尝试用蚁剑连接
因为文件包含漏洞会默认将该文件当成php代码解析。
3.1.2包含Apache日志文件
日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo();?>时,<?phpphpinfo();?>也会被记录在日志里,也可以插入到User-Agent,但是请求的信息有可能被url编码之后记录日志,这里可以通过burp来发送请求包来防止被编码,通过相对路径找到日志文件,利用包含漏洞执行。
有时候网站存在文件包含漏洞,但是却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。
在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log,日志文件如下:
当我们正常访问一个网页时,如`http://127.0.0.1/phpinfo.php,access日志会进行记录,如下图所示:
如果我们访问一个不存在的资源,也一样会进行记录。
我们再次访问时候,进行抓包,修改后发送
此时再查看access日志,正确写入php代码:
再通过本地文件包含漏洞访问,即可执行
3.1.3包含session文件
可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可。
利用条件:
找到Session内的可控变量
Session文件可读写,并且知道存储路径
php的session文件的保存路径可以在phpinfo的session.save_path看到。
3.1.4包含临时文件
php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用C:\windows\temp目录。在临时文件被删除前,可以利用时间竞争的方式包含该临时文件。
由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的是随机函数有缺陷,而windows下只有65535种不同的文件名,所以这个方法是可行的。
另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。
4.PHP伪协议
4.1file://协议
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow url fopen与allow url include的影响
?file=php://filter/convert.base64-encode/resource=filter flag.phpresource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(1)分隔。write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(1)分隔。任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
使用:
file:// [文件的绝对路径和文件名]
4.2php://协议
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input
php://filter用于读取源码。
php://input用于执行php代码。
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
利用条件:
allow_url_fopen :off/on
allow_url_include:off/on
4.3ZIP://协议
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。
zip://中只能传入绝对路径。
要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23(即下述POC中#要用%23替换)
只需要是zip的压缩包即可,后缀名可以任意更改。
相同的类型还有zlib://和bzip2://
4.4data://协议
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:
利用条件:
allow_url_fopen :on
allow_url_include:on
5.常见敏感路径
5.1.windows系统
c:\boot.ini 查看系统版本
c:\xxx\php.iniphp 配置信息
c:\xxx\my.inimysq1 配置信息
c:\xxx\httpd.conf apache配置信息
5.2.linux系统
/etc/passwd/ linux系统账号信息
/etc/httpd/conf/httpd.conf apache配置信息
/etc/my.cnfmysq1 配置文件
/usr/etc/php.ini php 配置信息
6.绕WAF
6.1. 空字符绕过
6.1.1. 原理
空字符绕过是存在PHP小于5.3.4版本的一个漏洞,这个漏洞就是用于接收来自路径中的空字符,这样在部分需求下攻击者可以利用将此字符放置安全文件后面来绕过访问限制。
前提条件就是需要PHP版本小于5.3.4,并且关闭PHP魔术引导、
6.1.2. PHP魔术引号介绍
当sql句中含有单引号,双引号,反斜杠和NUL时,这时候如果不对这些符号进行转义,写入数据库时就会出错,而魔术引号magic_quotes_gpc()就是对这些符号进行转义以便能把数据正确写入数据库。不过该参数在php.ini文件中修改。
PHP魔术引号特性已自 PHP5,3.0起废弃并将自PHP5.4.0起移除。也就是说在本实验环境的PHP版本中仍
是存在的。
6.1.3其他绕过
00截断,但是PHP版本必须小于5.3长路径:利用系统特性绕过waf。windowx系统中,当点号数量大于256个字符时,256个字符以后的内容就会被丢弃因此可利用此特性进行绕过;Liunx系统中点号大于4096个。
路径双写绕过:..././..././
后缀处添加斜杠点号进行绕过:ino.php/.
?绕过:phpinfo.php?
#绕过:直接使用#并不能绕过,需要输入编码23才能够生效。phpinfo.php23
7.防御
7.1.过滤
对传入的文件名进行过滤
对敏感路径的关键字进行过滤
7.2.php.ini配置文件参数设置
allow url fopen=off #表示本地文件包含
allow url include=off #表示远程文件包含
开启魔术引号magic quotes qpc=on
7.3.对包含的文件范围做出限制
后台定义被包含文件的自名单
配置open basedir=指定目录,限制访问区域
修改apache日志文件的存放地址
相关文章:

【web安全】——文件包含漏洞
1. 文件包含基础 和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。 1.1. 文件包含简介 什么叫包含呢?以PHP为例,我们常常把可重复使用的函…...

游戏如何对抗改包
游戏改包是指通过逆向分析手段及修改工具,来篡改游戏包内正常的设定和规则的行为,游戏包被篡改后,会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理,并分享游戏如何应对改包问题。 安卓平台常见的改…...

12.梯度下降法的具体解析——举足轻重的模型优化算法
引言 梯度下降法(Gradient Descent)是一种广泛应用于机器学习领域的基本优化算法,它通过迭代地调整模型参数,最小化损失函数以求得到模型最优解。 通过阅读本篇博客,你可以: 1.知晓梯度下降法的具体流程 2.掌握不同梯度下降法…...
GPT对话知识库——C、C++,还有Java,他们之间有什么区别
目录 1,问: 1,答: 1. 语言特性与设计理念 C 语言: C 语言: Java 语言: 2. 内存管理 3. 运行效率 C 和 C: Java: 4. 程序的执行方式 C 和 C: Jav…...

华为GaussDB数据库之Yukon安装与使用
一、Yukon简介 Yukon(禹贡),基于openGauss、PostgreSQL、GaussDB数据库扩展地理空间数据的存储和管理能力,提供专业的GIS(Geographic Information System)功能,赋能传统关系型数据库。 Yukon 支…...

Linux命令:用于显示 Linux 发行版信息的命令行工具lsb_release详解
目录 一、概述 二、用法 1、基本用法 2、选项 3、获取帮助 三、示例 1. 显示所有信息 2. 只显示发行版名称 3. 只显示发行版版本号 4. 只显示发行版代号 5. 只显示发行版描述 6. 只显示值,不显示标签 四、使用场景 1、自动化脚本 2、诊断问题 3、环…...
sbb-classes 元素
sbb-classes 元素 在 JAIN SLEE(服务级别事件扩展)中,sbb-classes 元素用于定义服务边界组件(SBB)的类结构及其相关配置。这是每个 SBB 的必备部分,包含多个子元素,负责描述 SBB 的抽象类、接口…...

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第3关Git 基础知识
任务编号 任务名称 任务描述 1 破冰活动 提交一份自我介绍。 2 实践项目 创建并提交一个项目。 破冰活动 提交一份自我介绍。 每位参与者提交一份自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 camp3 分支~ 安装并设置git 克隆仓库并…...

12.数据结构和算法-栈和队列的定义和特点
栈和队列的定义和特点 栈的应用 队列的常见应用 栈的定义和特点 栈的相关概念 栈的示意图 栈与一般线性表有什么不同 队列的定义和特点 队列的相关概念...

15分钟学 Python 第34天 :小项目-个人博客网站
Day 34: 小项目-个人博客网站 1. 引言 随着互联网的普及,个人博客已成为分享知识、体验和见解的一个重要平台。在这一节中,我们将使用Python的Flask框架构建一个简单的个人博客网站。我们将通过实际的项目来学习如何搭建Web应用、处理用户输入以及管理…...

从零开始实现RPC框架---------项目介绍及环境准备
一,介绍 RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要 了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在 TCP/…...

论文阅读:PET/CT Cross-modal medical image fusion of lung tumors based on DCIF-GAN
摘要 背景: 基于GAN的融合方法存在训练不稳定,提取图像的局部和全局上下文语义信息能力不足,交互融合程度不够等问题 贡献: 提出双耦合交互式融合GAN(Dual-Coupled Interactive Fusion GAN,DCIF-GAN&…...

java基础 day1
学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说,操作更加容易上手,但是也存在一些问题。使用图形化界面需要加载许多图片,所以消耗内存;此外运行的速度没有命令行快 Wi…...

cpp,git,unity学习
c#中的? 1. 空值类型(Nullable Types) ? 可以用于值类型(例如 int、bool 等),使它们可以接受 null。通常,值类型不能为 null,但是通过 ? 可以表示它们是可空的。 int? number null; // …...

HTML增加文本复制模块(使用户快速复制内容到剪贴板)
增加复制模块主要是为了方便用户快速复制内容到剪贴板,通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤: HTML结构: 在文本旁边添加一个复制按钮,例如 <butto…...

Spring Cloud面试题收集
Spring Cloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。…...

观测云对接 SkyWalking 最佳实践
简介 SkyWalking 是一个开源的 APM(应用性能监控)和可观测性分析平台,专为微服务、云原生架构和基于容器的架构设计。它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化的解决方案。如果您的应用中正在使用SkyWalking …...

AI少女/HS2甜心选择2 仿天刀人物卡全合集打包
内含AI少女/甜心选择2 仿天刀角色卡全合集打包共21张 下载地址:https://www.51888w.com/408.html 部分演示图:...

MISC - 第11天(练习)
前言 各位师傅大家好,我是qmx_07,今天继续讲解MISC的相关知识 john-in-the-middle 导出http数据文件里面logo.png 是旗帜图案,放到stegsolve查看 通过转换颜色,发现flag信息 flag{J0hn_th3_Sn1ff3r} [UTCTF2020]docx 附件信息…...

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算
PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...