2020哔哩哔哩网安挑战赛一般人视角
BiliBili 第一届撞字典撞地址撞参数比脑洞比熬夜网安大赛完满落幕撒花鼓掌

先放一下活动的链接,还有那个活动的入口(虽然活动已经结束,靶机已经关闭,但是还是放一下)
那么现在,故事正式开始

首先呢,我知道这个事的时候已经比较晚了,因为在赶制物理实验竞赛评比用的视频,大概到晚上才问别人这是有什么活动,然后正式进入赛道
第一、二题
首先呢,打开网页先查看源码,一眼扫过去就有两个$.ajax,然后仔细一看一个给到了隐藏的input里面,一个显示出来了。input里面是{flag1:ca5e7db3-b2f5f737-d1097b41-084239b5},显示出来的是说要用bilibili Security Browser访问。先在提交页面试了下题目一,直接输入那四串32位的串,+10分,有搞头!然后什么浏览器什么的肯定是不存在的,那么简单了,直接上UA插件,我浏览器上刚好有User-Agent Switcher for Chrome,直接添加一项叫那个名的,然后刷新,{flag2:717430cd-1d8dcc44-bb9c263f-fd7bf273}。有感觉了!
第三题
提示要登录,试了下 ' or '1'='1 和 " or "1"="1 ,很好,没动静。跑词典什么的,姿势不优雅,所以看了下群,嗯,很好,有人说了,是admin和bilibili,幸好没跑词典,词典哪会有bilibili这么个词,拿到了(flag3:7b6efa6f-d26dc34f-025bee64-ac763539}
第四题
超级管理员才能看到……额,这连个输入框都没有就认定我不是超级管理员?凭啥!所以F12大法然后点Network刷新一下,看到GET了一个/api/ctf/4,然后它认定我不是超级管理员,那凭啥啊,所以点击这个请求仔细端详这个请求头(Request Headers)。很好,只有两个Cookie,一个是自己的session,另一个是role=ee11cbb19052e40b07aac0ca060c23ee。小学英语告诉我role是角色的意思,那么感觉它应该是靠这个判断的,那后面这串是什么呢,先猜是md5,去百度md5解密,输入,得到是user。那么看来它就是靠这个判断的了,接下来要猜测是superadmin, root, admin, administrator还是什么。猜单词什么的不优雅,群里看了下,是Administrator,竟然大写首字母,太过分了,输入计算md5,然后在F12>Application>Cookies里面修改cookie,{flag4:711245bd-e9fcf6ca-e53e32e3-8fa49cbe}
第五题
它URL有个参数,是uid,看起来要遍历uid了,这个简单我喜欢,F12查看,看到以下代码
$.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("这里没有你想要的答案~")
}
}
})
再观察一下,它还检查你URL的uid是否为空,如果空还会给一个默认值100336889,真棒,连遍历起点都有了,直接复制它原来那段代码,魔改一下,F12输入到控制台运行
var run=1
var f=function(uid)
{
$.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("这里没有你想要的答案~")
run&&f(uid+1)
}
}
})
}
f(100336889)
很快,停了下来,100336921,得到{flag5:d161f74a-7c68dc16-4a71eb63-a9709ccc}

第六题?第十题。
出现了一个博客,先试着输入了花里胡哨的一堆引号,啥都没发生……啊这,瞬间脑子宕机。不过呢,作为一名合格的学生,能够百度那是必须的,这一搜索没想到在github找到了一个interesting-1024/end,然后一看,好家伙,这里还藏一道题

看了下,要intval($_GET['id'])为1,同时is_numeric($_GET['id'])为假,好家伙,要一个字符串转数字输出1同时还不能是数字的东西,一通百度,给intval传一个数组就行。这段代码直接复制到我服务器上,试了下id[]=就行。然后猜url路径?这不优雅,这GitHub下面的issue翻了一下,url=./flag.txt,然后然后然后,它竟然给我返回了一张图片???我人直接傻了

直接懒得研究了,群里问了下,说在文件末尾,好家伙


第八题
接下来没思路了,毕竟那个第六题看起来除了能把那些点全抓住(又疯了一个)意外没的弄了。那么……扫描端口?这不优雅,让我到github看看都有谁扫描过,嗯,果然有

再往下翻翻,嗯,不错

{flag8:d436b982-2b81aa54-49a8d2db-87ab951a}
小插曲
翻了翻github发现,第十题我绕过了很多东西,首先是第六题的时候,应该拿词典跑跑路径,然后发现test.php,它返回一些[]{}!+构成的字符串,想都不想先放F12控制台看看是什么

是字符串。程序员最多的地方?stackoverflowgithub。然后搜索bilibili1024havefun找到那个end,然后做出第十题,我一个百度就绕过了这些
小插曲2
然后我就试着在我的网站上写一个用js操纵浏览器获取这些flag的,还不错(也许后面会贴出来这个代码)
第六题
在看第十题的时候就看到有人发了一个聊天截图,是在问大佬第六题怎么解得,大佬回答“在一个很傻X的地方”,大佬!别骂了别骂了!你说的“傻X的地方”我找不到啊,看来我更傻X啊!然后有人说Referer注入,然后我上晚自习去了,等下晚自习来了段python

然后又有了题目源码


然后我把那个python代码改了改

{flag6:a2b0883c-ffbb8d17-9a3bbf1c-ed600c80}
第七题
之前看到有个/api/images?file=频繁出现,而且伴随着一个不用这个API的注释,感觉可以搞,但是(省略若干字)发现有人撞出了路径/api/images?file=../../../flag7.txt。{flag7:c91a34bb-c8389bc5-6abdfcd7-e2f1648b}
第九题
没做出来,反正大家都没做出来,从GitHub上看,很多人都发现了file=../../../secret.txt也有返回,应该是第九题

大家也都知道这是base64,但是解出来还是乱码,终于27日15:16,有人搞出来了,我在这把他的抄出来吧(链接:https://github.com/interesting-1024/end/issues/315)
首先要通过文件包含获取 md5(SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw==).jpg ,即ae10c97f6de1129abb00b5c961394336.jpg。 平台已经关闭无法获取,根据q群截图得知,然后aes_key就在该文件里


from Crypto.Cipher import AES
aes = AES.new('aes_key'+'\x00'*9, AES.MODE_ECB)
s='SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw=='.decode('base64').decode('base64')
print aes.decrypt(s)
flag9-8b522546-e52d83b8-5682e05c-c8cb237c

总结一下吧,这个其实还蛮好玩的,大家凑一起讨论这个还是蛮快乐的,自己动手搞出来的时候也很有成就感,只是不知明年还有没有这个