Java-sec-code学习2

news2024/12/27 12:51:45

Java-Sec-Code学习1-文件上传漏洞

case1

url: http://127.0.0.1:8080/file/any
这是一个典型的上传页面,我们尝试上传一个文件试试看。
在这里插入图片描述
直接上传一个jsp文件,发现可以直接上传,非常顺利。这意味这后端和前端都没有对文件类型进行任何限制。
在这里插入图片描述
此外也提供了保存位置的回显,那么我们可以去尝试访问一下。访问不了,看来很有可能是存文件在linux 的临时目录/tmp里了而不是web目录下。
看一下后端源码怎么写的:

@PostMapping({"/upload"})
    public String singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
        if (file.isEmpty()) {
            redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
            return "redirect:/file/status";
        } else {
            try {
                byte[] bytes = file.getBytes();
                Path path = Paths.get("/tmp/" + file.getOriginalFilename());
                Files.write(path, bytes, new OpenOption[0]);
                redirectAttributes.addFlashAttribute("message", "You successfully uploaded '/tmp/" + file.getOriginalFilename() + "'");
            } catch (IOException var5) {
                IOException e = var5;
                redirectAttributes.addFlashAttribute("message", "upload failed");
                this.logger.error(e.toString());
            }

            return "redirect:/file/status";
        }
    }

只要文件不空,就直接保存文件到/tmp/+文件名的目录下。这里没有对文件类型进行任何的处理、过滤和限制,就直接调用了Files.write()方法去保存文件。这里其实还有另一个问题,这个目录拼接的方式,可以尝试进行目录跨越。恶意文件可以保存到其他有写权限的目录中,直接通过…/来实习目录跨越。
最后,通过redirectAttributes.addFlashAttribute()来返回提示到前端,并重定向到/file/status路由。那么/file/status路由主要用来返回上传状态。

Case2

URL:http://127.0.0.1:8080/file/pic
在这里插入图片描述
这是一个图片上传的case,看起来应该是做了过滤。我们看看还能不直接上传。
在这里插入图片描述
果然被识别到了非法图片,那我们试试看修改content-type看看能不能绕过。
在这里插入图片描述
没有成功,看来是判断的后缀,png也不行成功。让我们看看他具体的后端代码:

    @PostMapping({"/upload/picture"})
    @ResponseBody
    public String uploadPicture(@RequestParam("file") MultipartFile multifile) throws Exception {
        if (multifile.isEmpty()) {
            return "Please select a file to upload";
        } else {
            String fileName = multifile.getOriginalFilename();
            String Suffix = fileName.substring(fileName.lastIndexOf("."));
            String mimeType = multifile.getContentType();
            String filePath = "/tmp/" + fileName;
            File excelFile = this.convert(multifile);
            String[] picSuffixList = new String[]{".jpg", ".png", ".jpeg", ".gif", ".bmp", ".ico"};
            boolean suffixFlag = false;
            String[] mimeTypeBlackList = picSuffixList;
            int var10 = picSuffixList.length;

            int var11;
            for(var11 = 0; var11 < var10; ++var11) {
                String white_suffix = mimeTypeBlackList[var11];
                if (Suffix.toLowerCase().equals(white_suffix)) {
                    suffixFlag = true;
                    break;
                }
            }

            if (!suffixFlag) {
                this.logger.error("[-] Suffix error: " + Suffix);
                this.deleteFile(filePath);
                return "Upload failed. Illeagl picture.";
            } else {
                mimeTypeBlackList = new String[]{"text/html", "text/javascript", "application/javascript", "application/ecmascript", "text/xml", "application/xml"};
                String[] var15 = mimeTypeBlackList;
                var11 = mimeTypeBlackList.length;

                for(int var18 = 0; var18 < var11; ++var18) {
                    String blackMimeType = var15[var18];
                    if (SecurityUtil.replaceSpecialStr(mimeType).toLowerCase().contains(blackMimeType)) {
                        this.logger.error("[-] Mime type error: " + mimeType);
                        this.deleteFile(filePath);
                        return "Upload failed. Illeagl picture.";
                    }
                }

                boolean isImageFlag = isImage(excelFile);
                this.deleteFile(randomFilePath);
                if (!isImageFlag) {
                    this.logger.error("[-] File is not Image");
                    this.deleteFile(filePath);
                    return "Upload failed. Illeagl picture.";
                } else {
                    try {
                        byte[] bytes = multifile.getBytes();
                        Path path = Paths.get("/tmp/" + multifile.getOriginalFilename());
                        Files.write(path, bytes, new OpenOption[0]);
                    } catch (IOException var14) {
                        this.logger.error(var14.toString());
                        this.deleteFile(filePath);
                        return "Upload failed";
                    }

                    this.logger.info("[+] Safe file. Suffix: {}, MIME: {}", Suffix, mimeType);
                    this.logger.info("[+] Successfully uploaded {}", filePath);
                    return String.format("You successfully uploaded '%s'", filePath);
                }
            }
        }
    }

