ctf python大法好_【技术分享】记CTF比赛中发现的Python反序列化漏洞

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

写在前面的话

在前几天,我有幸参加了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 

# # 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=/

test.yaml is valid YAML

你可能感兴趣的:(ctf,python大法好)