HacKerQWQ的博客空间

python内置模块的导入及覆盖知识

Word count: 459Reading time: 1 min
2021/09/05 Share

python内置模块的导入

导入模块的方式

import模块的几种方式

1、import 模块名

2、from 模块名 import 方法名

3、from 模块名 import *

4、import 模块名 as 别名

5、from 模块名 import 方法名 as 别名

官网还提供了__import__importlib.import_module两种方法

导入模块的流程

官网描述如下

image-20210905213331292

简单来说就是当导入操作发生的时候,python会到sys.modules里面寻找是否已经导入过了,如果没有导入过才会按照sys.path的路径来寻找要导入的模块

sys.modules中存的是已经导入过的模块,内置模块在程序运行开始时就已经导入

image-20210905213503352

  • 需要注意的是sys.modules中的键一旦删除,后面的导入操作都不起作用
  • sys.modules中的键删除了,但是如果其他对象还有引用该模块的话,该模块还是能使用的

sys.path中存的是当python开始搜索模块是搜索的路径,sys.path包含以下几个路径

  • 输入脚本的当前目录;
  • PYTHONPATH环境变量;
  • python安装时的系统目录;

image-20210905213603017

内置模块的覆盖导致代码执行

根据python导入模块的机制,可以发现,如果可以修改了sys.path然后再导入我们的同名恶意模块,就可以实现恶意代码执行

  1. 修改sys.path

    1. 直接添加

      1
      2
      sys.path.insert(0,r"C:\\Users\\HackerQWQ\\Desktop\\test")
      sys.path.append("/tmp/test")
    2. 修改PYTHONPATH环境变量

      1
      2
      3
      4
      5
      6
      vim ~/.bashrc

      #添加
      export PYTHONPATH=$PYTHONPATH:/root/ws
      #生效
      source ~/.bashrc
    3. python2的话在/usr/lib/python2.7/sites-packages下添加.pth文件

      1
      /tmp/test
  2. importlib.reload模块

  3. 执行恶意模块的命令

例子:

1
2
3
4
5
6
7
8
import sys
import os
import importlib


sys.path.insert(0,r"C:\\Users\\HackerQWQ\\Desktop\\test")
importlib.reload(os)
print(os.system("whoami"))

运行结果

image-20210905215003571

CATALOG
  1. 1. python内置模块的导入
    1. 1.1. 导入模块的方式
    2. 1.2. 导入模块的流程
  2. 2. 内置模块的覆盖导致代码执行