Pikachu靶场——文件上传漏洞(Unsafe upfileupload)

news2024/11/20 1:36:09

文章目录

  • 1. Unsafe upfileupload
    • 1.1 客户端检查(client check)
      • 1.1.1 源代码分析
    • 1.2 服务端检查(MIME type)
      • 1.2.1 源代码分析
    • 1.3 getimagesize()
      • 1.3.1 源代码分析
    • 1.4 文件上传漏洞防御

1. Unsafe upfileupload

漏洞描述

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

漏洞原理

大部分的网站和应用系统都有上传功能,而程序员在开发文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。

漏洞危害

可能会导致用户信息泄露,被钓鱼,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限。最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统。

1.1 客户端检查(client check)

上传一个一句话木马的php文件

image-20230827192217817

发现只能上传图片

image-20230827191535960

修改文件的后缀名为.png,然后进行抓包。

image-20230827192240556

修改上传文件的后缀名。

image-20230827192332755

上传成功

image-20230827192343421

使用中国蚁剑进行连接

image-20230827192456013

虚拟终端

image-20230827192947351

1.1.1 源代码分析

clientcheck.php

image-20230916205708800

说明:这里过滤方式是白名单过滤,但是放在了前端进行校验。前端的一切过滤都可以被绕过。

1.2 服务端检查(MIME type)

MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

MIME 在传输数据时使用两个主要的元素:类型和子类型。前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类,常见的MIME类型,比如:

超文本标记语言文本.html texthtml

普通文本.txt text/plain

RTF文本.rtf application/rtf

GIF图形.gif image/gif

JPEG图形.ipeg.jpg image/jpeg

说明:服务端会对上传的数据中的content-type字段进行检测,判断其是否为指定的文件格式。

随便上传一个文件,回显出限制上传的文件格式。

image-20230828214945555

这里只能上传jpg,jpeg,png格式的文件,典型的白名单。

这里我们上传一个wuhu.php文件,然后点击开始上传的时候抓包。

修改Content-Type值为:image/jpeg

image-20230828215544666

然后文件就上传成功了,页面显示出了文件的上传路径。

image-20230828215605845

使用中国蚁剑进行连接

image-20230828215727739

1.2.1 源代码分析

servercheck.php

image-20230916200114909

说明:$mime是一个包含合法MIME类型的数组,也就是MIME类型白名单。然后将这个白名单作为参数传入了upload_sick()函数进行服务器端的检测。

uploadfunction.php

image-20230916202748991

upload_sick()函数的定义如下,该函数不安全之处在于两点:

  1. 仅检查了MIME类型,可以通过抓包修改进行绕过。

  2. 保存文件的时候没有重命名文件,这样即使网页不回显文件保存路径,也有很大概率可以被攻击者猜测到。

如果上传文件的路径被攻击者获得了,那么就可以连接shell了。

1.3 getimagesize()

使用getimagesize() 进行文件内容检测,只检测文件头部

文件幻数

getimagesize()函数判断一个文件是否是图片的时候,采用的是文件幻术。

在这里插入图片描述

所有的GIF文件都是47 49 46 开头的。

这里我们上传一个以png结尾的一句话木马,然后使用bp抓取数据包,在文件内容里面的头部添加GIF89a

在这里插入图片描述

上传成功

在这里插入图片描述

虽然上传成功了,但是现在蚁剑还是连接不上,需要结合文件包含漏洞去实现。

http://192.168.188.183/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/09/09/76459764fc0cb7785d8730212793.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

image-20230909142324425

蚁剑连接成功

image-20230909142227816

1.3.1 源代码分析

getimagesize.php

image-20230916195229968

说明:指定了两个白名单,$_type是文件后缀名的白名单,$_mime是MIME type的白名单,然后将两个白名单和一些其他参数一起传入到uploadfunction.php文件中的upload()函数。

uploadfunction.php

image-20230916195134244

说明:在upload()函数中使用了getimagesize()方法来判断是否是图片,使用文件幻数也可以进行绕过。

1.4 文件上传漏洞防御

  • 采用白名单的方式验证文件的后缀名。
  • 限制上传文件的大小,限制上传文件的类型。
  • 验证文件的上传方式。
  • 对文件进行一定复杂的重命名。
  • 进行二次渲染,过滤图片木马
  • 不要暴露文件上传后的路径。

可参考我写的另一篇文章里面对改漏洞有详细说明:任意文件上传。

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

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

相关文章

springboot中的@Configuration详解~

作用1:告诉springboot这是一个配置类,等同于之前在spring中的配置文件,而且配置类中可以使用Bean标注在方法上给容器注册组件,该组件默认也是单例 创建pet: package com.springboot.bean;import lombok.AllArgsConstructor; import lombok.…

【进阶C语言】进阶指针--学会所有指针类型

