200字
知识点
2025-11-01
2025-11-01
关于网页引擎
  1. 什么是引擎:
    网页模板引擎是一种软件库,它的核心作用是将 业务逻辑(数据)表现逻辑(HTML/视图) 分离。它允许开发者编写一个包含特殊标记(占位符、循环、条件判断等)的模板文件,然后用程序提供的数据去“渲染”这个模板,最终生成一个完整的 HTML 页面。

  2. 引擎的语言:

  3. 不同引擎的区别
    攻击路径不同:

    # Jinja2 (Python):
    '' (任意对象) -> class (获取类) -> mro (追溯基类) -> subclasses() (寻找所有子类) -> 危险模块/函数 (如 os)
    
    # Twig (PHP): 
    _self (模板实例) -> env (获取环境对象) -> registerUndefinedFilterCallback (注册回调函数) -> 'exec'/'system' (指定PHP危险函数为回调)


    上下文不同:

     # Jinja2 (Python): 
    {
     "request": "Flask的请求对象,包含大量信息",
      "config": "应用的配置对象",
      "g": "应用上下文的全局变量",
      "...": "其他由框架注入的对象"
    }
    # Twig (PHP):
    {
      "_self": "指向当前模板实例,万能,
      "app": "在Symfony等框架中,可能存在的应用对象",
      "...": "其他全局变量"
    }


    可用的语法不同:...

  4. 如何区分

flask
  1. 使用jinja2为引擎

  2. 当使用 render_template_string 时存在 ssti 漏洞

魔术方法:

1. __class__ 返回类型所属的对象
2. __mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
3. __base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的
4. __subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
5. __init__ 类的初始化方法(构造函数)
6. __globals__ 对包含函数全局变量的字典的引用

ssti(服务器模板注入)

1. 如何辨别 ssti
当网页存在回显,并且没有被解析为 html 元素时,考虑 ssti 注入。(如果被解析为html 元素,如输入 <h1>test</h1> 返回了大号 test,这时候就是考略 XSS 注入了,即Javascript 任意执行)
2. 漏洞原因
程序将字符串渲染成模板时,会执行{{ }}(大多数情况下的通用占位符)里的语句。
3. 限制
本质上是一个沙箱,仅能执行和输出表达式无法执行语句(如 import),但是可以通过访问基类的其它子类获取所需函数。


工具

自动化工具tplmap,拿shell、执行命令、bind_shell、反弹shell、上传下载文件,Tplmap为SSTI的利用提供了很大的便利

github地址:GitHub - epinna/tplmap: Server-Side Template Injection and Code Injection Detection and Exploitation Tool

Flag
  1. flag可能藏在哪:
    根目录或者当前目录下的 flag 文件,(也可能叫Fl4g之类的)
    配置文件config中
    环境变量 env 中

Jail

一、定义与核心概念

Jail(监狱)在 CTF 比赛中,特指一类安全挑战。其核心是为挑战者提供一个被严格限制的程序执行环境(沙箱),并要求挑战者突破这些限制(“越狱”),以执行非预期的代码或命令,最终获取服务器权限或读取敏感文件(如 flag)。

二、主要的限制手段

  1. 黑名单过滤:

    • 禁用特定的危险关键字、函数名或命令,例如 import, os, system, exec, eval, open, cat, flag 等。
  2. 字符集限制:

    • 只允许输入特定范围的字符,如仅限字母和数字,从而过滤掉 ._"'[] 等特殊符号。
  3. 长度限制:

    • 限制单次输入的代码或命令的长度。
  4. 环境配置限制:

    • PHP: 使用 php.ini 中的 disable_functions 指令禁用大量可执行系统命令的函数。
    • Linux Shell: 使用 rbash (Restricted Bash) 或自定义 Shell 脚本,限制用户可执行的命令集,并禁止目录切换 (cd)、环境变量修改等操作。

三、常见 Jail 类型及通用绕过思路

Python Jail

最常见

  • 核心绕过思路:利用对象的继承链。

    • 在 Python 中,万物皆对象。即使在 importos 等模块被禁用的情况下,依然可以从任意一个基础对象(如 '', (), [], 0)出发,通过其 __class__ 属性向上追溯到基类 object

    • 关键技巧是调用 object 类的 __subclasses__() 方法,该方法会返回当前 Python 解释器加载过的所有类的列表。

    • 在这个庞大的类列表中,可以寻找到能够执行系统命令的类(如 os._wrap_close, subprocess.Popen 等),并利用它们来执行命令。

    • 典型利用链:

      ().__class__.__mro__[1].__subclasses__()
      
  • 辅助技巧:

    • 使用 getattr() 函数替代点(.)操作符来访问属性,以绕过对点号的过滤。
    • 使用字符串拼接('o'+'s')、编码转换(chr(), hex())等方式绕过对特定关键字的过滤。

评论