网络安全之文件上传漏洞(上篇)(技术进阶)

news2024/12/23 17:16:28

目录

一,什么是文件上传漏洞?文件上传漏洞会造成什么危害?

二,文件上传靶场upload-labs闯关

Pass-01

Pass-02

 Pass-03

 Pass-04

 Pass-05

Pass-06

 Pass-07

​Pass-08

Pass-09

 Pass-10

 总结


一,什么是文件上传漏洞?文件上传漏洞会造成什么危害?

文件上传漏洞就是服务器端脚本没有对上传的文件进行严格的过滤和验证,导致黑客利用这个漏洞上传恶意脚本从而达到控制整个网站甚至是服务器。

二,文件上传靶场upload-labs闯关

Pass-01

源码:

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;//得到上传的文件
    if (file == null || file == "") {  //判断是否上传了文件或是否为空
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";  //可以看到这里应该是个白名单
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));  //找到文件最后一个.并把后面的内容切给ext_name
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {  //和白名单进行匹配没有匹配到就是-1
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);  //输出错误警告
        return false;
    }
}

看完注释和代码后可以知道这是一个js前端验证,这个非常简单只需要将上传的木马病毒修改后缀为白名单里面的内容,然后再通过bp抓包修改文件后缀就可以轻松绕过了。

看效果:

1,新建一个一句话木马

<?php
phpinfo();
?>

2,修改后缀为.jpg,然后上传文件

 3,开启bp抓包

 4,抓到数据包,修改test.jpg为test.php

 5,放开修改后的数据包

 

 

 总结解题思路:

看代码知道是前端验证,那么我咋知道是前端验证的呢?前端验证一般是写在JavaScript,css,html中的在浏览器里面F12就可以看到这些代码,而且前端验证不需要把数据给后台验证,它会对我们输入的数据直接进行验证,且快速返回判断结果给用户。

前端验证讲了再讲一件什么是后端验证吧,后端验证就是把数据传输到服务器端,由服务器端进行

数据的正确性验证,这样可以防止用户修改信息和绕过保证了数据的完整性和安全性。

Pass-02

