整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Etherpad文本编辑器中的代码执行漏洞

Etherpad文本编辑器中的代码执行漏洞

Etherpad是一个开源的,基于Web的在线文本编辑器,它允许实时协作处理文档。Etherpad拥有250多个可用插件并具有版本历史记录和在线聊天功能,用户可以使用插件进行自定义。Etherpad非常受欢迎,在全球拥有数百万活跃用户。

研究人员在Etherpad 1.8.13中发现了两个关键漏洞。其中一个是XSS跨站脚本漏洞(CVE-2021-34817),另一个是参数注入漏洞(CVE-2021-34816)。攻击者可以组合利用这两个漏洞,以完全接管Etherpad实例及其数据。


影响

XSS跨站脚本漏洞(CVE-2021-34817)允许攻击者接管Etherpad用户(包括管理员),可被用于窃取或操纵敏感数据。参数注入漏洞(CVE-2021-34816)允许攻击者在服务器上执行任意代码,攻击者可以窃取、修改或删除所有数据,或针对可从服务器访问的其他内部系统。

攻击者可以在默认配置的Etherpad实例上,利用XSS漏洞获得管理员权限。之后结合利用参数注入漏洞(CVE-2021-34816),从而在服务器上执行任意代码。

聊天消息中的持久性XSS(CVE-2021-34817)

Etherpad支持在线聊天功能,用户可以在每个群聊中交换消息。消息存储在服务器上,每个人都可以查看聊天记录。

当用户打开键盘时,聊天消息会在前端渲染,这涉及从该数据创建HTML元素。在渲染期间,聊天消息的userId属性被插入到DOM中,特殊字符没有被正确转义:

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值被用于构建一个HTML标记字符串,随后该字符串在第176和177行被插入到DOM中。如果攻击者成功控制了聊天者的用户ID,那么他们将能够插入XSS有效载荷,并以受害者用户身份执行操作。那么攻击者如何才能控制用户 ID呢?

Etherpad还具有处理多种格式的导出/导入功能,包括基于JSON的自定义格式。这种格式的文件可以包含键盘内容、它的修订历史和所有相关的聊天消息。然后可以通过导入这样的文件来创建键盘的副本。示例导出文件如下所示:

example.etherpad

{    
        "pad:1": {        
             "chatHead": 0    
        },    
        "pad:1:chat:0": {        
            "text": "Hello World!",        
            "userId": "aE45C6209"    
        }
}

某些值在导入期间会被验证,但聊天消息的用户ID将按原样使用。由于导入功能默认启用,攻击者可以使用该功能创建一个带有用户ID的聊天消息键盘,用户ID由任意数据组成。

当该数据包含HTML标记时,然后将标记插入到DOM中,DOM将执行任何内联 JavaScript代码。因此,攻击者能够将恶意JavaScript代码注入聊天记录,然后在访问键盘时在管理员的浏览器中执行该代码。这使攻击者能够在管理员的浏览器上下文中发起进一步的攻击请求。

插件管理中的参数注入 (CVE-2021-34816)

Etherpad还具有一个管理区域,可供管理员用户使用。它允许他们管理插件、编辑设置和查看系统信息。

管理员安装插件时,带有插件名称的消息会通过WebSocket连接发送到后端。后端然后安装与该名称对应的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系统命令的参数,没有进行任何验证或过滤。这使得攻击者可以从NPM存储库中指定恶意包,或者仅使用指向攻击者服务器上包的URL。

攻击者可以制作一个挂接到Etherpad内部的插件,例如创建一个后门API端点,或者只使用一个带有post-install脚本的包,该脚本将在安装包后立即执行。因此,攻击者可以执行任意代码和系统命令来完全破坏Etherpad实例及其数据。


总结

总而言之,当这两个漏洞被组合利用时,攻击者可以先使用XSS接管管理员的客户端,然后通过安装其所控制的插件来访问服务器。

自动化##Python#

遇到的需求是这样的,需要频繁将htm类型的数据转为Excel表格,这是一个重复性的工作,极大程度上浪费时间和人力,所以我找到了一个解决方案。用Python开发一个桌面的自动化的小工具,虽然实现起来简单,但是真心好用。今天特意写篇文章分享给大家。希望你从获得的是这个思路,里面的功能你可以换成你工作中重复的工作。

一、背景介绍

首先 htm 数据是如下这样的,一个网址。内容在网页中,这里需要写爬虫,获取网页中的信息,自动保存到excel ,并输出excel格式的文件。

1、需求结果

2、解析htm里的内容,并保存到excel

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 '转换成功!'




if __name__=='__main__':
    file_name=input("请输入文件名字:")
    path='C:/Users/cherich/Desktop/' + file_name
    pross=htmToExcel(file_name, path)
    print(pross.htm_to_excel())

二、设计窗口

创建桌面窗口,这里使用tkinter,它是Python 自带的gui库,安装后即可使用。

1、安装命令:

pip install tkinter

2、利用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', '转换成功!')
        root.destroy()
    except Exception as e:
        print(e)
        messagebox.showinfo('Info', '转换失败!')




root=Tk()
root.title('HTM转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()

三、打包exe

本功能打包成exe的好处是不需要将代码部署到服务器,直接将打包好的exe发给对方,就能直接使用。对于这种小而轻的功能非常友好。

1、安装命令:

pip install pyinstaller

2、 打开DOS窗口并切换到demo.py文件的目录,注意路径不要有中文:





在当前目录下,会生成两个文件夹:build和dist。dist里面就是所有可执行exe文件,发送快捷方式到桌面,点击demo.exe就能运行了。

3、pyinstaller指令的常见可选参数:

-i 给应用程序添加图标
-F 指定打包后只生成一个exe格式的文件
-D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c –console, –nowindowed 使用控制台,无界面(默认)
-w –windowed, –noconsole 使用窗口,无控制台
-p 添加搜索路径

四、该注意的坑!

如果生成exe之后,你发现你的程序异常的慢,请检查你的导包代码,尽量不要出现 from ··· import * ,否则每次启动程序,都会导入大量函数占用大量时间,亲测有效。


今天的文章写到这里,如果你觉得对你有帮助,欢迎点赞哦~

用Object.prototype.toString.call()方法,检证JS参数对象的类型,输出和用户交互的信息。