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()
用格式化字符串拼接参数的后果就是,用户可以通过输入{{}}进行命令执行。