查看源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {  //判断用户是否点击了提交按钮
    if (file_exists(UPLOAD_PATH)) {  //判断是否上传了文件
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {  //对文件类型进行验证
            $temp_file = $_FILES['upload_file']['tmp_name'];  //将临时文件路径给$temp_file
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] //上传的文件将要存放的路径    
            if (move_uploaded_file($temp_file, $img_path)) {  //将临时文件移动到指定路径

          $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

  

代码和解析看完后也可以知道这是一个前端验证,更改数据类型为白名单里面的类型

1,先开启bp抓包然后上传一个test.php

2,更改文件类型为image/gif 

 3,放开数据包,发现上传成功

4,访问一句话木马

 Pass-03

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');  //可以看出来这是一个黑名单
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if(!in_array($file_ext, $deny_ext)) { //判断是不是黑名单里的数据
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
 

看完代码和注释,我们可以看出这是一个黑名单验证,但是它没有禁用 phtml和php3这两个后缀,apache中会把这两个后缀的文件当成php文件来执行,所有我们只需要将php后缀改为php3就好了。

看效果:

 

phtml效果也是一样这里不演示了。

 Pass-04

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".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");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

 可以看到它做的挺绝的,但是它忽略了一个.htaccess文件,这个文件可以轻松禁用和启用任何功能。

.htaccess代码:

<FilesMatch  "loudong.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

它的作用是将上传的loudong.jpg文件当作一个php文件来执行

1,先把.htaccess上传上去,然后上传loudong.jpg

2,去访问看看

 Pass-05

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
 

通过分析源代码发现它没有做小写转换,那么就简单了直接把后缀改成大写上传,要知道的是windows操作系统对文件名不区分大小写,所以改成大写它也可以运行

直接看效果

 

Pass-06

源代码:

 $is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
        $file_name = $_FILES['upload_file']['name'];
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file,$img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

通过分析源代码可以知道它没有首位去空格,那么就简单了,在文件后缀末尾加个空格就可以轻松绕过。

 1,通过bp抓包并在php后加个空格

2,上传成功后去访问文件

 Pass-07

 源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $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,通过bp抓包修改后缀

2,上传成功后去访问

 Pass-08

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
 

通过分析源代码可以得知它少了个删除::$DATA的语句,所以我们直接在后缀php后面加上::$DATA就行了。

1,抓包修改后缀

2,访问看效果

 

这里浅谈一下::DATA的作用吧,它是用于NTFS文件系统中用来隐藏数据流的一种标识符,但是它的出现并不影响文件的主要内容。

Pass-09

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $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 . '文件夹不存在,请手工创建!';
    }
}

存在漏洞的deldot函数

<?php
function deldot($s){
    for($i = strlen($s)-1;$i>0;$i--){
        $c = substr($s,$i,1);
        if($i == strlen($s)-1 and $c != '.'){  //从这里可以看出它对末尾.号进行了判断,但是它一遇到其他字符就跳出了
            return $s;
        }

        if($c != '.'){
            return substr($s,0,$i+1);
        }
    }
}
?>

 可以看到它删了但是又没有完全删(只删了最后一个),所以我们只需要在后缀上加上点空格点就可以绕过了

看效果

1,老样子抓包改后缀

 2,去访问

 Pass-10

源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']); //将文件名首尾去空并提取出来
        $file_name = str_ireplace($deny_ext,"", $file_name);//判断是不是黑名单里面的如果是就用空串把它替换掉
        $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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

 trim函数的作用是首位去空

str_ireplace(黑名单,"要替换为的字符串",上传的文件名);它的作用是那我们上传的文件名去黑名单里面找相同的字符,如果找到了就用空串替换(也就是删除了),所以我们只需要将后缀改为

test.pphphp,它会从前往后把第一个php给删了(看代码它只删了一次),但是没想到又合成了个php吧。

看效果:

1,抓包改后缀

2,访问

 总结

文件上传绕过方法不是一成不变的,我这里一关列举了一种方法,在熟练运用后会发现原来同一关可以有多个绕过方法,所以灵活运用晓其原理才能更好的玩转文件上传漏洞

中篇下个星期一更

谢谢观看!!!

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

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

相关文章

学习Java,下载Java和工具

下载Java地址Java17 https://www.oracle.com/cn/ 下载notepad 的博客 https://blog.csdn.net/xnxqwzy/article/details/132243264 环境变量配置

【服务器部署篇】Linux下快速安装Jenkins

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

2024LarkXR新增功能系列之五 | 单端口支持多并发

实时云渲染技术在为虚拟现实、游戏、和各种应用程序提供强大的渲染支持的同时&#xff0c;也带来了一些网络和运维上的挑战。在传统的设置中&#xff0c;实时云渲染推流技术需要为每个视频流单独占用服务器的一个端口。这种方法在多用户同时访问的情况下可能会导致端口资源的快…

为什么选择誉天云服务HCIE课程

誉天云服务HCIE课程亮点&#xff1a; 深度融合云原生 包含原生K8s和docker内容&#xff0c;引入isito和ASM功能进行微服务治理&#xff0c;结合Linux功底设计云上性能优化&#xff0c;和架构设计。师资力量强大 课程由两名5HCIE认证讲师授课&#xff0c;认证辅导由已通过HCIE-C…

flash_attn安装

flash_attn安装 1. cuda-nvcc安装 https://anaconda.org/nvidia/cuda-nvcc2. torch安装 # https://pytorch.org/ # 找到对应cuda版本的torch进行安装 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1213. flash_attn安装 访问…

头条系统-01-环境搭建、SpringCloud微服务(注册发现、服务调用、网关)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)项目介绍2)项目概述2.1)学习到的技术内容2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备注&#xff1a; 4.2)nacos安装 5)初始工程搭建5.1)环境准备连接G…

LT1964ES5-5 低压差稳压器 200mA 贴片SOT-23-5 使用案例

LT1964ES5-5 微功耗 线性稳压器 LT1964ES5-5 是一款微功耗、低噪声、低dropout的负电压线性稳压器。它的功能是将输入电压转换为稳定的负输出电压&#xff0c;范围在-1.22V到-20V之间&#xff0c;最大输出电流为200mA。该器件特别适用于需要精密调节和低噪声电源的电路中&#…

