一,什么是ssti
SSTI即服务端模版注入攻击。由于程序员代码编写不当,导致用户输入可以修改服务端模版的执行逻辑,从而造成XSS,任意文件读取,代码执行等一系列问题。
二,常见的服务器模板引擎
1,php中常见的
(1)Smarty
Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛
(2)Twig
Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。
(3)Blade
Blade 是 Laravel 提供的一个既简单又强大的模板引擎。
和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担。
2,java中常见的
(1)JSP
非常的经典的模块引擎
(2)FreeMarker
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
(3)Velocity
Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。
3,python中常见的
(1)Jinja2
flask jinja2 一直是一起说的,使用非常的广泛,是我学习的第一个模板引擎
(2)django
django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道 django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了
(3)tornado
tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发
三,简单的判断模块方法
四,实际例题
1,判断注入点和模块类型
(1)输入1,2
发现,登陆结果返回了用户名,说明用户名为注入点
(2)在用户名中输入{{7*7}}判断模块类型
返回49,说明存在ssti漏洞,且为twig或者jinja2
(3)输入{{7*'7'}}
返回7个7,说明为jinjia2模块。如果仍返回49则为twig
2,输入常见的语句查找flag
(1)常见的魔术方法
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用__builtins__ builtins即是引用,Python程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于builtins却不用导入,它在任何模块都直接可见,所以可以直接调用引用的模块
(2)payload构造
使用__class__
来获取内置类所对应的类,可以通过使用str
,list
,tuple
,dict
等来获取
__init__ 初始化类,返回的类型是function
__globals__[] 使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
os.popen() 方法用于从一个命令打开一个管道。
open() 方法用于打开一个文件,并返回文件对象
寻找flag
读取flag