写在前面 1024,一年一度的程序员节。你好,世界!你好,程序员! (但是 2 0 2 0 - 1 0 2 4 … hhh 就在10.24的0点,Bilibili为大家献上了一份大礼:Bilibili_CTF_2020 经过了艰苦卓绝(~并不 的奋战,我终于拿到了70 of 100 的分数(平 均 水 平 接下来带来这7道题的解析,希望能够成为对Ctf新手的指引吧守护世界上最好的睿叔!(笑
Question_ID_1 页面的背后是什么? 题目地址:http://45.113.201.36/index.html
解析 顾名思义,页面的背后就是源代码啦~ F12检查元素,得到第一题的源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $.ajax({ url: "api/admin", type: "get", success:function (data) { //console.log(data); if (data.code == 200){ // 如果有值:前端跳转 var input = document.getElementById("flag1"); input.value = String(data.data); } else { // 如果没值 $('#flag1').html("接口异常,请稍后再试~"); } } })
根据提示修改url为http://45.113.201.36/api/admin
,页面返回{"code":200,"data":"9eaf84d8-0336b140-23185a95-13d5825f","msg":""}
在依据代码逻辑,我们确定Flag1为9eaf84d8-0336b140-23185a95-13d5825f
Question_ID_2 真正的秘密只有特殊的设备才能看到 题目地址:http://45.113.201.36/index.html
解析 诶?特殊的设备? 还是老老实实检查元素吧~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $.ajax({ url: "api/ctf/2", type: "get", success:function (data) { //console.log(data); if (data.code == 200){ // 如果有值:前端跳转 $('#flag2').html("flag2: " + data.data); } else { // 如果没值 $('#flag2').html("需要使用bilibili Security Browser浏览器访问~"); } } })
可是,需要使用bilibili Security Browser浏览器访问~
又是什么意思呢? 对了!我们可以修改UA标识!! F12检查元素,模拟设备,添加自定义设备! 我们加入一个名为bilibili Security Browser的新设备,刷新页面发现并没有得出Flag 索性把所有涉及设备的参数设置为bilibili Security Browser,F5刷新后,就得到了Flag~ Flag2:be74383e-0b87bbde-40c0c5c4-da62eec3
Question_ID_3 密码是啥? 题目地址:http://45.113.201.36/login.html
解析 F12康康代码逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 //falg 3 $("#submit").click(function(){ $.ajax({ url: "api/ctf/3", type: "post", contentType: "application/json", dataType:"json", data: JSON.stringify({ username: $("#name").val(), passwd: $("#subject").val(), }), success:function (data) { if (data.code == 200){ alert("flag is: " + data.data); } else { alert("用户名或密码错误~"); } } }) });
密码是什么呢?首先考虑密码爆破! 跑完了字典,但是密码并没有试出来…… 简单想想,用户名应该就是admin没得跑,那么密码是什么呢? 最终猜测得到bilibili = = (CTF× 猜 灯 谜√
Flag3:3f06bf77-e57dad87-a669c72b-4d8b296b
Question_ID_4 对不起,权限不足~ 题目地址:http://45.113.201.36/superadmin.html
解析 F12!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $.ajax({ url: "api/ctf/4", type: "get", success:function (data) { console.log(data); if (data.code == 200){ // 如果有值:前端跳转 $('#flag').html("欢迎超级管理员登陆~答案是 : {{ " + data.data + " }}".toLowerCase() ) } else { // 如果没值 $('#flag').html("有些秘密只有超级管理员才能看见哦~") } } })
好家伙,我直接懵逼.jpg 打开Fiddler抓个包~ 查看返回包的Cookie时候,发现了有意思的东西:Cookie: role=ee11cbb19052e40b07aac0ca060c23ee; session=eyJ1aWQiOiIzNzIwODMyMSJ9.X5Qnkw.1NWStBUpUlAWQhYOM9av9W_qEWA
这个role值就很耐人寻味呀~似乎是一个加密后的字符串? 尝试解码,初步确定是MD5加密后的结果,且解密为admin字符串 那么思路就应该是替换Cookie的字段值了。将superadmin采用md5加密,利用EditThisCookie插件修改role值,居然不对! 猜来猜去,administrator,Superadmin,SuperAdmin…… 最终正确答案为Administrator【md5:7b7bc2512ee1fedcd76bdc68926d4f7b】 = = 万万没想到啊! 修改Cookie后刷新页面,就会返回正确的Flag啦! Flag5:126fb903-b39dfd0d-0bf68925-219cd931
Question_ID_5 别人的秘密 题目地址:http://45.113.201.36/user.html
解析 并看不懂= =,管他的,F12!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $(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("这里没有你想要的答案~") } } }) });
原来如此!遍历!遍历!! 用Get方法,以http://45.113.201.36/api/ctf/5?uid=100336889
为基准,uid++向上遍历! 遍历到http://45.113.201.36/api/ctf/5?uid=100336913
的时候,服务端返回了code:200!{"code":200,"data":"314ebf97-6bc0234f-b906e013-52b47f23","msg":""}
(果然是“别人的秘密”呀
那么,Flag5:314ebf97-6bc0234f-b906e013-52b47f23
Question_ID_6 结束亦是开始 题目地址:http://45.113.201.36/blog/single.php?id=1
解析 终于我们进入了动态页面的世界~ 扫描!扫描! 我们得到了两个页面:end.php和test.php end.php就和他的名字一样,空白的页面,和一句你想要的不在这儿~ 而test.php就有趣的多了:页面返回内容如下
内容(建议跳过 1 2 3 4 5 6 [][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+([]+{})[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+([][[]]+[])[+[]]+([][[]]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(![]+[])[!+[]+!![]+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+([]+[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][([]+{})[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]]+(![]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+{})[!+[]+!![]+! ………(太长啦~ +!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()(([]+{})[+[]])[+[]]+(!+[]+!![]+[])+(!+[]+!![]+[]))+([]+{})[!+[]+!![]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[!+[]+!![]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+(+!![][]]]((!![]+[])[+!![]]+([][[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!+[]+!![]]+([]+{})[+!![]]+([]+{})[!+[]+!![]+!![]+!![]+!![]]+(+{}+[])[+!![]]+(!![]+[])[+[]]+([][[]]+[])[!+[]+!![]+!![]+!![]+!![]]+([]+{})[+!![]]+([][[]]+[])[+!![]])())[!+[]+!![]+!![]]+([][[]]+[])[!+[]+!![]+!![]])()(([]+{})[+[]])[+[]]+(!+[]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]))
很明显的jsfuck加密方法,最初被黑客用于网页注入~ 在Chrome浏览器粘贴运行可以直接解码 结果为:
1 2 3 "var str1 = "\u7a0b\u5e8f\u5458\u6700\u591a\u7684\u5730\u65b9"; var str2 = "bilibili1024havefun"; console.log()"
str1的内容很容易看出是Unicode字符,经转化得到程序员最多的地方 果断打开最大的同性交友网站 Github!搜索bilibili1024havefun找到对应的Repository 拿到真·end.php的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?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 "你想要的不在这儿~"; } ?>
传参id[]=1满足第一个条件,按照前面题目的格式api/ctf/x,不难猜出有api/ctf/6/flag.txt 考虑到这玩意也不是个flag,又想到图片隐写~于是另存为图片,打开就是flag啦 于是得到了Flag10:2ebd3b08-47ffc478-b49a5f9d-f6099d65
(??《关于我做第六题却得到了第十题Flag的事》
Question_ID_7 接下来的旅程,需要少年自己去探索啦~ 题目地址:NULL
解析 404
Question_ID_8 接下来的旅程,需要少年自己去探索啦~ 题目地址:NULL
解析 在NodeJS框架下解 需要库:redis 阶梯代码如下
1 2 3 4 5 6 7 8 9 10 11 var redis = require('redis'), RDS_PORT = 6379, RDS_HOST = '120.92.151.189', RDS_OPTS = {}, client = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS); client.on('connect', function () { client.hgetall("flag8", (e, r) => { console.dir(r); }) });
喜闻乐见的是,全国的带佬们都在用扫描,不排除还有爆破从而达成人肉DDOS的hhh 总而言之,服务器在挂的边缘疯狂试探,我愿称之为服务器的挂&不挂二象性 多试几次~
返回结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag1" "3b96173a-b3df4cdd-22d4c15f-261e7309" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag2" "bd871042-1e09a130-3ddd4faa-cebdb048" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag3" "c7f7a7c2-28b7f895-5432152b-6410e042" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag4" "d338e3c8-93215105-258d79ba-b364e59c" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag5" "612d1886-044898af-6c1e9dba-b58ad075" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag6" "8aa6f15d-65e37c9b-78c2bc37-00ed5aee" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag7" "b78ce2aa-10d03327-f2035f4e-55c17689" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag8" "d436b982-2b81aa54-49a8d2db-87ab951a" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag9" "b3238659-b81512e6-3a307c74-9877ecc5" [root@demo ~]# redis-cli -h 120.92.151.189 -p 6379 -r 1 get "flag10" "e5653416-595b3d0c-4c2a57ee-c026350e"
我们得到了Flag8:d436b982-2b81aa54-49a8d2db-87ab951a
Question_ID_9 接下来的旅程,需要少年自己去探索啦~ 题目地址:NULL
解析 404
Question_ID_10 接下来的旅程,需要少年自己去探索啦~ 题目地址:NULL
解析 404
总结 6、7、9题截止目前还没有解出来 (史称679事件 我还是太菜了啊TAT 总之Bilibili_2020_10_24_CTF的题目就做到这里了,虽然都是Web方向的题,但是还是存在着很多运气的成分Administrator /笑 对新手还是蛮友好的,前5题还是可以学到很多东西,特别是Web题里面的一些基础知识~