漏洞描述
攻擊者可以向batch-requests插件發送請求來繞過管理API的IP限制。Apache APISIX的預設配置(帶有預設的API密鑰)容易受到遠端代碼執行的攻擊。當管理密鑰更改或管理API端口更改為與資料面闆不同的端口時,影響較小。但是,繞過Apache APISIX資料面闆的IP限制仍然存在風險。在batch-requests插件中有一個檢查,它用真實的遠端IP覆寫用戶端IP。但是由于代碼中的一個bug,這個檢查可以被繞過。
batch-requests 插件介紹
batch-requests 插件可以一次接受多個請求并以 http pipeline的方式在網關發起多個 http 請求,合并結果後再傳回用戶端,這在用戶端需要通路多個接口時可以顯著地提升請求性能。
在漏洞版本中、預設是啟用狀态。
https://apisix.apache.org/zh/docs/apisix/2.12/plugins/batch-requests/
複現思路:
1、搭建漏洞環境。(注意需要修改:conf.yaml/allow_admin)
2、檢視diff記錄、進行簡單調試,漏洞分析。
3、漏洞測試。
漏洞版本
Apache APISIX 1.3 ~ 2.12.1 之間的所有版本(不包含 2.12.1 )
Apache APISIX 2.10.0 ~ 2.10.4 LTS 之間的所有版本(不包含 2.10.4)
環境搭建
【一一幫助安全學習,所有資源關注我,私信回複“資料”擷取一一】
①網絡安全學習路線
②20份滲透測試電子書
③安全攻防357頁筆記
④50份安全攻防面試指南
⑤安全紅隊滲透工具包
⑥網絡安全必備書籍
⑦100個漏洞實戰案例
⑧安全大廠内部視訊資源
cd CVE-2022-24112-main/apisix-docker/example/
vi apisix_conf/config.yaml
将 allow_admin 修改為 127.0.0.0/24,此處修改的實際為nginx.conf。
使用 docker-compose 建立docker容器。
docker-compose -p apisixCveTest up -d
在服務啟動階段、會讀取config.yaml、生成nginx.conf 。
1、會基于 Lua 模闆 apisix/cli/ngx_tpl.lua 檔案生成 nginx.conf。
2、調用 ngx_http_access_module 子產品。該子產品限制用戶端對某些位址的通路。
進入到容器中檢視,conf/nginx.conf。allow/deny 是設定允許與拒絕通路的位址。隻允許127.0.0.1/24 通路 /apisix/admin 接口。
Admin api 接口如下:
漏洞分析
diff :
檢視diff記錄後、修複方式是将real_ip_hdr 轉化為小寫。
1、檢視插件batch-requests 代碼,問題是出現在 set_common_header() 函數中
函數參數為data是我們傳入的請求體經過json.decode()後的資料、類型為"table"。
檢視代碼,real_ip_hdr 為調用 try_read_attr()函數擷取到的傳回值。通過周遊表結構、擷取到 real_ip_header 的值然後再指派給real_ip_hdr 。
select(‘#’, …) 擷取輸入參數的數量,
select(i, …) 擷取第 n 個參數,
注意:此時的real_ip_hdr 為 X-Real-IP 為大寫。該值為在系統啟動後、給定的預設值。
2、通過周遊data.pipeline和data.headers 、将data.headers 出現的頭資訊指派給data.pipline。發現data.headers中出現了x-real-ip:127.0.0.1 ,這是我們調用batch-requests插件傳遞的頭資訊,而此時系統預設的X-Real-IP為大寫。
在請求頭覆寫中、因為 real_ip_hdr 為 X-Real-IP , 函數core.request.get_remote_clinte_ip()擷取遠端用戶端ip、不能将 x-real-ip給覆寫。
檢視此時的棧資料。在data.headers 中出現了 x-real-ip 與 X-Real-IP。
最後經由batch-requests 插件、使用PUT方法将請求發送到 /apisix/admin/xxxx 注冊新的路由。通過filter_func 參數可寫入一段lua代碼、造成遠端代碼執行。
漏洞測試
利用條件
- batch-requests插件預設開啟狀态。
- 使用者使用了 Apache APISIX 預設配置(啟用 Admin API ,使用預設 Admin Key 且沒有額外配置設定管理端口),攻擊者可以通過 batch-requests 插件調用 Admin API 。
攻擊思路
1、利用batch-requests 插件漏洞、繞過請求頭檢測;
2、通過僞造請求頭、向Admin API 注冊路由;
3、注冊路由時、攜帶參數filter_func 傳遞 lua代碼、造成遠端代碼執行漏洞。
修複意見
- 更新至最新版本
- 禁用batch-requests 插件