本节内容大致目录: 1.字符指针 2.指针数组(数组) 3.数组指针 (指针)--比较重要 4.函数指针--比较重要 5.函数指针数组--用的较少 6.指向函数指针数组的指针--只需要了解就可以 需要掌握每一种类型的符号和用处。…

Google ProtoBuf介绍

一、背景 前段时间了解到有公司用gRPC、Pulsar、Nacos、SkyWalking、OpenTelemetry、Prometheus、Envoy、Grafana、Sonar、PowerJob、Apollo 这些技术,也是Java路线的,很惭愧,这些我几乎都不了解,从13年以来玩Android、玩Python、…

Java 多输入框查询需求实现

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 多输入框查询 需求分析 任意一个输入框,输入内容点击搜索都可以精准搜索到对应的内容 代码实现 Controller接口编写 PostMapping("merchant/manage&…

文献阅读:RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback

文献阅读:RLAIF: Scaling Reinforcement Learning from Human Feedback with AI Feedback 1. 文章简介2. 方法介绍 1. 整体方法说明 3. 实验结果 1. RLHF vs RLAIF2. Prompt的影响3. Self-Consistency4. Labeler Size的影响5. 标注数据的影响 4. 总结 & 思考 文…

SpringCloudGateway网关中各个过滤器的作用与介绍

文章目录 RemoveCachedBodyFilterAdaptCachedBodyGlobalFilterNettyWriteResponseFilterForwardPathFilterRouteToRequestUrlFilterWebSocketRoutingFilterNettyRoutingFilterForwardRoutingFilterDispatcherHandler 是什么?⭐如何确定最后的路由路径?下…

一文拿捏Spring之AOP

Spring 1.Spring的理解 1.狭义上 指SpringFramework,特别的控制反转、依赖注入、面向切面、等特性 2.广义上 Spring家族的一系列产品,像SpringMVC、SpringBoot、SpringCloud等 2.aop 🌟面试题(aop): 简单介绍一下AOP? aop…

【userfaultfd】2021强网杯notebook

程序分析 老规矩,看下启动脚本 开启了 smep、smap、kaslr 保护,当然 kvm64 默认开启 kpti 保护 文件系统初始化脚本 #!/bin/sh /bin/mount -t devtmpfs devtmpfs /dev chown root:tty /dev/console chown root:tty /dev/ptmx chown root:tty /dev/tty…

SAAJ:SOAP with Attachments API for Java

介绍 支持带附件的SOAP消息Java接口(SAAJ:SOAP with Attachments API for Java),定义了一套API,使开发者可以产生、消费遵从SOAP 1.1, SOAP 1.2, 和SOAP Attachments Feature的消息。 2019年SAAJ更改为新的名字&…

MIP精确算法的关键——确定界

目录 1.界是什么? 2. 如何更新上下界 2.1 以分支定界为框架的一系列算法 2.2 benders分解 MIP精确算法包含,分支定界、分支切割、分支定价还有benders分解等等。前者是以分支定界为框架的一类算法;后者是以分解为框架的一类算法。甚至还包…

Springboot学习笔记——1

Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starte…

嵌入式软件架构基础设施设计方法

大家好,今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西,众说纷纭,各有观点。在我看来,软件架构是软件系统的基本结构,包含其组件、组件之间的关系、组件设计与演进的规则,以及体现这些规则的基…

Nginx高级 第一部分:扩容

Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…

【C/C++笔试练习】——常量指针和指针常量、结构体内存分配、统计输入的字母个数、排序子序列、倒置字符串

文章目录 C/C笔试练习1.常量指针和指针常量(1)常量指针和指针常量的定义(2)判别常量指针和指针常量(3)常量指针和指针常量的特性 2.结构体内存分配(4)计算结构体大小(5&a…

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”。 CPU的工作流程? CPU 的工作流程分为以下 5 个阶段:取指令…

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么? c 中有两种容器类型:关联式容器与序列式容器(顺序容器) 关联式中的容器是按照关键字来存储与访问的,序列式容器(顺序容器)则是元素在容器中的相对位置来存储与访问的。…

C++标准模板(STL)- 类型支持 ()

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 实现定义的空指针常量 NULL 定义于头文件 <clocale> 定义于…

2.类与对象 拜访对象村

2.1 椅子大战 在图形接口画出正方形、圆形与三角形。当用户选点图形时&#xff0c;图形需要顺时针转360并依据形状的不同播放播放不同的AIF文件。胜者可以坐上名贵宝椅。 面向过程&#xff1a; rotate(shapeNum) {//旋转360 } playSound(shapeNum) {//查询播放哪个AIF文件//播…

嵌入式Linux应用开发-驱动大全-同步与互斥②

嵌入式Linux应用开发-驱动大全-同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1.3.4.1…