python内置模块的导入
导入模块的方式
import模块的几种方式
1、import 模块名
2、from 模块名 import 方法名
3、from 模块名 import *
4、import 模块名 as 别名
5、from 模块名 import 方法名 as 别名
官网还提供了__import__
和importlib.import_module
两种方法
导入模块的流程
官网描述如下
简单来说就是当导入操作发生的时候,python会到sys.modules里面寻找是否已经导入过了,如果没有导入过才会按照sys.path
的路径来寻找要导入的模块
sys.modules中存的是已经导入过的模块,内置模块在程序运行开始时就已经导入
- 需要注意的是
sys.modules
中的键一旦删除,后面的导入操作都不起作用 sys.modules
中的键删除了,但是如果其他对象还有引用该模块的话,该模块还是能使用的
sys.path中存的是当python开始搜索模块是搜索的路径,sys.path包含以下几个路径
- 输入脚本的当前目录;
- PYTHONPATH环境变量;
- python安装时的系统目录;
内置模块的覆盖导致代码执行
根据python导入模块的机制,可以发现,如果可以修改了sys.path然后再导入我们的同名恶意模块,就可以实现恶意代码执行
修改sys.path
直接添加
1
2sys.path.insert(0,r"C:\\Users\\HackerQWQ\\Desktop\\test")
sys.path.append("/tmp/test")修改PYTHONPATH环境变量
1
2
3
4
5
6vim ~/.bashrc
#添加
export PYTHONPATH=$PYTHONPATH:/root/ws
#生效
source ~/.bashrcpython2的话在/usr/lib/python2.7/sites-packages下添加
.pth
文件1
/tmp/test
importlib.reload
模块执行恶意模块的命令
例子:
1 | import sys |
运行结果