[详解]Spring AOP

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 什么是AOP? Spring AOP 快速入门 Spring AOP核心概念 切点(Point…

普乐蛙元宇宙VR体验馆设备集体亮相VR文旅景区展

普乐蛙全国巡展又双叒叕开始了! 这次来到的是“好客山东”↓↓ 山东2024休闲旅游产业展 4月25日至27日&#xff0c;2024休闲旅游产业展在临沂国际博览中心举办。本次展会以“潮购文旅好品&#xff0c;乐享时尚生活”为主题&#xff0c;汇聚全国文旅产业上下游500多家企业、上万…

SkyWalking 自定义Span并接入告警

图容易被CSDN吞掉&#xff0c;我在掘金也发了&#xff1a;https://juejin.cn/post/7361821913398837248 我就是这么膨胀 最近在做 OpenAI API 套壳&#xff0c;当我使用 okhttp-sse 这个库进行流式内容转发的时候&#xff0c;我发现有些回调方法 SkyWalking 不能抓取到。这就…

Java---数据类型与变量

1.字面常量 字面常量就是我们经常所说的常量&#xff0c;常量即在程序运行期间&#xff0c;固定不变的量。且常量是无法改变的&#xff0c;如果我们的代码有改变常量的操作&#xff0c;程序就会报错。 1.1字面常量的分类 字符串常量&#xff0c;整型常量&#xff0c;浮点数常…

Windows命令行基本命令

目录 什么是相对路径和绝对路径&#xff1f; 一、目录&#xff08;文件夹&#xff09;和文件操作 1.cd命令 用于切换目录 2.dir命令 用于显示目录和文件列表 3.md或mkdir命令 创建文件&#xff0c;也可以创建多级子目录 4.rd命令 用于删除目录 5.move命令 用于移动…

C++|STL-list运用(1)

cplusplus.com/reference/list/list/?kwlist list介绍 list是一个双向循环链表&#xff0c;双向循环链表它的每个节点都有两个链接&#xff0c;一个指向前一个节点&#xff0c;另一个指向下一个节点&#xff0c;且最后一个结点指向头节点。 结点组成 1.数据域 2.指针域 &a…

基于SpringBoot+Vue高校宣讲会管理系统设计与实现

项目介绍&#xff1a; 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息…

请编写函数fun,该函数的功能是:将M行N列的二维数组中的数据,按行的顺序依 次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

2024年五大企业邮箱最新排名:价格与服务全面对比

在选择企业邮箱时&#xff0c;我们都需要对比企业邮箱价格和邮箱服务。国内五大企业邮箱有Zoho Mail、新浪、网易、腾讯、阿里&#xff0c;这些企业邮箱功能各有偏重点&#xff0c;价格也不一&#xff0c;到底排名如何&#xff1f;我们今天来进行个价格和服务的全面对比。 一、…

家政行业赋能链动:商业模式创新开启全新篇章

大家好&#xff0c;我是微三云周丽&#xff01; 在当今娱乐行业蓬勃发展的背景下&#xff0c;越来越多的年轻人对卫生打理的需求逐渐增加&#xff0c;同时也催生了家政行业的兴起。 然而&#xff0c;如何在激烈的竞争中脱颖而出&#xff0c;成为家政行业面临的重要挑战。本文…

【智能算法】火烈鸟搜索算法(FSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;W Zhiheng等人受到火烈鸟迁徙觅食行为启发&#xff0c;提出了火烈鸟搜索算法&#xff08;Flamingo Search Algorithm, FSA&#xff09;。 2.算法原理 2.1算法思想 FSA受到火烈鸟…

【unity】三维数学应用(计算线和面的交点)

【unity】三维数学应用&#xff08;计算线和面的交点&#xff09; 实现方法有多种&#xff0c;下面介绍一种简单的方法。利用一个点指向面上任意点的向量&#xff0c;到该面法线的投影长度相同的基本原理&#xff0c;结合相似三角形既可以求出交点。 原理 如下图 GD组成的线段…

win11 Windows ADK制作的win pe中没有manage-ade命令或命令无法正常工作解决办法

解决办法 不使用win pe&#xff0c;而是使用Windows安装程序。 将iso镜像烧录到u盘&#xff0c;然后从它引导。 按shift f10弹出cmd&#xff0c;里面存在manage-bde且正常工作。 其他 win pe找不到命令manage-ade 在win pe上使用manage-ade需要一个包 a&#xff0c;adk制作…