细说Jinja2之SSTI&bypass

访客4年前黑客文章387

前言

SSTI(Server-Side Template Injection)服务端模板注入在CTF中并不是一个新颖的考点了,之前略微学习过,但是最近的大小比赛比如说安洵杯,祥云杯,太湖杯,南邮CTF,上海大学生安全竞赛等等比赛都频频出现,而且赛后看到师傅们各种眼花缭乱的payload,无法知晓其中的原理,促使我写了这篇文章来总结各种bypass SSTI的 *** 。

基础知识

本篇文章从Flask的模板引擎Jinja2入手,CTF中大多数也都是使用这种模板引擎

模板的基本语法

官方文档对于模板的语法介绍如下

这里我们逐条来看

主要用来声明变量,也可以用于条件语句和循环语句。

用于将表达式打印到模板输出,比如我们一般在里面输入,,或者是字符串,调用对象的 *** ,都会渲染出结果

我们通常会用简单测试页面是否存在SSTI

表示未包含在模板输出中的注释

有和相同的效果

这里的模板注入主要用到的是和

常见的魔术 ***

用于返回对象所属的类

以字符串的形式返回一个类所继承的类

以元组的形式返回一个类所继承的类

返回解析 *** 调用的顺序,按照子类到父类到父父类的顺序返回所有类

获取类的所有子类

所有自带带类都包含 *** ,常用他当跳板来调用

会以字典类型返回当前位置的全部模块, *** 和全局变量,用于配合使用

漏洞成因与防御

存在模板注入漏洞原因有二,一是存在用户输入变量可控,二是了使用不固定的模板,这里简单给出一个存在SSTI的代码如下

我们简单输入一个,返回了1,说明存在模板注入


而如果存在SSTI的话,我们就可以利用上面的魔术 *** 去构造可以读文件或者直接getshell的漏洞


如何拒绝这种漏洞呢,其实很简单只需要使用固定的模板即可,正确的代码应该如下

可以看到原封不动的输出了


构造链思路

这里从零开始介绍如何去构造SSTI漏洞的payload,可以用上面存在SSTI漏洞的做实验

  • 之一步

目的:使用来获取内置类所对应的类

可以通过使用,,,等来获取

  • 第二步

目的:拿到基类

用拿到基类

用拿到基类

用或者拿到基类

  • 第三步

用拿到子类列表

  • 第四步

在子类列表中找到可以getshell的类

寻找利用类

在上述的第四步中,如何快速的寻找利用类呢

利用脚本跑索引

我们一般来说是先知晓一些可以getshell的类,然后再去跑这些类的索引,然后这里先讲述如何去跑索引,再详写可以getshell的类

这里先给出一个在本地遍历的脚本,原理是先遍历所有子类,然后再遍历子类的 *** 的所引用的东西,来搜索是否调用了我们所需要的 *** ,这里以为例子

我们运行这个脚本

可以发现基类的第128个子类名为的这个类有popen ***

先调用它的 *** 进行初始化类

再调用可以获取到 *** 内以字典的形式返回的 *** 、属性等值

然后就可以调用其中的popen来执行命令

但是上面的 *** 仅限于在本地寻找,因为在做CTF题目的时候,我们无法在题目环境中运行这个,这里用hhhm师傅的一个脚本直接去寻找子类

我们首先把所有的子类列举出来

然后把子类列表放进下面脚本中的a中,然后寻找这个类


又或者用如下的脚本去跑


tips:后面的各种 *** 都是利用这种思路寻找到可以getshell类的位置

python3的 ***

  • 类中的

在上面的例子中就是用的这个 *** ,payload如下

  • 中的

把上面脚本中的search变量换成

可以看到有5个类下是包含的,随便用一个即可

payload如下

python2的 ***

因为python3和python2两个版本下有差别,这里把python2单独拿出来说

tips:python2的类型不直接从属于属于基类,所以要用两次

  • 类读写文件

本 *** 只能适用于python2,因为在python3中类已经被移除了

可以使用dir查看file对象中的内置 ***

然后直接调用里面的 *** 即可,payload如下

读文件

  • 类中的

本 *** 只能用于python2,因为在python3中会报错,猜测应该是python3中被移除了还是啥的,如果不对请师傅们指出

我们把上面的脚本中的search变量赋值为,去寻找含有的类

后面如法炮制,payload如下

python2&3的 ***

这里介绍python2和python3两个版本通用的 ***

  • 代码执行

这种 *** 是比较常用的,因为他两种python版本都适用

首先是一个包含了大量内置函数的一个模块,我们平时用python的时候之所以可以直接使用一些函数比如,,就是因为这类模块在Python启动时为我们导入了,可以使用来查看调用 *** 的列表,然后可以发现下有,等的函数,因此可以利用此来执行命令。

