Think Java
本题花时间也比较多,复现的时候遇到的坑也比较多,以下是解题方法与细节理解。
0x01 源代码分析
根据给的文件可以发现存在sql注入,dbName可控,此外在Test.class中发现了swagger,访问后发现开放了相关接口。
1 | package cn.abc.core.sqldict; |
关于这个注入点,需要加#再闭合,或者通过?加个id再闭合(如下),对此我很是不解,通过赵师傅的指点与写jdbc代码测试才得以搞明白。
1 | myapp?id=1' union select user()# |
我的测试代码如下(可以理解为本题的简化版本),grade为本地的一个数据库,选择了其中的admins表:
1 | package com.zed.jdbc; |
0x02测试代码分析:
在JDBC中,连接数据库的时候采用了?来进行参数传递,如果但是不会影响数据库是否成功连接。例如:
1 | jdbc:mysql://localhost:3306/数据库名?user=用户名&password=密码&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT |
?后面的字符串都会被当作参数来进行传递,所以当 dbname="grade?id=1' union select user()#" 时,
1' union select user()# 都被当做id的值,但是不影响数据库的连接,然后在下面执行sql语句的时候 union select user()# 都作为了sql语句执行,达成了sql注入。使用#同理。
最终输入在swagger-ui.html的/common/test/sqlDict接口中输入myapp#' union select pwd from user#获得密码为 admin@Rrrr_ctf_asde 。
0x03登录获取token
在/common/user/login中登录获取到Bearer。
Bearer是用户json数据序列化的结果,将Bearer后面的字符串base64decode的结果如下,明显的java序列化后的格式,这里就可能出现反序列化的漏洞,既然是登录用的,那么就在/common/user/current中应该会触发反序列化,那么在这个接口中的Authorization中输入这一串data,然后Try it out!抓包。

0x04反序列化利用的环境配置
先在burp中安装 Java Deserialization Scanner插件,该插件在burp的BApp Store可以找到。然后配置ysoserial,先上github下载相关源代码,再使用 mvn clean package -DskipTests 进行编译,最后在burp中的 Java Deserialization Scanner插件下配置路径,例如:

0x05反序列化利用&&get flag
由于复现是在buuoj下复现的,靶机都处于内网环境,所以先开个小号去申请个内网服务器用来接收shell。
在burp中,将抓到的包发送到装好的插件中

将Bearer后的字符串 Set Insertion Point,然后Attack(Base64),在右边可以看到可利用的ROME。

将当前包发送到Exploiting

然后构造payload执行,ip端口为buuoj中申请的内网靶机的ip与监听的端口。

最后成功接收到flag
