upload-labs通关笔记-第5关 文件上传之.ini绕过

目录

一、ini文件绕过原理

二、源码审计

三、渗透实战

1、查看提示

2、制作.user.ini文件

(1)首先创建一个文本文件

(2)保存文件名为.user.ini

2、制作jpg后缀脚本

(1)创建一个文本文件

(2)保存为文件名pass5.jpg

3、上传ini与jpg文件

(1)准备好待上传文件

(2)打开upload靶场第五关

 (3)上传ini与jpg文件

4、访问readme.php


本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第四关文件.ini渗透实战。

一、ini文件绕过原理

在 PHP 环境中,ini文件可以用于配置 PHP 的运行环境。.user.ini 是 PHP 中用于特定目录配置的特殊文件 ,类似 Apache 的.htaccess 文件,主要作用如下所示。

  • 自定义配置:允许非管理员用户为特定目录定义 PHP 配置指令,这些指令在该目录及其子目录中的 PHP 脚本执行时生效。比如可修改 upload_max_filesize 调整上传文件大小限制、修改 memory_limit 改变脚本可用内存 ,而不影响整个服务器配置。
  • 文件包含:借助配置项 auto_prepend_file(在执行 PHP 文件前自动包含指定文件)和 auto_append_file(在执行 PHP 文件后自动包含指定文件) ,可实现恶意代码注入或后门构造。攻击者上传恶意.user.ini 文件,指定包含恶意 PHP 代码文件,就能在用户访问目录下 PHP 文件时执行恶意代码。

   在文件上传关卡,具体利用方法如下所示。

  • 编写.user.ini 文件:创建.user.ini,写入如下内容,意思是让服务器在每个 PHP 请求前自动包含名为pass5.jpg的文件。
auto_prepend_file = "pass5.jpg"
  • 准备pass5.jpg的shell文件:创建pass5.jpg,内容为获取服务器php信息的PHP 代码,具体如下所示。
<?php
phpinfo();
?>
  • 上传文件:当该关卡允许.ini和jpg后缀上传时,尝试将.user.ini 和pass5.jpg上传到服务器指定目录。
  • 触发执行:上传成功后,访问目录下可执行的 PHP 文件(如关卡中提示的 readme.php ),服务器会根据.user.ini 配置,自动包含并执行pass5.jpg中的恶意代码。

二、源码审计

