CISCN2019 - Web - ikun

CISCN2019 - Web - ikun
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | CISCN 2019 华北赛区 Day1 Web2 |
| 方向 | Web |
| 难度 | 中等 |
| 环境 | 授权靶场(已脱敏) |
考点:逻辑漏洞(薅羊毛)、JWT 伪造、Python pickle 反序列化 RCE。
题目背景:首页是一个 ikun 商城(KunKun 应援团),提示「ikun 们冲,一定要买到 lv6!!!」。目标是买到 LV6 商品,进而进入 admin 后台,最终 RCE 读 flag。
信息收集
定位 LV6 商品
商城分页展示商品,LV6 商品在第 180 页。写爬虫遍历 /shop?page=N,匹配 lv/lv6.png 图标:
1 | import requests |
结果:第 180 页,商品 ID 1624,名称 b*sh*,价格 1145141919.0。
漏洞分析
逻辑漏洞:改 discount 参数薅羊毛
余额只有 1000,而 LV6 价格高达 1145141919.0。购买流程分两步:
- 加入购物车:POST
/shopcar/add,参数_xsrf+id=1624 - 结算:访问
/shopcar获取结算表单,其中有隐藏字段discount=0.8(优惠券 -20%)
关键在 Shop.py 源码的 ShopCarHandler.post:
1 | discount = float(self.get_argument('discount')) # 默认 1 |
后端只校验 0 < discount <= 1,把 discount 改成极小值即可超低价购买:
1 | # POST /shopcar(注意 action="",提交到 /shopcar 而非 /pay) |
购买成功后(余额只扣约 0.011 元),跳转 /b1g_m4mber,提示「该页面,只允许 admin 访问」。
JWT 伪造
登录后 Cookie 中有 JWT(HS256),payload 为 {"username": "xxx"}。爆破密钥得到 1Kun(源码 settings.py 中也确认 jwt_secret = '1Kun')。
用密钥 1Kun 伪造 admin JWT:
1 | header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
完整 JWT(脱敏省略):
1 | eyJhbG…ynjo |
用伪造 JWT 访问 /b1g_m4mber,进入 admin 后台。
Python pickle 反序列化 RCE
admin 后台页面源码中发现源码包下载链接 /static/asd1f654e683wq/www.zip。下载后审计 sshop/views/Admin.py:
1 | class AdminHandler(BaseHandler): |
become 参数经过 urllib.unquote 解码后直接 pickle.loads,结果回显到页面。靶机是 Python 2(urllib.unquote、print str(ex)),需用 protocol 0 格式构造 payload。
利用 __reduce__ 魔术方法执行 eval 读文件:
1 | import pickle |
先探测根目录 str(__import__('os').listdir('/')),确认 flag 在 /flag.txt,最终读得 flag。
利用过程
- 爬虫遍历分页,定位第 180 页 LV6 商品(ID 1624)。
- 加入购物车后结算,把
discount改为0.00000000001,超低价购买 LV6,跳转/b1g_m4mber。 - 爆破 HS256 密钥为
1Kun,伪造 admin JWT 进入后台。 - 下载
www.zip审计出 pickle 反序列化点,构造__reduce__payload 经become提交。 - 先列根目录确认 flag 路径,再 eval 读取
/flag.txt。
完整 EXP
归档 payload(脱敏后重组)。
1 | # 1. 搜索 LV6(第 180 页,ID 1624) |
Python exp:
1 | # -*- coding: utf-8 -*- |
原归档末尾含真实 flag,已脱敏移除。
Flag
脱敏后:flag{xxxx}。原值为 CTF2 格式,经 pickle 反序列化 eval 读取 /flag.txt 得到。
踩坑与总结
- 逻辑漏洞:折扣
discount放在前端,后端仅校验范围0 < discount <= 1,未校验最小值,可薅羊毛。 - JWT 伪造:HS256 弱密钥
1Kun可爆破,伪造 admin 身份实现水平越权。 - Python pickle 反序列化:
pickle.loads处理用户输入,__reduce__可 RCE;靶机 Python 2 必须用 protocol 0。 - 搜索 LV6 用图标名
lv/lv6.png做特征匹配,比价格判断更稳。 - 反序列化结果会回显到页面,先
listdir('/')探测 flag 路径再读文件更可靠。









