Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

这篇具有很好参考价值的文章主要介绍了Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JNDI注入

什么是JNDI
JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。

JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。

简单从安全角度来看待JNDI就是Java中的一组接口,在其所支持的服务中最常用的就是RMI和LDAP服务
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议
通过这两种协议可以使目标服务器加载远程Class文件,攻击者通过构造Class文件来达到RCE的效果
在jdk中提供JDNI服务的有如下几个包

javax.naming:主要用于命名操作,它包含了命名服务的类和接口,该包定义了Context接口和InitialContext类;

javax.naming.directory:主要用于目录操作,它定义了DirContext接口和InitialDir- Context类;

javax.naming.event:在命名目录服务器中请求事件通知;

javax.naming.ldap:提供LDAP支持;

javax.naming.spi:允许动态插入不同实现,为不同命名目录服务供应商的开发人员提供开发和实现的途径,以便应用程序通过JNDI可以访问相关服务。

通过InitialContext类中的lookup()方法才能使用RMI和LDAP协议进行远程调用。
在其他组件中的包也存在引用lookup()方法的情况
比如

在RMI服务中调用了InitialContext.lookup()的类有:
org.springframework.transaction.jta.JtaTransactionManager.readObject()
com.sun.rowset.JdbcRowSetImpl.execute()
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)

在LDAP服务中调用了InitialContext.lookup()的类有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()

简单JNDIdemo代码示例

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

public class jndi {
    public static void main(String[] args) throws NamingException {
        String uri = "rmi://127.0.0.1:1099/work";
        InitialContext initialContext = new InitialContext();//得到初始目录环境的一个引用
        initialContext.lookup(uri);//获取指定的远程对象
    }
}

如果其中获取的远程对象可控的话,可以通过编写恶意的Class文件来使服务器来加载文件,达到命令执行的效果

import java.io.IOException;

public class Test {
    public Test() throws IOException {
        Runtime.getRuntime().exec("notepad");//调用计算器
    }
}

注入工具 JNDI-Injection-Exploit

详解参考
安全技术系列之JNDI注入
Java安全之JNDI注入

想要成功利用JNDI注入,这就要观察当前服务器的JDK版本,在不同版本号中所限制的内容都不一样

  • JDK 6u45、7u21之后:java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。
  • JDK 6u141、7u131、8u121之后:增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。
  • JDK 6u211、7u201、8u191之后:增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。
    如图.
    Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

Log4j漏洞

什么是Log4j

Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

利用原理

这里的漏洞原理是利用JNDI的服务机制从而进行远程加载文件,达到命令执行
首先log4j打印日志有四个级别:debug、info、warn、error,不管哪个方法打印日志,在正常的log处理过程中,对${这两个紧邻的字符做了检测,一旦遇到类似表达式结构的字符串就会触发替换机制。
一旦在log字符串中检测到${},就会解析其中的字符串尝试使用lookup()查询,因此只要能控制log参数内容,就有机会实现漏洞利用。
简单demo段示例:

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);

        //1、开发源码中引用漏洞组件如log4j
        //2、开发中使用组件的代码(触发漏洞代码)
        //3、可控变量去传递Payload来实现攻击
        //4、code接受payload要进行url编码
    }
}

Fastjson反序列化漏洞

什么是fastjson

在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。

简单demo段示例
首先定义User类

package com.Pengj;

//给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);
    }
}

调用执行命令的文件

package com.Pengj;

import java.io.IOException;

public class Run {
    public Run() throws IOException {
        Runtime.getRuntime().exec("calc");
    }
}

json数据序列化和反序列化

package com.Pengj;


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) {
        //将User进行实例化
        User u = new User();
        u.setAge(20);
        u.setName("Pengj");
        //json对象转换json数据							转换结果:{"age":20,"name":"Pengj"}
        String jsonString = JSONObject.toJSONString(u);
        System.out.println("这就是json格式:"+jsonString);

       //引入autotype功能后的对象转为json数据			转换结果:{"@type":"com.Pengj.User","age":20,"name":"Pengj"}	
        String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);
        System.out.println(jsonString1);
        


       
        //下面JSON -> 对象
        String test = "{\"@type\":\"com.Pengj.Run\",\"age\":20,\"name\":\"Pengj\"}";//修改包含类名信息后的json数据
        //将json数据进行反序列化
        JSONObject jsonObject = JSON.parseObject(test);
        System.out.println(jsonObject);

    }


}