从源代码中可以看到后端会获取后缀和content-type。
在这里插入图片描述
后缀采用白名单如图中的图片后缀,后缀获取时通过找最后一个.符号后的子串。
在这里插入图片描述
后续对content-type的对比,使用了黑名单策略,出现数组中的这些MIME类型都不行。
在这里插入图片描述
那为什么刚才我们给webshell改后缀和content-type还是不行呢?破案了,原来是这里还有一个是否图片的检查,我们跟进isImage方法看看。
在这里插入图片描述看起来是利用了java.awt.image.ImageIO#read()方法来解析图片,我们的是webshell肯定无法成功解析,因此bi实际上为null了,返回值自然为false。也就出现了文件不是图片的提示了。
isImage()检查通过后,文件将会被保存。
正常的这个流程,已经是无法实现写非图片文件了。但是你可以注意到在一开始上传时实际上会调用一个自定义的convert函数来保存临时文件,实际上他还是写了临时文件到预设的目录。只不过是通过UUID来命名,没有提供相关回显出来,无法知道其名称。
但是,无法否认的是恶意文件确实被写入了系统。
在这里插入图片描述
你可能会发现,实际上代码中有一个deleteFile的方法用来删除文件,主要用在文件不合规的时候删除文件。但是这里有一个问题在于,发现文件不合规后删除的文件居然是filePath变量的路径,这里我不理解啊。没有成功通过所有检查根本就不会吧filePath作为文件路径去保存文件,这里的删除毫无意义啊。我理解是不是想要把convert出来的临时文件给删除了,但是这里写错了。如果需要删除临时文件的话,那这个convert方法就必须多加一个返回值了,把这个randomPath给回传出来,在deleteFile里传入去删除。只有这样,才能确保及时恶意文件临时落地后,检查一旦不通过就会被清除。
以上是我个人的一些理解,我觉得这个deleteFile有点不合理。

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

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

相关文章

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【LeetCode每日一题】——724.寻找数组的中心下标

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 724.寻找数组的中心下标 四【…

python基础路径的迁移

本人未安装anaconda或pycharm等&#xff0c;仅安装了某个python环境&#xff0c;因此以下方法仅针对基础python环境的迁移&#xff0c;不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量&#xff0c;将原来的python路径…

胤娲科技:AI绘梦师——一键复刻梵高《星空》

想象一下&#xff0c;你手中握有一张梵高的《星空》原图&#xff0c;只需轻轻一点&#xff0c;AI便能化身绘画大师&#xff0c;一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段&#xff0c;而是华盛顿大学科研团队带来的“Inverse Painting”项目&#xff0c;正悄然改变…

【软件工程】McCabe复杂度计算

文章目录 一、定义与公式二、计算步骤三、示例四、注意事项 McCabe复杂度&#xff0c;又称为环路复杂度&#xff08;Cyclomatic Complexity&#xff09;&#xff0c;是一种用来度量软件程序复杂度的经典方法。它通过计算程序中独立路径的数量&#xff0c;帮助开发人员理解代码的…

CMIP6数据处理 ▎单点降尺度、统计方法的区域降尺度、基于WRF模式的动力降尺度

CMIP6数据被广泛应用于全球和地区的气候变化研究、极端天气和气候事件研究、气候变化影响和风险评估、气候变化的不确定性研究、气候反馈和敏感性研究以及气候政策和决策支持等多个领域。这些数据为我们理解和预测气候变化&#xff0c;评估气候变化的影响和风险&#xff0c;以及…

【从感知机到神经网络】

感知机 什么是感知机 公式、框图表示 直观举例 根据身高体重判断胖瘦的感知机。 1、根据已知样本训练出一条直线&#xff0c;用于对非训练样本进行分类&#xff0c;这条直线就是感知机模型。 三维情况下感知机模型是一个平面 感知机的缺陷 缺陷原因 不能处理异或问题&…

