上篇文章带来了反序列化漏洞的知识,还没讲过的基础漏洞类型已经很少了,今天给大家带来的知识点是SSTI模板注入,提到注入大家首先想到的肯定是SQL注入,而SSTI模板注入和SQL注入
上篇文章带来了反序列化漏洞的知识,还没讲过的基础漏洞类型已经很少了,今天给大家带来的知识点是SSTI模板注入,提到注入大家首先想到的肯定是SQL注入,而SSTI模板注入和SQL注入其实也存在着类似的点,接下来就详细给大家讲解一下。 简介服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。 原理我们先引入一下服务器模板,页面上的数据需要不断更新,即为渲染。我们简单举一个例子:使用 Twig 模版引擎渲染页面,其中模版含有 {{name}}变量,其模版变量值来自于 GET 请求参数 $_GET["name"] ,如果渲染的模版内容受到用户的控制,代码如下:
可以看到上面就是个漏洞点,服务端相信了用户的输出。 SSTI类型根据模板类型的不同,包裹变量的标识符也大有不同,我们常见的模板引擎有,我们可以根据返回值的类型来判断不同的模板引擎。可以根据下图来进行判断: 基础语法class:查看变量所属的类,根据前面的变量形式可以得到其所属的类。
bases:查看类所属的基类
可以看到上面例子,基类都归属于object。 subclasses:查看当前的子类,格式:
现在我们拿到了所有继承Object类的子类的引用,在调用这些子类的方法,去进行我们的模板注入,讲一下利用的前置知识。 init __init__用于初始化类,意思就是拿到一个类之后要使用__init__之后我们才可以调用里面的函数和属性 。 global 返回当前位置的全部模块,方法和全局变量,配合着__init__使用 。 builtins 内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身。即里面有很多常用的函数。 import 动态加载类和函数,也就是导入模块,用于导入os模块__import__('os').popen('ls').read()]。 例题学习到现在,我们可以尝试做一个题目来巩固一下: 先查找有没有可用的子类,遍历发现<class 'warnings.catch_warnings'> 利用这个子类可以查看目录:
读取server.py文件
得到flag。 过滤器当然真正的题目不可能会这么简单,里面会包含着过滤函数,过滤特殊字符等操作,接下来给大家讲讲过滤器的知识点。 attr 用于获取变量,可用于. [] 都被过滤的情况 join 将一个序列拼接成一个字符串,join ('|')将令每一个元素被'|'隔开 lower 将字符串转换为小写 string 将变量转换为字符串,可以用符号构造出我们可利用的字符串、符号等。 reverse 字符反转 format 格式化字符串 以上就简单举了点过滤器的例子与用法,当然上面列举的只是一小部分,除了这些还有非常多的过滤器,一一列举是列举不完的 进阶接下来讲一个有点难度的题带大家加深理解,进去题目发现是一个如下的解码加密网站。 用{{7*7}}加密解密得到49确定存在ssti模板注入,回显是base64编码的。简单fuzz后发现过滤了flag、import、os、eval等关键词。我们构造拆分语句:
放到解码区,去解码得到文件目录: 进一步拼接去查看flag就OK了,构造最终payload:
|
2022-04-23
2022-10-16
2022-08-26
2020-04-20
2021-01-20