述
Etherpad是一個開源的,基于Web的在線文本編輯器,它允許實時協(xié)作處理文檔。Etherpad擁有250多個可用插件并具有版本歷史記錄和在線聊天功能,用戶可以使用插件進(jìn)行自定義。Etherpad非常受歡迎,在全球擁有數(shù)百萬活躍用戶。
研究人員在Etherpad 1.8.13中發(fā)現(xiàn)了兩個關(guān)鍵漏洞。其中一個是XSS跨站腳本漏洞(CVE-2021-34817),另一個是參數(shù)注入漏洞(CVE-2021-34816)。攻擊者可以組合利用這兩個漏洞,以完全接管Etherpad實例及其數(shù)據(jù)。
影響
XSS跨站腳本漏洞(CVE-2021-34817)允許攻擊者接管Etherpad用戶(包括管理員),可被用于竊取或操縱敏感數(shù)據(jù)。參數(shù)注入漏洞(CVE-2021-34816)允許攻擊者在服務(wù)器上執(zhí)行任意代碼,攻擊者可以竊取、修改或刪除所有數(shù)據(jù),或針對可從服務(wù)器訪問的其他內(nèi)部系統(tǒng)。
攻擊者可以在默認(rèn)配置的Etherpad實例上,利用XSS漏洞獲得管理員權(quán)限。之后結(jié)合利用參數(shù)注入漏洞(CVE-2021-34816),從而在服務(wù)器上執(zhí)行任意代碼。
聊天消息中的持久性XSS(CVE-2021-34817)
Etherpad支持在線聊天功能,用戶可以在每個群聊中交換消息。消息存儲在服務(wù)器上,每個人都可以查看聊天記錄。
當(dāng)用戶打開鍵盤時,聊天消息會在前端渲染,這涉及從該數(shù)據(jù)創(chuàng)建HTML元素。在渲染期間,聊天消息的userId屬性被插入到DOM中,特殊字符沒有被正確轉(zhuǎn)義:
src/static/js/chat.js
173 const html =174 `<p data-authorId='${msg.userId}' …> …` + 175 `<span …`; 176 if (isHistoryAdd) $(html).insertAfter('#chatloadmessagesbutton'); 177 else $('#chattext').append(html);
在第174行,userId值被用于構(gòu)建一個HTML標(biāo)記字符串,隨后該字符串在第176和177行被插入到DOM中。如果攻擊者成功控制了聊天者的用戶ID,那么他們將能夠插入XSS有效載荷,并以受害者用戶身份執(zhí)行操作。那么攻擊者如何才能控制用戶 ID呢?
Etherpad還具有處理多種格式的導(dǎo)出/導(dǎo)入功能,包括基于JSON的自定義格式。這種格式的文件可以包含鍵盤內(nèi)容、它的修訂歷史和所有相關(guān)的聊天消息。然后可以通過導(dǎo)入這樣的文件來創(chuàng)建鍵盤的副本。示例導(dǎo)出文件如下所示:
example.etherpad
{ "pad:1": { "chatHead": 0 }, "pad:1:chat:0": { "text": "Hello World!", "userId": "aE45C6209" } }
某些值在導(dǎo)入期間會被驗證,但聊天消息的用戶ID將按原樣使用。由于導(dǎo)入功能默認(rèn)啟用,攻擊者可以使用該功能創(chuàng)建一個帶有用戶ID的聊天消息鍵盤,用戶ID由任意數(shù)據(jù)組成。
當(dāng)該數(shù)據(jù)包含HTML標(biāo)記時,然后將標(biāo)記插入到DOM中,DOM將執(zhí)行任何內(nèi)聯(lián) JavaScript代碼。因此,攻擊者能夠?qū)阂釰avaScript代碼注入聊天記錄,然后在訪問鍵盤時在管理員的瀏覽器中執(zhí)行該代碼。這使攻擊者能夠在管理員的瀏覽器上下文中發(fā)起進(jìn)一步的攻擊請求。
插件管理中的參數(shù)注入 (CVE-2021-34816)
Etherpad還具有一個管理區(qū)域,可供管理員用戶使用。它允許他們管理插件、編輯設(shè)置和查看系統(tǒng)信息。
管理員安裝插件時,帶有插件名稱的消息會通過WebSocket連接發(fā)送到后端。后端然后安裝與該名稱對應(yīng)的NPM包:
src/static/js/pluginfw/installer.js
49 exports.install = async (pluginName, cb = null) => { … // ... 52 try { … // ... 56 await runCmd(['npm', 'install', /* ... */ pluginName]); 57 } catch (err) { … // ... 61 } … // ... 66 };
在第56行,插件名稱直接被用作npm install系統(tǒng)命令的參數(shù),沒有進(jìn)行任何驗證或過濾。這使得攻擊者可以從NPM存儲庫中指定惡意包,或者僅使用指向攻擊者服務(wù)器上包的URL。
攻擊者可以制作一個掛接到Etherpad內(nèi)部的插件,例如創(chuàng)建一個后門API端點,或者只使用一個帶有post-install腳本的包,該腳本將在安裝包后立即執(zhí)行。因此,攻擊者可以執(zhí)行任意代碼和系統(tǒng)命令來完全破壞Etherpad實例及其數(shù)據(jù)。
總結(jié)
總而言之,當(dāng)這兩個漏洞被組合利用時,攻擊者可以先使用XSS接管管理員的客戶端,然后通過安裝其所控制的插件來訪問服務(wù)器。
自動化##Python#
遇到的需求是這樣的,需要頻繁將htm類型的數(shù)據(jù)轉(zhuǎn)為Excel表格,這是一個重復(fù)性的工作,極大程度上浪費時間和人力,所以我找到了一個解決方案。用Python開發(fā)一個桌面的自動化的小工具,雖然實現(xiàn)起來簡單,但是真心好用。今天特意寫篇文章分享給大家。希望你從獲得的是這個思路,里面的功能你可以換成你工作中重復(fù)的工作。
from bs4 import BeautifulSoup
import pandas as pd
class htmToExcel(object):
def __init__(self, file_name, file_path):
self.file_name=file_name
self.file_path=file_path
def htm_to_excel(self):
print(self.file_path)
soup=BeautifulSoup(open(self.file_path), features='html.parser')
table=soup.find("table")
tr_list=table.find_all("tr")
th=tr_list.pop(0)
title=th.find_all("th")
lis=[]
for tr in tr_list:
data={}
td=tr.find_all("td")
for i in range(len(td)):
data[title[i].text]=td[i].text
lis.append(data)
df=pd.DataFrame(lis)
df.to_excel('{}.xlsx'.format(str(self.file_name).split('.')[0]), index=False)
return '轉(zhuǎn)換成功!'
if __name__=='__main__':
file_name=input("請輸入文件名字:")
path='C:/Users/cherich/Desktop/' + file_name
pross=htmToExcel(file_name, path)
print(pross.htm_to_excel())
pip install tkinter
from tkinter import Tk, Entry, Button, mainloop
import tkinter.filedialog
import htm_to_excel
from tkinter import messagebox
def Upload():
try:
selectFileName=tkinter.filedialog.askopenfilename(title='選擇文件')
pross=htm_to_excel.htmToExcel(str(selectFileName).split('/')[-1], selectFileName)
pross.htm_to_excel()
messagebox.showinfo('Info', '轉(zhuǎn)換成功!')
root.destroy()
except Exception as e:
print(e)
messagebox.showinfo('Info', '轉(zhuǎn)換失敗!')
root=Tk()
root.title('HTM轉(zhuǎn)Excel小工具')
root.geometry('+500+300')
e1=Entry(root, width=50)
e1.grid(row=0, column=0)
btn1=Button(root, text=' 上傳 ', command=Upload).grid(row=1, column=0, pady=5)
mainloop()
pip install pyinstaller
在當(dāng)前目錄下,會生成兩個文件夾:build和dist。dist里面就是所有可執(zhí)行exe文件,發(fā)送快捷方式到桌面,點擊demo.exe就能運(yùn)行了。
-i 給應(yīng)用程序添加圖標(biāo)
-F 指定打包后只生成一個exe格式的文件
-D –onedir 創(chuàng)建一個目錄,包含exe文件,但會依賴很多文件(默認(rèn)選項)
-c –console, –nowindowed 使用控制臺,無界面(默認(rèn))
-w –windowed, –noconsole 使用窗口,無控制臺
-p 添加搜索路徑
如果生成exe之后,你發(fā)現(xiàn)你的程序異常的慢,請檢查你的導(dǎo)包代碼,盡量不要出現(xiàn) from ··· import * ,否則每次啟動程序,都會導(dǎo)入大量函數(shù)占用大量時間,親測有效。
今天的文章寫到這里,如果你覺得對你有幫助,歡迎點贊哦~
用Object.prototype.toString.call()方法,檢證JS參數(shù)對象的類型,輸出和用戶交互的信息。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。