ciscn2023国赛DeserBug复现
虽说题目不是很难,但是由于java题目做的还不是很多不太熟悉,而且java基础不牢,导致一些点让我思考了很久,这里记录一下
DeserBug题目jadx反编译源码
Testapp这里,直接根目录传一个bugstr参数,然后将内容base64解码后反序列化
Myexpect是一个异常类,没看出有什么特别的地方
然后题目附件还给了两个包commons-collections-3.2.2.jar,hutool-all-5.8.18.jar
特意给了一个3.2.2是为什么呢,查了一下commons-collections从3.2.2版本开始尝试序列化或反序列化InvokerTransformer类都会抛出UnsupportedOperationException异常
且该版本在一些危险的Transformer实现类的readObject前加上了FunctorUtils#checkUnsafeSerialization来检测反序列化是否安全。
然后没什么思路了,去看wp当时题目还给了两个提示
cn.hutool.json.JSONObject.put->com.app.Myex ...
Jackson原生反序列化
参考文章:https://xz.aliyun.com/t/12509?u_atoken=0f8fa2b10f046b73ed286030e1ee9f9e&u_asig=1a0c381017287414696367848e00f7
前言Jackson的原生反序列化主要是为了触发任意getter方法调用链子,类似fastjson原生反序列化触发getter那样
getter触发流程既然要调用任意getter方法,那我们就要触发getter方法的流程
Jackson触发getter是在ObjectMapper#writeValueAsString方法执行的时候
打个断点跟踪一下
这里说几个关键方法
先走到DefaultSerializerProvider#serializeValue方法
这里获取一个序列化器,我们传入了POJO对象,所以返回一个BeanSerializer
然后去到BeanSerializer#serialize方法
writeStartObject和writeEndObject就是分别在首尾写上’{‘和’}’
调用getter方法就在serializeFie ...
fastjson原生反序列化
看了fastjson的各版本链子,再看一下fastjson的原生反序列化,看的是y4师傅的两篇文章
https://y4tacker.github.io/2023/03/20/year/2023/3/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/
https://y4tacker.github.io/2023/04/26/year/2023/4/FastJson%E4%B8%8E%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-%E4%BA%8C/
来简单的学习复现一下
利用限制Fastjson1版本小于等于1.2.48(不过1.2.49之后也有绕过方法,这里指的是直接用不需要绕过的)
Fastjson2<=2.0.26(我自己测试刚好在文章版本的下一个版本2.0.27开始就不行了)
找链子要用原生反序列化,就需要寻找fastjson中继承了Serializable接口的类,fastjson里面有两个这样的类:JS ...
Hessian反序列化
来学一下Hessian反序列化,主要参考su18师傅的文章:
Hessian简介直接抄su18师傅里面的
Hessian 是 caucho 公司的工程项目,为了达到或超过 ORMI/Java JNI 等其他跨语言/平台调用的能力设计而出,在 2004 点发布 1.0 规范,一般称之为 Hessian ,并逐步迭代,在 Hassian jar 3.2.0 之后,采用了新的 2.0 版本的协议,一般称之为 Hessian 2.0。
这是一种动态类型的二进制序列化和 Web 服务协议,专为面向对象的传输而设计。Hessian 协议在设计时,重点的几个目标包括了:必须尽可能的快、必须尽可能紧凑、跨语言、不需要外部模式或接口定义等等。
对于这样的设计,caucho 公司其实提供了两种解决方案,一个是 Hessian,一个是 Burlap。Hession 是基于二进制的实现,传输数据更小更快,而 Burlap 的消息是 XML 的,有更好的可读性。两种数据都是基于 HTTP 协议传输。
Hessian 本身作为 Resin 的一部分,但是它的 com.caucho.hessia ...
反射修改变量
低版本修改final和static参考文章:https://www.cnblogs.com/noKing/p/9038234.html
修改static变量这里和正常修改普通变量一样都是没问题的
import java.lang.reflect.Field;public class Test1 { public static String str="ceshi"; public static void main(String[] args) throws Exception { Test1 test1 = new Test1(); Class test1Class = Test1.class; //修改static变量 Field str1 = test1Class.getDeclaredField("str"); str1.setAccessible(true); str1.set(test1,"ceshi1" ...
Mysql-JDBC反序列化
来学一下常见的JDBC反序列化,是MYSQL的,参考文章:https://tttang.com/archive/1877/
JDBC简单介绍一个简单的查询demo
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class Main { public static void main(String[] args) throws Exception { //加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //建立连接,可能要设置一下时区,可以设置为上海 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone ...
传统web应用型内存马
这里是本菜鸡开始学习内存马的起始文章
有关内存马的认知可以看看su18师傅的这篇文章:https://mp.weixin.qq.com/s/NKq4BZ8fLK7bsGSK5UhoGQ
有关tomcat源码分析的文章:Tomcat源码初识一 Tomcat整理流程图_tomcat流程图-CSDN博客
然后这里有一篇总结得特别全得内存马文章:https://paper.seebug.org/3120/
这里放一张文章中的源码分析的初始化流程图:
做个参考对大致流程有个概念
调试的时候我突然发现不应该开启tomcat的自动打开浏览器,这样调试访问前或者访问后的逻辑是才不会那么乱😢
因为他默认是在我们访问后才会去创建实例
Servlet内存马简单demo先写一个简单的demo然后再分析一下原理吧,先看看效果
这里用了使用了tomcat8,tomcat10用那个demo有些类找不到
要看源码的话需要导入对应tomcat版本的依赖
<dependency> <groupId>org.apache.tomcat</groupId> <artif ...
Tomcat中间件内存马
其实前面的传统web应用内存马也是tomcat这部分的,因为它基于tomcat进行分析不过问题不大,别的中间件应该也是有这些基本组件的。
Tomcat-Valve内存马valve就是前面文章中说过的阀门,也就是pipeline(管道)机制,想了解得更加细致一点可以看看这篇文章:https://www.cnblogs.com/coldridgeValley/p/5816414.html,也可以看前文提到的总结大全文章。
这里放一张Valve的运行机制图
原理分析经过前面的学习,现在分析起来还是比较简单的,这里就不自己配一个valve了,因为valve属于容器,需要在server.xml或者context.xml那里配置,看看文章就行,或者像文章里直接用springboot来搭建。
Pipeline定义对应的接口是Pipeline,他的实现类是StandardPipeline,Valve定义对应接口Valve,他的抽象实现类是ValveBase,然后四个容器本身有的阀门为StandardEngineValve,StandardHostValve,StandardContextValve ...
javassist学习
因为看到在缩短payload的时候会用到,赶紧来学习一下,参考文章:https://www.yishuifengxiao.com/2023/04/04/javassist%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E7%AC%94%E8%AE%B0/
这是官方文档:http://www.javassist.org/tutorial/tutorial.html
javassist介绍Javassist 是一个开源的分析、编辑和创建Java字节码的类库.;其主要优点在于简单快速. 直接使用 java 编码的形式, 而不需要了解虚拟机指令, 就能动态改变类的结构, 或者动态生成类。
使用前导入jar包
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifact ...
内存马前置学习
学内存马前就要来学一学java web三大件的相关原理:Servlet、Filter、Listener
参考文章:https://www.cnblogs.com/jadite/p/16951328.html
ServletServlet是什么Servlet是JavaEE规范(接口)之一;Servlet是运行在服务器(Web容器Tomcat等)上的一个 java 小程序,它用来接收客户端发送过来的请求进行处理,并响应数据给客户端。Servlet及相对的对象,都由Tomcat创建,我们只是使用。
Tomcat就是一个servlet容器
Servlet需要完成3个任务:
接收请求:将客户端发送过来的请求封装成ServletRequest对象(包含请求头、参数等各种信息)
处理请求:在service方法中接收参数,并且进行处理请求。
数据响应:请求处理完成后,通过转发(forward)或者重定向(redirect)到某个页面。
Servlet程序实现
实现Servlet接口,重新service方法
在web.xml或者用注解配置映射
Servlet生命周期
执行 Servlet 构 ...