把上面脚本search变量赋值为,然后找到第140个类含有他,而且这里的话比较多的类都含有,比如常用的还有等等,这也可能是为什么这种 *** 比较多人用的原因之一吧

再调用等函数和 *** 即可,payload如下

又或者用如下两种方式,用模板来跑循环


读取文件payload

然后这里再提一个比较少人提到的点

类在在内部定义了,然后模块包含有,也就是说如果可以找到类,则可以不使用,payload如下

总而言之,原理都是先找到含有的类,然后再进一步利用

  • 进行RCE

我们可以用寻找这个类,可以直接RCE,payload如下

  • 直接利用

一开始我以为这种 *** 只能用于python2,因为我在本地实验的时候python3中无法找到直接含有os的类,但后来发现python3其实也是能够用的,主要是环境里面有这个那个类才行

我们把上面的脚本中的search变量赋值为os,去寻找含有os的类

后面如法炮制,payload如下

获取配置信息

我们有时候可以使用flask的内置函数比如说,,甚至是内置的对象来查询配置信息或者是构造payload

我们通常会用查询配置信息,如果题目有设置类似,就可以直接访问或者获得flag

jinja2中存在对象

查询一些配置信息

构造ssti的payload

查询配置信息

构造ssti的payload

查询配置信息

构造ssti的payload

绕过黑名单

CTF中一般考的就是怎么绕过SSTI,我们学会如何去构造payload之后,还要学习如何去绕过一些过滤,然后下面由于环境的不同,payload中类的位置也是就那个数字可能会和文章中不一样,需要自己动手测一下

过滤了点

过滤了

在python中,可用以下表示法可用于访问对象的属性

也就是说我们可以通过,,来绕过点

  • 使用绕过

使用访问字典的方式来访问函数或者类等,下面两行是等价的

以此,我们可以构造payload如下

  • 使用绕过

使用原生JinJa2的函数,以下两行是等价的

以此,我们可以构造payload如下

  • 使用绕过

这种 *** 有时候由于环境问题不一定可行,会报错,所以优先使用以上两种

过滤引号

过滤了和

  • 绕过

flask中存在着内置对象可以得到请求的信息,可以用5种不同的方式来请求信息,我们可以利用他来传递参数绕过

payload如下

方式,利用传递参数

方式,利用传递参数

方式,利用传递参数

剩下两种 *** 也差不多,这里就不赘述了

  • chr绕过

这里先爆破,获取中含有chr的类索引


然后就可以用chr来绕过传参时所需要的引号,然后需要用chr来构造需要的字符

这里我写了个脚本可以快速构造想要的ascii字符

最后payload如下

过滤下划线

过滤了

  • 编码绕过

使用十六进制编码绕过,编码后为,编码后为

payload如下

这里甚至可以全十六进制绕过,顺便把关键字也一起绕过,这里先给出个python脚本方便转换

随便构造个payload如下

  • 绕过

在上面的过滤引号已经介绍过了,这里不再赘述

过滤关键字

首先要看关键字是如何被过滤的

如果是替换为空,可以尝试双写绕过,或者使用黑名单逻辑漏洞错误绕过,即使用黑名单最后一个关键字替换绕过

如果直接ban了,就可以使用字符串拼接的方式等 *** 进行绕过,常用 *** 如下

  • 拼接字符绕过

这里以过滤class为例子,用中括号括起来然后里面用引号连接,可以用号或者不用

随便写个payload如下

或者可以使用join来进行拼接

看到有师傅甚至用管道符加上 *** 来拼接的骚操作,也就是我们平时说的格式化字符串,其中的被替换

  • 使用使用原生函数

绕过,payload如下

绕过,但这种 *** 经过测试只能在python2下使用,payload如下

  • 替代的 ***

过滤init,可以用或替代

过滤config,我们通常会用获取当前设置,如果被过滤了可以使用以下的payload绕过

过滤中括号

过滤了和

  • 数字中的中括号

在python里面可以使用以下 *** 访问数组元素

也就是说可以使用和替代中括号,取列表的第n位

payload如下

  • 魔术 *** 的中括号

调用魔术 *** 本来是不用中括号的,但是如果过滤了关键字,要进行拼接的话就不可避免要用到中括号,像这里如果同时过滤了class和中括号

可用绕过

或者可以配合一起使用

payload如下

这种同样是绕过关键字的 *** 之一

过滤双大括号

过滤了和

  • 使用dns外带数据

用替代了,使用判断语句进行dns外带数据

然后在ceye平台接收数据即可


  • 盲注

如果上面的 *** 不行的话,可以考虑使用盲注的方式,这里附上p0师傅的脚本

  • 标记

我们上面之所以要dnslog外带数据以及使用盲注,是因为用会没有回显,这里的话可以使用来做一个标记使得他有回显,比如,payload如下

payload进阶与拓展