在上述代码段中,使用JSONObject类中的toJSONString方法,将对象转换为json数据,并启用SerializerFeature.WriteClassName特性,将带有@type标记的类名信息也输出出来,完成对象转换为json数据的过程。
在将json数据使用JSON.parseObject方法反序列化为对象的时候,如果将类名信息修改为其他类,那么在反序列化过程中程序会尝试将@type标记的类信息反序列化到对象,从而加载@type所标记的类,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。例如将@type指定为包含lookup()方法的库中就可以实现JNDI注入。

ParserConfig.getGlobalInstance().setAutoTypeSupport(false);		//禁用autotype
ParserConfig.getGlobalInstance().setSafeMode(true);		//启用autotype

以上内容仅作学习记录,如有错误或瑕疵,欢迎批评指正,感谢阅读。文章来源地址https://www.toymoban.com/news/detail-706273.html

到了这里,关于Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Log4j2 - JNDI 注入漏洞复现(CVE-2021-44228)

    Apache log4j 是 Apache 的一个开源项目, Apache log4j2 是一个 Java 的日志记录工具。该工具重写了 log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。 l

    2024年02月07日
    浏览(33)
  • Web网络安全-----Log4j高危漏洞原理及修复

    Web网络安全-----红蓝攻防之信息收集 Log4j 即 log for java(java的日志) ,是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;

    2024年02月10日
    浏览(44)
  • 017-信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等

    1、CMS指纹识别-不出网程序识别 2、开发框架识别-PHPPythonJava 3、开发组件识别-Java常见安全漏洞组件 解决: 1、CMS识别到后期漏洞利用和代码审计 2、开发框架识别到后期漏洞利用和代码审计 3、开发组件识别到后期漏洞利用和代码审计 演示案例: ➢指纹识别-本地工具-GotoSc

    2024年01月21日
    浏览(40)
  • log4j漏洞详解

    log4j全名就是(log for java),就是apache的一个开源的日志记录组件 ,它在Java项目中使用的比较广泛。 使用方法:                 1.pom引入依赖                 2.获取logger实例                 3.logger.info() debug() error() warn()... 优点:功能丰富,易于集成

    2024年02月16日
    浏览(34)
  • JAVA安全之Log4j-Jndi注入原理以及利用方式

    什么是JNDI? JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI(Service Provider Interface)规范来实现,该规范定义了对JNDI提供者应实现的接口。在JNDI体系中,JNDI提供者是指实际提供命名和目录服务的软件组

    2024年01月19日
    浏览(76)
  • Log4j远程代码执行漏洞

    简介 漏洞描述 Apache Log4j 是 Apache 的一个开源项目,Apache log4j-2 是 Log4j 的升级,我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。 Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据日志

    2024年02月11日
    浏览(60)
  • log4j漏洞原理及攻击流程

    log4j漏洞最早出现在2021年11月24日一位阿里安全团队的员工发现的,上报到Apache之后,12月10日凌晨才被公开。该漏洞威胁等级较高。基本比肩与阿里当年的fastjson漏洞。 漏洞地址: Log4j是一种流行的Java日志记录工具,其升级版本Log4j 2存在安全漏洞。这个漏洞是由Log4j 2的lookup功

    2024年02月16日
    浏览(34)
  • 网络安全 log4j漏洞复现

    前言: log4j被爆出“史诗级”漏洞。其危害非常大,影响非常广。该漏洞非常容易利用,可以执行任意代码。这个漏洞的影响可谓是重量级的。 漏洞描述: 由于Apache Log4j存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最

    2024年02月09日
    浏览(52)
  • 安全学习_开发相关_Java第三方组件Log4j&FastJSON及相关安全问题简介

    Java Naming and Directory Interface (Java 命名和目录接口 ),JNDI 提供统一的客户端 API,通过不同的服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名服务和目录服务之间的交互。 Log4J: Apache的一个开源项目

    2024年02月05日
    浏览(47)
  • 深入解析著名的阿里云Log4j 漏洞

    几乎每个系统都会使用日志框架,用于记录日志信息,这些信息可以提供程序运行的上下文,但是日志过多也会影响系统的性能,所以好的日志框架应该是可靠,快速和可扩展的。 Apache Log4j2 是一个基于 Java 的日志工具,是Log4j的升级版本,引入了很多丰富的特性,包括高性

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包