【hot100-java】路径总和 III

二叉树篇。 灵神题解 ps: 完结 历时许久的hot100终于结束了&#xff0c;先是python&#xff0c;后是java。 学到了不少语法&#xff0c;也挺爽的&#xff0c;希望接下来几遍会更加熟悉哈哈哈。

解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第1章 ARM Cortex-M处理器简介

1. 三级流水线设计 解释:三级流水线设计意味着处理器在执行指令时可以同时处理多个步骤。这些步骤通常包括取指(Fetch)、译码(Decode)和执行(Execute)。好处:这种设计提高了指令的执行效率,使得处理器能够在每个时钟周期内完成更多的工作,从而提升整体性能。2. 哈佛总…

linux 效率化 - zsh + tmux

文章目录 简介涉及的资料/代码仓库让我们开始吧1. Oh my Zsh!2. 终端主题 - powerlevel10k &#xff08;赋能优雅终端界面&#xff09;3. Oh my Tmux!安装完成&#xff0c;再加点料1. tmux2. zsh 结语参考资料 简介 来看一段操作演示&#xff08;全程键盘&#xff0c;没有鼠标…

Linux系统——RAID

Linux系统——RAID 一、RAID二、模拟RAID创建使用1、创建RAID 52、挂载使用3、模拟RAID 5故障 三、RAID操作方式 一、RAID 冗余磁盘阵列 作用&#xff1a; 1、加快数据读写速度 2、提升数据可靠性 使用原则&#xff1a; 使用同品牌、同型号、同容量的硬盘 RAID 0 至少两块硬盘…

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

【IEEE独立出版 | 厦门大学主办】 第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 >>往届均已成功见刊检索…

harbor 如何做到物理删除镜像 harbor镜像清理脚本

一、背景 相比于nexus&#xff0c;harbor的一大优点是方便及时清理无用的docker镜像。本文就harbor怎么设置清理&#xff0c;梳理一下具体的操作办法。 harbor 版本是 v2.9.0 二、目标 随着我们推送至仓库的镜像越来越多&#xff0c;带来的一个最大运维问题就是存储空间的浪…

【Java IO流】对象与字节流的序列化和反序列化

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【Java IO流】对象与字节流的序列化和反序列化&#xff0c;首先了解, 本次主题有啥实际应用, 学习 ByteArrayOutputStream / ByteArrayInputStream 字节数组流, ObjectO…

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…

H7-TOOL的LUA小程序教程第14期:任意波形信号发生器,0-20mA输出和微型数控电源(2024-10-11,已更新)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

空间解析几何3-空间点到线段和平面的距离【附MATLAB代码】

目录 空间中点到线段的距离 空间中点到平面的投影和距离 matlab代码 空间中点到线段的距离 空间中点到平面的投影和距离 matlab代码 function [dis,P2,t] point2Line (A1,B1,C1) %求空间一点到一线段的最短距离 %[dis,P2,Q2]pointSegmentDistance(A,B,C) %A B为线段首末端…

【安当产品应用案例100集】021- 针对电网接入设备的控制指令安全解决方案

一、电网对接入设备的控制指令安全体现在哪些方面 电网接入设备的控制指令安全必要性不言而喻。为了保障电网的稳定运行、防止恶意攻击和破坏、提升电网智能化水平、满足法律法规和监管要求以及提升用户满意度和社会形象&#xff0c;必须加强电网接入设备的控制指令安全管理。…

2.html编辑器介绍

html编辑器介绍 HTML 编辑器推荐 理论上我们可以使用记事本进行html编码和开发&#xff0c;但是在实际开发html页面的时候&#xff0c;使用一些专业的开发工具可以使我们更加快速和高效的进行开发&#xff0c;下面介绍几种开发工具&#xff1a; VS Code&#xff1a;https://…

UE5 C++ 通过绑定编辑器事件实现控制柄顶点编辑

开发中经常会遇到编辑器环境中制作工具拖拽控制柄编辑内容的需求&#xff0c;此时可以通过Editor事件拿到对应回调&#xff0c;进行相应更新&#xff1a; 1.创建Mesh编辑Actor类 创建一个Mesh编辑Actor类&#xff0c;提供Mesh顶点编辑的相关逻辑。 .h: #pragma once#inclu…