pythonSSTI(0)

这些写的很好了,懒得自己写了,就看吧

https://blog.csdn.net/weixin_41603028/article/details/107865253

https://www.cnblogs.com/hackxf/p/10480071.html

"模板"初步

PHP中很少有模板

在之前PHP的学习中,很少遇到模板的概念,因为PHP是一个脚本语言,可以写在HTML里,对于html需要和后端交互的内容直接处理。

比如这样:

对于前端表单上传的文件,底下的PHP脚本直接对其进行处理(并可能进行存储)。

python模板(以flask为例)

但是python就不一样了,它不能写在html中。要通过python web制造交互效果,一般是通过模板框架)实现。python框架一般是一个库,可以从前端表单中接收处理数据,并且通过调用函数对前端进行渲染。相应的,在前端的html中,需要使用一些控制语句功能语句来支持渲染

像这样:

有很多显眼的控制语句;【{% xxxx %}】

这里面也有功能语句,img src里的{{ url_for('static',filename='img/cover.jpeg') }}" 这个就是。url_for是一个python_flask里的函数;具体以后再讲。

Python_flask初步

一个样例

给出一个最基础的、安全的flask小程序。

app.run()运行该web项目;参数可以填套接字;如果不填,默认127.0.0.1:5000.

再次强调,如果要出网(你有一个公网ip),记得不要填公网ip,而是填本地任意地址0.0.0.0 。

app是一个装饰器;@app.route('xxx')后一定要跟一个函数,它的作用是将函数内容和参数url绑定。装饰器 可以理解为 装饰某个url对应的网页。它必须有返回值,必须为一个渲染的模板 或 字符串。

render_template系列函数负责具体的渲染。小程序中的render_template_string直接使用字符串template渲染网页根目录【/】,并且将用户可控的参数在函数中传入。如果我们不是把要渲染的东西写在一个python字符串中,而是将其写成了单独的带控制、功能语句的html,那么,我们就要使用render_template函数。像这样:

return render_template('search.html', genres = genres)

获取参数

python_flask提供三类参数获取方法:

request.form,request.args,request.value

查阅资料时,许多内容的经常提到“表单”这个词;但我觉得他们说得“表单”的定义非常模糊,此处反而不利于区分这些方法。

我先将他们与PHP中的全局变量对应理解:

request.args.get('xxx')====>$_GET['xxx']

request.form.get('xxx')====>$_POST['xxx']

request.value.get('xxx')====>$_REQUEST['xxx']

SSTI漏洞

给出一个基础的,不安全的flask小程序:

from flask import Flask,request,render_template_string

app=Flask(__name__)

@app.route('/',methods={"POST","GET"})
def hello_world():
    person='who?'
    if request.values.get("name"):
        person=request.values.get("name")
    template='<h1>Hi, %s</h1>' %person
    return render_template_string(template)

if __name__=='__main__':
    app.run()

用格式化字符串拼接参数的后果就是,用户可以通过输入{{}}进行命令执行。

posted @ 2022-04-29 12:11  hiddener  阅读(36)  评论(0编辑  收藏  举报