接下来对upload-labs 第 5 关的源码进行审计,如下为已经进行详细注释版的代码,很明显这段代码也是黑名单过滤来实现进行安全检查的。虽然包含多种变体(".php", ".php5", ".php4", ".php3", ".php2", ".php1", ".html", ".htm", ".phtml", ".pht", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".pHp1", ".Html", ".Htm", ".pHtml", ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"),与第四关的区别是将“ini”变为了“htaccess”,所以很明显这一关卡遗漏新的危险扩展名(如.ini等),这也是我们渗透这一关卡的关键。

<?php
// 初始化上传状态变量
$is_upload = false;  // 布尔值,标记文件是否上传成功
$msg = null;         // 字符串,用于存储上传过程中的错误信息// 检查是否通过POST方法提交了表单(submit按钮被点击)
if (isset($_POST['submit'])) {// 检查上传目录是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件扩展名黑名单(包含各种变体)$deny_ext = array(// PHP相关扩展名及变体".php", ".php5", ".php4", ".php3", ".php2", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2",// HTML相关扩展名及变体".html", ".htm", ".phtml", ".pht",".Html", ".Htm", ".pHtml",// JSP相关扩展名及变体".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml",".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml",// ASP相关扩展名及变体".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer",".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr",// 其他危险文件类型".sWf", ".swf",  // Flash文件".htaccess"      // Apache配置文件);// 获取并处理上传文件名$file_name = trim($_FILES['upload_file']['name']);  // 去除首尾空格$file_name = deldot($file_name);    // 删除文件名末尾的点(防御file.php.攻击)$file_ext = strrchr($file_name, '.');  // 获取文件扩展名(从最后一个点开始)$file_ext = strtolower($file_ext);     // 统一转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除NTFS备用数据流$file_ext = trim($file_ext);           // 去除扩展名首尾空格// 检查文件扩展名是否在黑名单中if (!in_array($file_ext, $deny_ext)) {// 获取上传的临时文件路径$temp_file = $_FILES['upload_file']['tmp_name'];// 构造目标文件路径(使用原始文件名,存在安全隐患)$img_path = UPLOAD_PATH.'/'.$file_name;// 将临时文件移动到目标位置if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;  // 标记上传成功} else {$msg = '上传出错!';  // 文件移动失败(可能权限不足或目录不可写)}} else {$msg = '此文件类型不允许上传!';  // 文件类型被禁止}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';  // 上传目录不存在}
}
?>

三、渗透实战

1、查看提示

进入靶场pass5,点击右上角的提示,得知上传目录存在readme.php文件,如下图所示。

2、制作.user.ini文件

(1)首先创建一个文本文件

创建文件并里面写入,该配置文件的效果是在.user.ini相同的目录下,所有的php文件都包含pass5.jpg这个文件。

auto_prepend_file=pass5.jpg

(2)保存文件名为.user.ini

将文件保存为.user.ini并将保存类型配置为所有文件

2、制作jpg后缀脚本

(1)创建一个文本文件

代码内容如下所示:

<?php
phpinfo();
?>

(2)保存为文件名pass5.jpg

点击文件另存为pass5.jpg,保存类型设置为所有文件。

3、上传ini与jpg文件

(1)准备好待上传文件

两个所需要的文件就创建完毕,图示如下。

(2)打开upload靶场第五关

http://127.0.0.1/upload-labs/Pass-05/index.php

 (3)上传ini与jpg文件

如下所示,上传user.ini与jpg文件,两者均上传成功。

4、访问readme.php

根据本关提示,在上传目录下是有一个readme.php文件的,所以直接访问url:http://127.0.0.1/upload-labs/upload/readme.php,如下所示,php版本号成功显示,证明文件上传成功。

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

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

相关文章

为什么 Linux 上默认没有 host.docker.internal

在 Linux 环境中&#xff0c;host.docker.internal 是 Docker 为容器提供的一个特殊 DNS 名称&#xff0c;用于指向宿主机的 IP 地址&#xff08;类似 macOS/Windows 中的行为&#xff09;。但这个功能在 Linux 上默认不启用&#xff0c;需要手动配置才能使用。以下是详细解释和…

C++GO语言微服务和服务发现②

01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令&#xff1a;micro new --type srv test66 框架默认自带服务发现&#xff1a;mdns。 使用consul服务发现&#xff1a; 1. 初始consul服务发现&…

Redis--常见数据类型List列表

目录 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、内部编码 一、概念 列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&…

QListWedget控件使用指南

QListWedget公共函数 函数签名功能描述QListWidget(QWidget *parent nullptr)构造函数&#xff0c;创建一个QListWidget对象&#xff0c;可指定父部件&#xff08;默认为nullptr&#xff09;。virtual ~QListWidget()虚析构函数&#xff0c;释放QListWidget对象及其资源。voi…

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…

【Qt】之音视频编程2:QtAV的使用篇

QtAV 基本播放控制功能实现&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暂停、停止、快进快退、截屏 等功能。以下是具体实现方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…

歌词滚动效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置标签页图标 --><link rel"shortcut icon&…

基于大模型的TIA诊疗全流程智能决策系统技术方案

目录 一、多模态数据融合与预处理系统1.1 数据接入模块1.2 数据预处理伪代码二、TIA智能预测模型系统2.1 模型训练流程2.2 混合模型架构伪代码三、术中智能监测系统3.1 实时监测流程3.2 实时预测伪代码四、智能诊疗决策系统4.1 手术方案推荐流程4.2 麻醉方案生成伪代码五、预后…

Java 日期解析与格式化:从标准格式到自然语言解析

使用 Java 搭配 Apache Commons Lang3 和 Natty 库&#xff0c;实现灵活高效的日期解析与格式化。 一、背景 将不同格式的日期统一成一个格式。日期格式可能有以下几种类型&#xff1a; 标准格式&#xff1a;2024-02-28、14/05/2022、2002年5月6日非英文月份缩写&#xff1a;…

Room持久化库:从零到一的全面解析与实战

简介 在Android开发中,Room作为官方推荐的数据库持久化库,提供了对SQLite的抽象层,使得数据库操作更加安全、高效且易于维护。 Room通过注解处理器和编译时验证,显著降低了数据库操作的复杂度,同时支持响应式编程模式,使开发者能够轻松实现数据变化的实时监听。对于企业…

MySQL(6)如何删除数据库和表?

在 MySQL 中删除数据库和表是常见的管理操作。下面将详细介绍如何使用 SQL 语句以及图形化工具来删除数据库和表。 步骤一&#xff1a;连接 MySQL 服务器 首先&#xff0c;连接到 MySQL 服务器&#xff0c;可以使用命令行工具 mysql 或图形化工具如 MySQL Workbench。 使用命…

携固态电池、新形态钢壳叠片电池等产品 豪鹏科技将亮相CIBF 2025

携固态电池、新形态钢壳叠片电池等产品 豪鹏科技将亮相CIBF 2025 来源&#xff1a; 电池百人会-电池网 豪鹏科技&#xff08;展位号:14W001&#xff09;将携固态电池、新形态钢壳叠片电池及高安全性钠离子电池等前沿技术产品亮相CIBF 2025&#xff0c;凭借多年的技术积累和产…

React学习———useEffect和useLayoutEffect

useEffect useEffect是React的一个Hook&#xff0c;用于在函数组件中处理副作用。副作用包括数据获取、订阅、手动DOM操作以及其他需要再渲染后执行的操作 基本用法 useEffect(() > {// 副作用逻辑return () > {// 可选的清理函数} }, [依赖数组])第一个参数&#xff…

“天神之眼”计算平台的算力设计(预计500-1000 TOPS)

关于比亚迪“天神之眼”计算平台的算力设计&#xff08;预计500-1000 TOPS&#xff09;&#xff0c;其技术路径和行业意义值得深入探讨。以下从实现方式、技术挑战和行业影响三个维度展开分析&#xff1a; 1. 多芯片互联的技术实现路径 &#xff08;1&#xff09;芯片选型方案…

FPGA: Xilinx Kintex 7实现PCIe接口

在Xilinx Kintex-7系列FPGA上实现PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;接口&#xff0c;通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核&#xff0c;结合Vivado设计流程。以下是实现PCIe接口的详细步骤和关键点&#xff0c;适…

ArcGIS Desktop使用入门(二)常用工具条——图形

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

JT/T 808 通讯协议及数据格式解析

文章目录 一、引言二、协议数据帧结构三、消息头结构&#xff08;Message Header&#xff09;四、常用消息类型&#xff08;Message ID&#xff09;五、典型消息体结构解析六、数据转义规则七、校验码计算方法八、终端与平台通信流程示意&#xff08;简要&#xff09;九、平台接…

Rust 输出到命令行

Rust 输出到命令行 引言 Rust 是一门系统编程语言&#xff0c;以其高性能、内存安全、并发支持和零成本抽象等特性而闻名。在开发过程中&#xff0c;将 Rust 程序的输出传递到命令行是常见的需求。本文将详细介绍 Rust 输出到命令行的多种方法&#xff0c;帮助读者掌握这一技…

从字符串转换到矩阵快速幂:解决多次转换后的长度问题

引言 在编程竞赛和算法问题中&#xff0c;我们经常会遇到需要对字符串进行多次转换的问题。本文将介绍一个有趣的问题&#xff1a;给定一个字符串和转换规则&#xff0c;计算经过多次转换后字符串的长度。由于直接模拟会导致性能问题&#xff0c;我们将使用矩阵快速幂来高效解…

Vue2 elementUI 二次封装命令式表单弹框组件

需求&#xff1a;封装一个表单弹框组件&#xff0c;弹框和表单是两个组件&#xff0c;表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下&#xff1a; 直接上代码&#xff1a; MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…