首页 > 其他 > 详细

SSTI(模板注入)--Flask

时间:2021-05-22 00:01:46      阅读:25      评论:0      收藏:0      [点我收藏+]

关于SSTI

SSTI(Server-Side Template Injection)也就是服务器端模板注入,和其他如SQL注入、XSS注入等类似,是由于代码不严谨或不规范且信任了用户的输入而导致的。用户的输入在正常情况下应该作为普通的变量在模板中渲染,但SSTI在模板进行渲染时实现了语句的拼接,模板渲染得到的页面实际上包含了注入语句产生的结果。

既然如此,那SSTI中的SST(Server-Side Template)又是什么呢?百度词条:模板引擎_百度百科 (baidu.com)。个人理解SST就是将页面中大量重复使用固定内容与变动内容分离,固定内容作为模板,而变动内容作为变量,每当该页面需要使用时只需要在模板中将变量替换为所需值即可,而不必为每次使用时从头到尾的生成两个完全不同的页面。

在本篇博客中将会主要讲述以Jinja2为引擎的Flask模板的SSTI,关于SSTI的具体场景可以参考下面的例子。

在如下页面中会获取URL中name参数的值替换掉页面中hello后面的字符,name的值不同hello后面的字符也不同。

技术分享图片

技术分享图片 

但通过一个测试会发现,显示在页面上的是7*7运算得到的结果49,而不是一个单纯的字符串{{7*7}},这说明了模板渲染的是我们注入语句的结果也即说明存在SSTI。

技术分享图片

我们可以通过控制输入name的值去实现XSS甚至SHELL命令。 

技术分享图片

技术分享图片

关于Flask的代码基础

Flask是一款使用python编写的模板,在这里将会简单的讲解关于Flask的python基础代码知识,以便更好的理解并使用之后讲解的payload。

以下创建了一个简单Flask的页面,当我们访问时会返回一个字符串。

技术分享图片

技术分享图片

可见访问页面的结果就是我们代码中所规定的显示了一句hello,我们也可以将一个HTML的所有代码放入return返回的字符串中,这样我们浏览的页面就是一个HTML页面,但我们完全可以将HTML的页面单独存放为一个文件,然后我们通过相应函数返回这个HTML页面。

以下创建了一个仅包含固定内容的HTML文件,我们访问页面时,Flask会将这个HTML文件作为模板渲染。

演示文件结构

技术分享图片

文件代码

技术分享图片

技术分享图片

 

 

 访问页面

技术分享图片

当然一个模板除了固定内容也会有变动的内容,但是这些变动的内容作为变量是不能直接在HTML文件中使用的(HTML是一种静态语言,并不能定义或处理变量之类动态语言所具有的),想要使用首先得在渲染模板时将这些变量传入,其次得在模板文件对应的位置用特殊语法将这些变量标志出来。

传入变量

技术分享图片

 在模板文件中标志变量

技术分享图片

访问页面

技术分享图片

在模板文件中,显然{{username}} 这种语法不是HTML自带的,这是Flask中定义的特殊语法,通过{{var}}可以用来在HTML中实现python中的变量,此外还有{% code %}用来在HTML中实现一些基础的python语法。

 这里讲述和payload使用有关的for语句和if语句,更多的语法参考:Jinja2用法总结 - yanzi_meng - 博客园 (cnblogs.com)

技术分享图片

 

技术分享图片

技术分享图片

注意每一个if语句或for语句都是由{% if code %}{% endif %}或{% for code %}{% endfor %}这一对代码构成语句开头和结尾的。

关于payload

 暂没更新完

SSTI(模板注入)--Flask

原文:https://www.cnblogs.com/Article-kelp/p/14797393.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!