这里我基于上面绕过黑名单各种 *** 的组合,对CTF中用到的一些 *** 和payload再做一个小的总结,不过其实一般来说,只要不是太偏太绕的题,上面的 *** 自行组合一下都够用了,下面只是作为一个拓展

过滤和和

这里顺便给一个不常见的 *** ,主要是找到的 *** ,之一个是参数0,第二个为要读取的文件名,payload如下

使用十六进制绕过后,payload如下

过滤和和

之前安恒二月赛在y1ng师傅博客看到的一个payload,原理并不难,这里使用了绕过点,绕过,payload如下

导入主函数读取变量

有一些题目我们不并需要去getshell,比如flag直接暴露在变量里面了,像如下这样把文件加载到flag这个变量里面了

我们就可以通过是导入主函数去读变量,payload如下

Unicode绕过

这种 *** 是从安洵杯2020 官方Writeup学到的,我们直奔主题看payload

这里的绕过和绕过上面已经说过了这里不赘述

然后这里的用测了一下发现是个 ***

然后用他直接调用发现可以直接执行os命令,测了一下发现也可以用,又学到了一种新 *** ,只能说师傅们tql

回到正题,这里使用了Unicode编码绕过关键字,下面两行是等价的

知道了这两点之后,那个官方给的payload就很明朗了,解开编码后如下

然后我这里顺便给个Unicode互转的php脚本

魔改字符

这种 *** 是在太湖杯easyWeb这道题目学到的,上面所说的过滤双大括号,在一些特定的题目可以魔改,比如说这道题由于有个字符规范器可以把我们输入的文本标准化,所以可以使用这种 ***


可以在Unicode字符网站寻找绕过的字符,直接在网址搜索,就会出现类似的字符,就可以找到和了,网址:https://www.compart.com/en/unicode/U+FE38

payload如下

还可以使用中文的字符魔改

payload如下

总结

因为水平和文章篇幅有限,可能还有一些bypass *** 没有提到,还有就是CTF中也不只考Jinja2这种模板,还有另外的Twig模板, *** art等模板,这些就等以后有必要再更吧,最后就是有不足之处请各位师傅指出

相关实验:Flask服务端模板注入漏洞

参考连接

https://p0sec.net/index.php/archives/120/

https://www.jianshu.com/p/a736e39c3510

https://www.redmango.top/article/43

https://xz.aliyun.com/t/8029

https://xz.aliyun.com/t/7746

相关文章

靠谱的黑客联系方式

没有黑客的联系方式吗?没有黑客的联系方式吗?展开。靠谱黑客搜索资料本地图片图片链接代码提交回答匿名回答自动保存中。 百度是一个搜索引擎你可以找到黑客联系方式但绝大多少都是遇到的大广告的说我认识一个之...

空调制热多少度最好(空调取暖开到几度才最省钱)

  制热几度最好是(中央空调供暖开到多次才最划算)自古以来冬天分两大阵营,北方地区漫天飞雪,南方地区风随意吹。   在南方地区越冬,除开兼具一身正气以外,还需修练“多方位低頻颤动绝学”。   因为南方...

过桥米线店加盟赚钱吗?怎么样才能保证店铺的收益呢?

过桥米线店加盟赚钱吗?怎么样才能保证店铺的收益呢?

时代在产生着不绝地变革,因此人们糊口傍边的方方面面也在跟着改变,跟着市场需求的差异,餐饮市场上呈现了浩瀚差异的美食,假如说什么样的美食较量受接待的话,那小编想到的就是过桥米线,无论是春夏秋冬,一碗热乎...

棋牌黑科技软件大全(好的棋牌软件)

棋牌黑科技软件大全(好的棋牌软件)

本文导读目录: 1、手机棋牌游戏平台十大排名 2、有哪些黑科技App可以推荐一下? 3、推荐几个黑科技的软件呗! 4、有哪些可以好友同玩的手机麻将软件分享? 5、游戏科技软件 6、...

肚腩怎么减最快的速度(有肚腩怎么减掉)

过去,这一圈子早已得到 了许多 有关消耗脂肪、减肥瘦身、锻练和运动健身的专业知识。很多粉絲和盆友都说她们有很多益处 殊不知,近期,一圈粉说:我是过度劳累和肥胖症的病症,我手和脚偏瘦,但我不能降低我可...

人特别难过时会觉得心痛 真的是心脏在痛吗!蚂蚁庄园小课堂7月2日今

人特别难过时会觉得心痛 真的是心脏在痛吗!蚂蚁庄园小课堂7月2日今

支付宝蚂蚁庄园小课堂7月2日今日题目答案!相信很多玩家都不知道这个答案,答对就可以领取到180g小鸡饲料。以上是支付宝蚂蚁庄园小课堂2020年7月2日的题目,那么你们知道答案是什么吗? 蚂蚁庄园...