python flask ssti学习笔记
python flask ssti学习笔记
学ssti就像是对python原理的一层深入探索,入口很简单,就是用户输入未经过滤便被服务器模板渲染,将其当作变量解析替换,从而达到读取文件或者执行命令等目的
简单示范
漏洞代码:
以上代码存在ssti漏洞点在于render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,我们知道Flask 中使用了Jinja2 作为模板渲染引擎,{{}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{{}}包裹的内容当做变量解析替换。
简单验证
服务器将{{}}的内容直接执行后返回了结果
直接返回出配置变量值,存在敏感信息
入门操作
爆全局变量
任意文件读取
ctf题目中大多数是需要读取flag或者读取其他源码的
接下来利用一些骚操作读取文件吧
python中,不用引入直接使用的内置函数称为 builtin 函数,例如我们通常用的open,chr,ord等等
利用关键字寻找与读文件有关的类
Python2
这不是我们很熟悉的file吗,直接用就好了
或者让我们更加深入一点
python2没有ipython,输出比较混乱我们用python3的相同类替代分析下
Python3
同上,可以找出不少读取文件的类,只是这里file变成了open函数
随便找一个
命令执行
利用函数导入os库执行命令
利用本身已经导入os库的类执行命令
利用执行命令
利用执行命令
Python2
利用eavl函数执行命令
先寻找含有eval函数的类
利用本身导入os库的类执行命令
寻找含有os库的类
剩下的两个方法
查看方法的位置
查看的位置
查找模块的位置
查找方法的位置(在这里使用可以实现一样的效果,步骤一样,不再复述)
调用方法
利用commands 进行命令执行
Python3
利用eavl函数执行命令
先寻找含有eval函数的类
利用本身导入os库的类执行命令
寻找含有os库的类
过滤绕过方法
过滤中括号
过滤引号,过滤class等关键字
是flask中的一个属性,为返回请求的参数,这里把当作变量名,将后面的路径传值进来,进而绕过了引号的过滤
过滤或或
过滤关键字
base64编码绕过
使用实例访问属性时,调用该方法
例如被过滤掉关键词
字符串拼接绕过
利用hex编码,base64编码,[::-1]等绕过关键词过滤
过滤花括号
使用{% if ... %}1{% endif %}
利用声明变量和内置过滤器
以下方法仅在jinja2中实验成功
声明变量
在模板中添加变量,可以使用(set)语句。
语句来创建一个内部的作用域,将语句放在其中,这样创建的变量只在代码块中才有效
变量可以用链接
内置过滤器
变量可以通过 过滤器修改。过滤器与变量用管道符号分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
例如会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。
过滤器接受带圆括号的参数,如同函数调用。这个例子会 把一个列表用逗号连接起来:。
类似于php中的过滤器,过滤器种类太多,具体项目我复制到另一个文档里了
https://jinja.palletsprojects.com/en/master/templates/#builtin-filters
几个例子
绕过过滤
我们可以利用过滤器构造任意的字符
首先利用属性弄出字符来(没有可以用别的)
结合一些普通方法,截取字符,例如单引号: