Import os print('os' in globals()) eval("os.system('whoami')") print("*"*30) # 将globals参数设置成空 eval("os.system('whoami')", {}, {}) eval("os.system('whoami')", {}) 1234567812345678
Output:
True desktop-xxxxxx ****************************** Traceback (most recent call last): File "C:/Users/xxx/Desktop/eval_demo.py", line 49, in eval("os.system('whoami')", {}, {}) File "", line 1, in NameError: name 'os' is not defined 1234567812345678
上面的代码运行环境中导入了os库,eval()中可以正常调用 。假如将eval()中的globals和locals参数设置成空,eval()中就找不到os库了,执行代码报错 。
eval()函数中变量加载的优先级顺序为:局部变量locals > 全局变量globals > 当前 .py环境中的变量 。
这里需要注意,如果未设置locals或locals为空,则locals与globals一样 。假如locals中不存在值,会再到globals中寻找值 。因此,要设置locals和globals中都没有os库,才能避免用户调用 。(实际应用时并不一定都是将locals和globals设置为空,设置为空只是一种示例) 。
通过对locals和globals的限制,避免了用户调用当前运行环境中导入的os库 。但是,限制用户使用已导入的库,用户可以自己导入库并使用 。
# 导入os库并执行系统命令 eval("__import__('os').system('whoami')") eval("__import__('os').system('echo 123')") # 增加globals和locals的限制 eval("__import__('os').system('whoami')", {}) eval("__import__('os').system('echo 123')", {}, {}) 123456123456
Output:
【被企业禁用的,那些python中的内置强大函数】desktop-xxxxxx 123 desktop-xxxxxx 123 12341234
如果恶意用户发现当前的运行环境中没有导入os,或者导入的os库被限制使用,调用os.system()报错 。恶意用户会尝试自己导包,用__import__(‘os’)可以在eval()函数中导入os库,同时执行一系列的系统命令来达到他的目的 。
这种方法是在每次执行时都导包,并立即链式执行系统命令,在globals和locals中去掉os并不能起到限制 。而且,os库是python中的标准库,只要有python就一定有os库,用户必然能导入成功 。
那针对这种隐患,有没有办法不让用户导包呢?
# 在globals中将__builtins__设置为None eval("__import__('os').system('whoami')", {"__builtins__": None}) 1212
Output:
Traceback (most recent call last): File "C:/Users/xxx/Desktop/eval_demo.py", line 62, in eval("__import__('os').system('whoami')", {"__builtins__": None}) File "", line 1, in TypeError: 'N.NEType' object is not subscriptable 1234512345
用户自己在eval()函数中导包,是使用__import__()函数实现的 。__import__()函数是python的内建函数,是用于动态导库的函数 。
print(dir(__builtins__)) 11
Output:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'bytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'windowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] 11
推荐阅读
- 陈赫|李铁被调查原因曝光!低估了身价152亿富豪的能量,背后有人保他
- 夜城赋|《夜城赋》首播,角色人设佳,主演演技好,被流量耽误的好剧
- |企业职工教育培训经费列支范围有哪些?
- 禁止燃放烟花爆竹的通告?禁止燃放烟花爆竹内容有哪些?
- 陈道明|《庆余年2》启动!曝肖战李沁被换、陈道明辞演,新人选引热议
- 阿娇|郑钧老婆曝光娱乐圈“五角恋”,阿娇、谢娜、胡可都被卷入
- 身份证放洗衣机里洗了还能用吗?身份证被洗衣机洗过后还能用吗?
- 梁靖康|“美作”梁靖康后援会永关,不需要粉丝言论被爆,网友:是条汉子
- 谢娜|谢娜外出就餐被认出,却拒不承认超幽默,还自称曾被说像林青霞
- 小S|小S黔驴技穷,又来“坑姐”了?前一天还被蔡康永说:你真落寞了