首页 > 编程知识 正文

python爬虫模块,python反序列化漏洞

时间:2023-05-06 01:41:36 阅读:108954 作者:4595

python反序列化漏洞使用pickle库序列化和反序列化对象操作json反序列化

importjsondict={ ' admin ' : ' 123 ' } JSON_info=JSON.dumps (dict ) print ) str(type ) JSON _ info ) JSON )

importpickleclasstest 3360 name=' admin ' passwd=' 123 ' test=test (print (pickle.dumps ) test ) ) b(x80 () ) x03c__main__nTestnqx00 )x81qx01.'print(pickle.loads ) byte ) )执行上述代码时,json会将词典对象转换为

2 .有关魔术的详细信息,请参阅https://docs.python.org/zh-cn/3/library/pickle.html

__reduce__方法通常是高级接口,使用更低的接口也可以实现命令执行

import os,pickleclasstest(object ) : def _ _ reduce _ (self ) :return(OS.system,(ipconfig ',) ) ) )

也就是说,如果pickle.loads的变量可以控制的话,就存在反序列化的脆弱性

此外,将魔术方法重命名为setstate或getstate等也可以获得相同的效果

3.PVM程序编译成字节码后,加载到一个通常称为虚拟机的东西中执行,Python的虚拟机称为PVM(pythonvirtualmachine )。 实际上,PVM是反复执行) for循环这样的字节码指令,操作系统

PVM由以下三个部分组成。

指令处理器

从流中读取opcode和参数,并对其进行解释处理。 重复此动作,直到遇到名为.的结束符。

最终保留在堆栈顶部的值作为反序列化对象返回。

堆栈

由Python的list实现,用于临时存储数据、参数和对象。

memo

通过Python的dict实现,为PVM的整个生命周期提供存储

4.pickletools可通过pickletools对序列化生成的字节码进行反汇编操作,反汇编的结果为PVM上的字节码指令

关于pickle tools:https://docs.python.org/zh-cn/3/library/pickle tools.html

这就是上述代码反汇编的结果

以下分析指令执行步骤

字符串的第一个字节是x80。 此操作符是在版本2中添加的。 机器看到这个操作符,马上又去字符串读取一个字节,得到x03。 解释为“这是根据第3号协议序列化的字符串”,此操作结束。

机器将下一个字符作为操作符c取出。 该操作符(称为GLOBAL操作符)规定连续读取两个字符串,n并将其拆分,然后依次发送到堆栈。 这里取nt和system。

接下来,遇到p命令,将栈顶保存在备忘录中索引为字符串arg,同时遇到0命令,进行栈操作

,因为这里需要传递参数,所以包含r命令,可以在堆栈上对arg tuple APP应用程序进行调用

接下来结束这个字节码

rce import os、pickle和pickletoolsclassstudent (: def _ init _ (self ) : self.name=' 123 ' x03c _ _ (self ) 33333: SF.self )

命令已成功执行。 字节流中没有r脚本

6.numpy.load导致反序列化漏洞的示例: numpy.load ()首先尝试以numpy自己的数据格式导入; 如果失败,请尝试以pickle格式导入。 因此,numpy.load ()也可以诱发pickle的反序列化漏洞

导入格式; 如果失败,请尝试以pickle格式导入。 因此,numpy.load ()也可以诱发pickle的反序列化漏洞

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。