CISCN 2019 web_bilibili
题目地址
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5421&page=3
题目提示
薅羊毛与逻辑漏洞
网站截图
解题过程
先注册试试看。注册成功后尝试购买了一个账号,成功。
浏览一下网页,发现了这样一句话:一定要买到lv6。突然想到之前ik*n买lv6账号爆睿站的事情。大概翻了几页,没看到lv6。检查元素后发现,每个等级对应的图片名称就是
lv
+等级+.png
python脚本伺候.找到第181页有lv6账号
1
2
3
4
5
6
7import requests
url = r'http://220.249.52.133:47045/shop?page='
for page in range(1, 500):
req = requests.get(url + str(page))
if 'lv6.png' in req.text:
print('[+]FOUND!\n[+]At page',page)
break找到一个叫b*sh*的账号.价格真够贵.居然要1145141919,这么臭的价格,真的有买的必要吗?买一下试试,果然操作失败.
发现有一个叫折扣的东西,看一下源代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<div class="jumbotron">
<h1>购物车</h1>
<div class="shopcar_list">
<ul class="list-group">
<li class="list-group-item">b*sh* <img src="/static/img/lv/lv6.png" alt=""/> /
1145141919.0
</li>
<p>优惠券:-20.0%</p>
<p>916113535.2</p>
</ul>
<form action="" method="post">
<input type="hidden" name="_xsrf" value="2|632dee6f|b462f5648dfa4b927eeb9581ad057b17|1596793343"/>
<input type="hidden" name="id" value="1624">
<input type="hidden" name="price" value="1145141919.0">
<input type="hidden" name="discount" value="0.8">
<button class="btn btn-danger" type="submit">结算</button>
</form>
</div>
</div>注意到其中13-15行居然都是input标签,尝试修改.修改价格失败,修改折扣成功.点击结算后显示页面仅允许admin访问.
已经登陆账号,再有身份验证就应该和cookies有关了.查看cookies,有一个JWT.
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准<a href=https://link.jianshu.com?t=https://tools.ietf.org/html/rfc7519r>RFC 7519.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
搜索JWT后找到了相关工具jwt cracker,破解SHA256,得到密钥1Kun
在JWT.io生成新的JWT
修改cookies后刷新。
进入到新的界面,然而按钮点击无效。查看源码。
1 | <div class="ui text container login-wrap-inf"> |
绝了,这题做着做着,还有剧情了。
在网页上检查元素,删掉第14行中的hidden=”hidden”,显示出输入栏
第3行中有一个压缩文件,下载解压后得到了网站的源码。其中有admin.py
1 | import tornado.web |
到这里我不会了,打开admin.py,把里面不认识的函数+漏洞作为关键词挨个搜索了之后,urllib.load()这个函数存在一个反序列化漏洞。按照blog里的仿写一个payload。反序列化漏洞
1 | # 只能使用python2,python3因为不明原因无法正常生成payload |
将输出的payload填进输入栏后即得到flag