做题步骤
题目分析
开启题目环境,下载附件,将得到的class文件反编译
经过代码审计之后,不难发现,这里有一个JDBC的sql注入漏洞
sql注入分析
在Test.class
中,/common/test/sqlDict
路由下面,调用了SqlDict#getTableData
方法
跟进这个方法
先是建立数据库的连接(SqlDictData#getConnection
)
在getConnection方法的逻辑中,如果没有传入dbName的话,它默认是myapp数据库名root用户和abc@12345密码
回到getTableData方法中,并不是采用的预编译的方式,而是直接将dbName带入进行查询,这里就存在了注入
后面就是一些查询数据的代码了
注入细节
这里有一个小绕过,我们要想顺利进行到sql注入中,首先要保证在连接数据库的时候不会报错,不然又啷个注入嘛
我们使用#
来混淆数据库连接
payload:
myapp#'union select 1#
说明可以进行注入操作
得到账号为admin密码为admin@Rrrr_ctf_asde
寻找登陆点
得到了账号密码,但是没有给出登陆路由
我们可以发现,他导入了import io.swagger.annotations.ApiOperation;
swagger包是ui作用,默认的页面有swagger-ui.html
进行登陆
反序列化
在返回的data中有一个经过base64编码后的序列化字符串,应该要进行反序列化操作,看看是否能够利用
这里就是那个认证凭证
我们需要判断这个是一个什么链子
通过插件辅助判断为ROME链,当然也可以将他解码
直接使用ysoserial链子打
成功反弹shell
I'm so cute. Please give me money.
- Post link: https://roboterh.github.io/2022/04/09/%E7%BD%91%E9%BC%8E%E6%9D%AF2020Think-Java/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.